热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

Sqoop2从MySQL导入数据到HadoopHDFS

前言ApacheSqoop(TM)isatooldesignedforefficientlytransferringbulkdatabetweenApache

前言

Apache Sqoop(TM) is a tool designed for efficiently transferring bulk data between Apache Hadoop and structured datastores such as relational databases.
Sqoop是一个在Hadoop与关系数据库之间进行高效传输大量数据的工具。也即是可进行导入和导出操作。
翻译的不太好见谅哈。
而Sqoop2是最新版本,但并不兼容Sqoop1。Sqoop2相比之前的版本添加了很多新的东西。具体的可参看官方文档,这里不过多介绍了。
对了,Sqoop2还可以在非关系数据库之间进行导入和导出,如:HBase等

环境
  • OS Debian 8.7
  • Hadoop 2.6.5
  • Sqoop 1.99.7
  • MySQL 5.7.17

这里除了Hadoop和Sqoop版本需要注意一下,其他的都差不多就行。

配置

关于Hadoop的集群基本配置,我会在另外一篇文章再介绍。这里只说下跟Sqoop2有关的配置。

Hadoop相关配置

因为sqoop访问Hadoop的MapReduce使用的是代理的方式,必须在Hadoop中配置所接受的proxy用户和组。
编辑hadoop-2.6.5/etc/hadoop/core-site.xml文件。
在里面添加如下内容:

      
<property>
<name>hadoop.proxyuser.hadoop.hostsname>
<value>*value>
property>
<property>
<name>hadoop.proxyuser.hadoop.groupsname>
<value>*value>
property>

其中hadoop.proxyuser.hadoop.hosts(groups)的格式应该是:hadoop.proxyuser.${SYSTEM_USER}.hosts表示运行hadoop的系统用户名,这里我就是使用hadoop用户运行的,所以就这样配置。

Sqoop2相关配置

  • 修改sqoop classpath配置,编辑sqoop-1.99.7-bin-hadoop200/bin/sqoop.sh文件
    找到sqoop_server_classpath_set函数,修改内容如下:
function sqoop_server_classpath_set {

#HADOOP_COMMON_HOME=${HADOOP_COMMON_HOME:-${HADOOP_HOME}/share/hadoop/common}
#HADOOP_HDFS_HOME=${HADOOP_HDFS_HOME:-${HADOOP_HOME}/share/hadoop/hdfs}
#HADOOP_MAPRED_HOME=${HADOOP_MAPRED_HOME:-${HADOOP_HOME}/share/hadoop/mapreduce}
#HADOOP_YARN_HOME=${HADOOP_YARN_HOME:-${HADOOP_HOME}/share/hadoop/yarn}
HADOOP_COMMON_HOME=${HADOOP_HOME}/share/hadoop/common
HADOOP_HDFS_HOME=${HADOOP_HOME}/share/hadoop/hdfs
HADOOP_MAPRED_HOME=${HADOOP_HOME}/share/hadoop/mapreduce
HADOOP_YARN_HOME=${HADOOP_HOME}/share/hadoop/yarn

就是改一些环境变量的配置,在这之前需要先配置好HADOOP_HOME的环境变量,也即是hadoop的解压安装目录。

  • 继续修改配置文件:sqoop-1.99.7-bin-hadoop200/conf/sqoop.properties
    修改以下属性:
    org.apache.sqoop.submission.engine.mapreduce.configuration.directory=/home/hadoop/hadoop-2.6.5/etc/hadoop
    这个值就是为hadoop的配置目录。
    打开以下配置:
org.apache.sqoop.security.authentication.type=SIMPLE
org.apache.sqoop.security.authentication.handler=org.apache.sqoop.security.authentication.SimpleAuthenticationHandler
org.apache.sqoop.security.authentication.anonymous=true

这里只简单的配置一下,可根据需求进行更多的配置。

  • 验证配置是否有效
    sqoop-1.99.7-bin-hadoop200/bin/sqoop2-tool verify
    当出现以下语句时,就表示成功了,可以开始运行。
Verification was successful.
  • 添加MySQL驱动
    这篇主要是从MySQL数据库导入数据,所以需要添加MySQL官方的JDBC驱动。
    从官网下载:https://dev.mysql.com/get/Downloads/Connector-J/mysql-connector-java-5.1.41.zip
    解压下其中的jar包文件,将其放到Sqoopserver/libshell/lib目录下。

好了,基本配置就完成。

运行
  • 首先需要先运行Hadoop服务,进入hadoop-2.6.5/sbin/。启动dfsyarn
$ ./start-dfs.sh 
$ ./start-yarn.sh
  • 启动sqoop2服务,进入sqoop-1.99.7-bin-hadoop200/bin/
$ ./sqoop.sh server start
  • 检查启动是否成功
    运行jps命令:
6980 Jps
18020 ResourceManager
5813 SqoopJettyServer
17785 SecondaryNameNode
17550 NameNode

当都出现以上进程时就表示启动成功了。

导入

Sqoop2相比Sqoop1不仅有命令行工具,还可以通过Java等编程接口进行操作。这里为了演示方便,只用命令行的形式进行操作了。
进入sqoop-1.99.7-bin-hadoop200/bin目录,执行以下命令进入sqoop2命令行交互界面:

$ ./sqoop2-shell

Tips:当然添加到全局PATH环境变量中,更方便。

连接服务端,配置参数

sqoop:000> set server --host 127.0.0.1 --port 12000 --webapp sqoop

运行命令查看客户端和服务端的版本信息,确保已正确连接成功了:

sqoop:000> show version -all

sqoop2导入数据需要配置两条链接的,一条链接到数据库,一条链接到目的地(HDFS)。
而每一条链接都是要基于一个Connector的。
我们先查看一下,sqoop服务中已有的Connector

sqoop:000> show connector

connector

可以看到默认就已经有支持jdbchdfs的connector了。

  • 创建MySQL链接
sqoop:000> create link -connector generic-jdbc-connector

执行以上命令就会进入到一个交互界面了,依次会提示输入以下数据:

Name:标示这个link的字符串,如MySQL
Driver Class:指定jdbc启动时所需要加载的driver类,我们这里使用的是MySQL,那么就是com.mysql.jdbc.Driver

Connection String:就是使用jdbc连接时所需要的url参数了。如:jdbc:mysql://localhost:3306/hadoop,hadoop就是数据库名称。

Username:链接数据库的用户名,也就是mysql客户端传入的-u参数。如:root

Password:链接数据库的用户密码。

FetchSize:这个与jdbc中的fetchSize参数一样。当需要更多行时应该从数据库获取的行数。直接回车了,使用默认值。

entry# 这时候可以手动指定很多JDBC属性的值。本例只覆盖了一个protocol值为tcp:
protocol=tcp

Identifier enclose: 指定SQL中标识符的定界符,也就是说,有的SQL标示符是一个引号:select * from "table_name",这种定界符在MySQL中是会报错的。这个属性默认值就是双引号,所以不能使用回车,必须将之覆盖,可使用空格覆盖了这个值。

最后出现New link was successfully就表示创建成功了。

可以通过show link命令查看刚刚创建的link,如果不想要了也可以通过命令删除这个Link
delete link -name MySQL

  • 创建Hadoop链接Link
    创建命令同上类似,只是指定的connector需要改为hdfs的。
sqoop:000> create link -connector hdfs-connector

然后进入交互界面,这个只提示四个输入:

Name:标示这个link的字符串,如HDFS
URI: 集群URI,这个是在Hadoop中配置的,可找到/etc/hadoop/core-site.xml文件中的fs.defaultFS属性,输入对应的value值即可。
Conf directory: hadoop的配置文件目录,如:/home/hadoop/hadoop-2.6.5/etc/hadoop
entry# 覆写hadoop中的配置值,这里我们不需要覆盖,直接回车即可

返回这个表示已成功创建:New link was successfully

创建传输 Job

链接已经有了,现在就需要创建一个sqoop的Job用于提交到MapReduce框架平台运行了。

sqoop:000> create job -f "link-name1" -t "link-name2"  
  • link-name1表示FROM从哪获取数据的链接,这里就是MySQL了
  • link-name2表示TO导入到哪个位置去,这里就是HDFS了

执行以上命令就会进入到一个交互界面了,依次会提示输入以下数据:

Name: 标示这个job的字符串,如mysqlTOhdfs

Schema name: 数据库的schema,这里使用MySQL也就是数据库的名称了,如:hadoop

Table name: 数据库中的表名

SQL statement: 就是sql查询语句,可选的,直接回车就好

element# 重写数据相关的一些参数,可选,直接回车就好

Partition column: 分割的列,也就是将最终文件分割为多个,默认导入到一个文件。

Partition column nullable: (可选直接回车)

Boundary query: (可选直接回车)

Check column: (可选直接回车)

Last value: (可选直接回车)

Override null value: 覆盖值为空的列 (可选直接回车)
Null value: 覆盖的值为什么 (可选直接回车)

File format: 文件格式,这里选择0,TEXT_FILE

Compression codec: 压缩编码器,这里不压缩,选择0

Custom codec: 自定义的编码器,这里也不需要,直接回车

Output directory: 导入的输出目录,这里需要注意指定存储在HDFS文件系统中的路径,需要指定一个存在的路径,或者存在但路径下是空的,貌似这样才能成功。

Append mode: 用于指定是否是在已存在导出文件的情况下将新数据追加到数据文件中。可选回车

Extractors: 可选,对应 mapreduce 的 job 中 map 的数量。这里直接回车

Loaders: 可选,对应 mapreduce 的 job 中的 reduce 的数量。这里直接回车

element# Classpath配置,如:需要添加任务额外的jar包,这里直接回车

以上有些参数还需要另外进行试验分析,因为官方文档也说的挺少的。。

最后出现:New job was successfully
表示Job创建成功了

启动Job

启动job很简单,使用命令start job -n name
这里就是:

sqoop:000> start job -n mysqlTOhdfs

查看
  • 查看link
    sqoop:000> show link

  • 查看connector
    sqoop:000> show connector

  • 查看job
    sqoop:000> show job

  • 查看job进度
    sqoop:000> status job -n mysqlTOhdfs

  • 查看导入后的数据
    $ hadoop fs -ls sqoop
    这个sqoop目录必须要先创建,之后才能导入。

问题解析
  • sqoop2 shell操作总是提示如下警告信息:
0    [main] WARN  org.apache.hadoop.util.NativeCodeLoader  - Unable to load native-hadoop library for your platform... using builtin-java classes where applicable

在系统的/etc/profile或者hadoop用户的~/.bashrc中添加以下环境变量即可:

export LD_LIBRARY_PATH=$HADOOP_HOME/lib/native:$LD_LIBRARY_PATH
或者添加下面的这个也行(没试过)
export HADOOP_COMMON_LIB_NATIVE_DIR=$HADOOP_HOME/lib/native
export HADOOP_OPTS="-Djava.library.path=$HADOOP_HOME/lib/native"

后记

断断续续折腾这个也有好几天了,当然都是晚上下班回来搞的。趁着周末又花了半天的时间,终于是搞定了。在这里留个笔记吧。

参考资料:
http://blog.csdn.net/u012842205/article/details/52346595
https://sqoop.apache.org/docs/1.99.7/user/Sqoop5MinutesDemo.html


推荐阅读
  • 我们在之前的文章中已经初步介绍了Cloudera。hadoop基础----hadoop实战(零)-----hadoop的平台版本选择从版本选择这篇文章中我们了解到除了hadoop官方版本外很多 ... [详细]
  • 一、Hadoop来历Hadoop的思想来源于Google在做搜索引擎的时候出现一个很大的问题就是这么多网页我如何才能以最快的速度来搜索到,由于这个问题Google发明 ... [详细]
  • Zookeeper为分布式环境提供灵活的协调基础架构。ZooKeeper框架支持许多当今最好的工业应用程序。我们将在本章中讨论ZooKeeper的一些最显着的应用。雅虎ZooKee ... [详细]
  • Hadoop之Yarn
    目录1Hadoop1.x和Hadoop2.x架构区别2Yarn概述3Yarn基本架构4Yarn工作机制5作业提交全过程6资源调度器7任务的推测执行1Hadoop1.x和Hadoo ... [详细]
  • 介绍怎样在IntellijIdea中通过创建mavenproject配置MapReduce的编程环境。一、软件环境我使用的软件版本号例如以下:IntellijIdea2017.1M ... [详细]
  • mapreduce之后我们想把文件保存下来,变成csv的格式,我们就在store保存语句后面加上USINGPigStorage(‘,’),发现一个问题就是在每一行最末端也自动加了逗 ... [详细]
  • 前言本文隶属于专栏《1000个问题搞定大数据技术体系》,该专栏为笔者原创,引用请注明来源,不足和错误之处请在评论区帮忙指出, ... [详细]
  • 大数据开发笔记(一):HDFS介绍
    ✨大数据开发笔记推荐:大数据开发面试知识点总结_GoAI的博客-CSDN博客_大数据开发面试​本文详细介绍大数据hadoop生态圈各部分知识,包括不限 ... [详细]
  • 怎么快速学好大数据开发?
    新如何学习大数据技术?大数据怎么入门?怎么做大数据分析?数据科学需要学习那些技术?大数据的应用前景等等问题,已成为热门大数据领域热门问题,以下是对新手如何学习大数据技术问题的解答! ... [详细]
  • 本文介绍了Oracle数据库中tnsnames.ora文件的作用和配置方法。tnsnames.ora文件在数据库启动过程中会被读取,用于解析LOCAL_LISTENER,并且与侦听无关。文章还提供了配置LOCAL_LISTENER和1522端口的示例,并展示了listener.ora文件的内容。 ... [详细]
  • 本文介绍了在Mac上搭建php环境后无法使用localhost连接mysql的问题,并通过将localhost替换为127.0.0.1或本机IP解决了该问题。文章解释了localhost和127.0.0.1的区别,指出了使用socket方式连接导致连接失败的原因。此外,还提供了相关链接供读者深入了解。 ... [详细]
  • r2dbc配置多数据源
    R2dbc配置多数据源问题根据官网配置r2dbc连接mysql多数据源所遇到的问题pom配置可以参考官网,不过我这样配置会报错我并没有这样配置将以下内容添加到pom.xml文件d ... [详细]
  • Todayatworksomeonetriedtoconvincemethat:今天在工作中有人试图说服我:{$obj->getTableInfo()}isfine ... [详细]
  • Android日历提醒软件开源项目分享及使用教程
    本文介绍了一款名为Android日历提醒软件的开源项目,作者分享了该项目的代码和使用教程,并提供了GitHub项目地址。文章详细介绍了该软件的主界面风格、日程信息的分类查看功能,以及添加日程提醒和查看详情的界面。同时,作者还提醒了读者在使用过程中可能遇到的Android6.0权限问题,并提供了解决方法。 ... [详细]
  • 毕设做到后半部分,需要实现将用户在一段时间(比如1天)内产生的新数据导入HDFS的功能,这样数据仓库中的数据才能和数据库中的数据同步在新建了一个PyDev项目后,需要如下操作(拣最 ... [详细]
author-avatar
caozhizhao
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有