前言
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包文件,将其放到Sqoop的server/lib
和shell/lib
目录下。
好了,基本配置就完成。
运行
- 首先需要先运行Hadoop服务,进入hadoop-2.6.5/sbin/。启动dfs和yarn。
$ ./start-dfs.sh
$ ./start-yarn.sh
- 启动sqoop2服务,进入sqoop-1.99.7-bin-hadoop200/bin/
$ ./sqoop.sh server start
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> show version -all
配置链接link
sqoop2导入数据需要配置两条链接的,一条链接到数据库,一条链接到目的地(HDFS)。
而每一条链接都是要基于一个Connector的。
我们先查看一下,sqoop服务中已有的Connector。
sqoop:000> show connector
可以看到默认就已经有支持jdbc和hdfs的connector了。
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
以上有些参数还需要另外进行试验分析,因为官方文档也说的挺少的。。
最后出现: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