Sqoop介绍
Sqoop是一个用来将Hadoop和关系型数据库中的数据相互转移的工具,可以将一个关系型数据库(例如 : MySQL ,Oracle ,Postgres等)中的数据导进到Hadoop的HDFS中,特别是hadoop所使用的HDFS分布式文件系统。作为ASF下的一个开源项目,其一开始也只是一个小工具,当然现在也是,还附带一些库供客户端调用。Sqoop版本又分Sqoop1和Sqoop2,其中Sqoop1目前最高释出版本为1.4.6,Sqoop2最高释出版本为1.99.7,Sqoop1与Sqoop2相互间不兼容,而且Sqoop2目的并不是作为产品,主要是致力于开发。再者,其对Hadoop的支持版本有些特别要求,比如Hadoop1和Hadoop0.x还有Hadoop2.x的兼容性等。在下载时一般要注意其兼容的Hadoop版本(Sqoop官网上我没有看到相关具体的描述,只是通过下载的文件名辨别与Hadoop的兼容性)。
Sqoop进行数据转移时必须依赖于Hadoop的MapReduce作业,所以Hadoop必须在环境中存在,且能被Sqoop访问。
Sqoop 2(对应Hadoop 2)由两部分组成:客户端(client)和服务端(server)。需要在集群的其中某个节点上安装server,该节点的服务端可以作为其他Sqoop客户端的入口点。在服务端的节点上必须安装有Hadoop。客户端可以安装在任意数量的机子上。在装有客户端的机子上不需要安装Hadoop。
Sqoop工作原理如下图:
Sqoop安装配置
安装
确定几大必要条件:
1)Hadoop集群已经安装(Hadoop实战:Hadoop 2.8分布式部署)。
2)Hbase已经安装(Hadoop实战:Hbase分布式集群安装)。
3)Hive已经安装(Hadoop实战:Hive安装配置)。
选择sqoop2的1.99.7版本即可。我直接下的bin版本,这个版本已经编译好了,直接用。当然你也可以下源代码到本地编译安装,确保有Java环境,因为Sqoop用Java编写的。本文直接用的bin版本:sqoop-1.99.7-bin-hadoop200.tar.gz
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
$ tar xvf sqoop-1.99.7-bin-hadoop200.tar.gz -C /usr/local/ $ ln -sv /usr/local/sqoop-1.99.7-bin-hadoop200/ /usr/local/sqoop $ ll /usr/local/sqoop/ total 128 drwxr-xr-x 2 hadoop hadoop 97 Jun 19 08:36 bin -rw-r--r-- 1 hadoop hadoop 93386 Jul 19 2016 CHANGELOG.txt drwxr-xr-x 2 hadoop hadoop 62 Jun 19 08:33 conf drwxr-xr-x 10 hadoop hadoop 4096 Jun 19 08:00 docs drwxr-xr-x 2 hadoop hadoop 79 Jun 19 08:19 extra -rw-r--r-- 1 hadoop hadoop 24356 Jul 19 2016 LICENSE.txt -rw-r--r-- 1 hadoop hadoop 166 Jul 19 2016 NOTICE.txt -rw-r--r-- 1 hadoop hadoop 1610 Jul 19 2016 README.txt drwxr-xr-x 3 hadoop hadoop 16 Jul 19 2016 server drwxr-xr-x 3 hadoop hadoop 16 Jul 19 2016 shell drwxr-xr-x 3 hadoop hadoop 16 Jul 19 2016 tools |
bin:可执行脚本,一般使用sqoop都是通过这个目录中的工具调用,是一些shell或batch脚本。
conf:存放配置文件。
docs:目前不清楚具体是什么,可能是帮助文档,不过一般使用sqoop不会用到。
server:里面只有一个lib目录,存了很多jar文件,是sqoop2的server包。
shell:同理,sqoop2的shell包。
tools:同理,sqoop2的工具包。
然后在文件/etc/profile中设置环境变量SQOOP_HOME。
1 2 3 4 5 6 7 8 9 10 11 12 13 |
$ cat /etc/profile.d/sqoop.sh # Hadoop export HADOOP_HOME=/usr/local/hadoop export HADOOP_COMMON_HOME=$HADOOP_HOME/share/hadoop/common export HADOOP_HDFS_HOME=$HADOOP_HOME/share/hadoop/hdfs export HADOOP_MAPRED_HOME=$HADOOP_HOME/share/hadoop/mapreduce export HADOOP_YARN_HOME=$HADOOP_HOME/share/hadoop/yarn # Sqoop export PATH=$PATH:$SQOOP_HOME/bin export SQOOP_SERVER_EXTRA_LIB=$SQOOP_HOME/extra export CATALINA_BASE=$SQOOP_HOME/server export LOGDIR=$SQOOP_HOME/logs |
这些环境变量,都不能错哦。前面是设置Hadoop的相关环境变量(由于是安装在Hadoop主机上的,需要检查一下这么变量有没有设置,最好不要重复)。然后下面是设置Sqoop的环境变量。
配置第三方jar引用路径
一般我们使用的数据库驱动包都没有随着Sqoop一起出,多半是因版权问题,所以将这些包放置在这个第三方组件下。再在配置一个SQOOP_SERVER_EXTRA_LIB系统变量即可,本例指定路径为$SQOOP_HOME/extra。
我这里直接使用yum安装了mysql-connector-java,然后把MySQL的jdbc驱动复制到sqoop项目的extra目录下。
1 2 3 4 5 6 7 8 9 10 11 12 |
$ yum install mysql-connector-java $ rpm -ql mysql-connector-java /usr/share/doc/mysql-connector-java-5.1.25 /usr/share/doc/mysql-connector-java-5.1.25/CHANGES /usr/share/doc/mysql-connector-java-5.1.25/COPYING /usr/share/doc/mysql-connector-java-5.1.25/docs /usr/share/doc/mysql-connector-java-5.1.25/docs/README.txt /usr/share/doc/mysql-connector-java-5.1.25/docs/connector-j.html /usr/share/doc/mysql-connector-java-5.1.25/docs/connector-j.pdf /usr/share/java/mysql-connector-java.jar /usr/share/maven-fragments/mysql-connector-java /usr/share/maven-poms/JPP-mysql-connector-java.pom |
1 |
$ cp -fr /usr/share/java/mysql-connector-java.jar /usr/local/sqoop/extra/ |
如果想使用新版MySQL的JDBC驱动:直接上MySQL官网下的connection/J即可。
配置Hadoop代理访问
因为sqoop访问Hadoop的MapReduce使用的是代理的方式,必须在Hadoop中配置所接受的proxy用户和组。找到Hadoop的core-site.xml配置文件(本例是$HADOOP_HOME/etc/hadoop/core-site.xml):
1 2 3 4 5 6 7 8 |
<property> <name>hadoop.proxyuser.$SERVER_USER.hosts</name> <value>*</value> </property> <property> <name>hadoop.proxyuser.$SERVER_USER.groups</name> <value>*</value> </property> |
$SERVER_USER是运行Sqoop2 Server的系统用户,本例我使用了hadoop用户运行server,所以将之代替为hadoop。
注意:保证你的用户id大于1000(可用id命令查看),否则作为系统变量运行时,可能需要其他配置,参照官网。
Sqoop服务器配置
主要是配置conf目录下的sqoop.properties和sqoop_bootstrap.properties两个文件
sqoop_bootstrap.properties文件配置config支持类,这里一般使用默认值即可:
1 |
sqoop.config.provider=org.apache.sqoop.core.PropertiesConfigurationProvider |
sqoop.properties文件配置比较多,这里按需要配置,我写下我配置的项,其他都使用默认值:
1 2 3 4 5 |
org.apache.sqoop.submission.engine.mapreduce.configuration.directory=/usr/local/hadoop/etc/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 |
注意:官方文档上只说了配置上面第一项,mapreduce的配置文件路径,但后来运行出现authentication异常,找到sqoop文档描述security部分,发现sqoop2支持hadoop的simple和kerberos两种验证机制。所以配置了一个simple验证,这个异常才消除。
验证配置是否有效
使用bin中的sqoop2-tool工具进行验证:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
$ [hadoop@hadoop-nn ~]$ sqoop2-tool verify Setting conf dir: /usr/local/sqoop/bin/../conf Sqoop home directory: /usr/local/sqoop Sqoop tool executor: Version: 1.99.7 Revision: 435d5e61b922a32d7bce567fe5fb1a9c0d9b1bbb Compiled on Tue Jul 19 16:08:27 PDT 2016 by abefine Running tool: class org.apache.sqoop.tools.tool.VerifyTool 0 [main] INFO org.apache.sqoop.core.SqoopServer - Initializing Sqoop server. 4 [main] INFO org.apache.sqoop.core.PropertiesConfigurationProvider - Starting config file poller thread SLF4J: Class path contains multiple SLF4J bindings. SLF4J: Found binding in [jar:file:/usr/local/hadoop-2.8.0/share/hadoop/common/lib/slf4j-log4j12-1.7.10.jar!/org/slf4j/impl/StaticLoggerBinder.class] SLF4J: Found binding in [jar:file:/usr/local/apache-hive-2.1.1-bin/lib/log4j-slf4j-impl-2.4.1.jar!/org/slf4j/impl/StaticLoggerBinder.class] SLF4J: See http://www.slf4j.org/codes.html#multiple_bindings for an explanation. Verification was successful. Tool class org.apache.sqoop.tools.tool.VerifyTool has finished correctly. |
这个工具也可用于软件升级。若没有什么问题,则可以往下走了。如果验证出现错误:caused by java.lang.ClassNotFoundException: org.apache.hadoop.conf.Configuration,一般就是因为找不到Hadoop相关的jar包导致,如果上面的Hadoop相关的几个环境变量已经配置好了,还报错。可以直接修改/usr/local/sqoop/bin/sqoop.sh中的:
1 2 3 4 |
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} |
可以直接改成对应的绝对路径。安装sqoop-1.99.7报caused by java.lang.ClassNotFoundException: org.apache.hadoop.conf.Configuration
开启服务器
1 |
[hadoop@hadoop-nn ~]$ sqoop2-server start |
sqoop2的运行模式不再是sqoop1的一个小工具,而加入了服务器,这样只要能访问到mapreduce配置文件及其开发包,sqoop服务器部署在哪里都无所谓,而客户端shell是不需要任何配置的。直接用即可。
这时可以通过JDK中的jps工具查看是否已经正确启动起来,正常情况下会有个SqoopJettyServer的进程,这也可以想象,Sqoop server是基于jetty实现的。
1 2 3 4 5 6 7 8 |
[hadoop@hadoop-nn ~]$ jps 16945 Jps 7492 DataNode 7684 SecondaryNameNode 8166 ResourceManager 16905 SqoopJettyServer 7342 NameNode 8286 NodeManager |
可以看到SqoopJettyServer进程,端口12000。
1 2 3 4 |
[hadoop@hadoop-nn ~]$ netstat -nplt | grep 12000 (Not all processes could be identified, non-owned process info will not be shown, you would have to be root to see it all.) tcp6 0 0 :::12000 :::* LISTEN 16905/java |
配置sqoop server参数
1 2 |
sqoop:000> set server --host 10.10.0.186 --port 12000 --webapp sqoop Server is set successfully |
port和host就不用说了,port是默认值;最后一个–webapp官方文档说是指定的sqoop jetty服务器名称,大概是一个自己能识别的用于标示这个服务器的名字吧。
完成后可以验证服务器是否能正确链接上:
1 |
sqoop:000> show version --all |
查看帮助
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
sqoop:000> help For information about Sqoop, visit: http://sqoop.apache.org/ Available commands: :exit (:x ) Exit the shell :history (:H ) Display, manage and recall edit-line history help (\h ) Display this help message set (\st ) Configure various client options and settings show (\sh ) Display various objects and configuration options create (\cr ) Create new object in Sqoop repository delete (\d ) Delete existing object in Sqoop repository update (\up ) Update objects in Sqoop repository clone (\cl ) Create new object based on existing one start (\sta) Start job stop (\stp) Stop job status (\stu) Display status of a job enable (\en ) Enable object in Sqoop repository disable (\di ) Disable object in Sqoop repository grant (\g ) Grant access to roles and assign privileges revoke (\r ) Revoke access from roles and remove privileges For help on a specific command type: help command |
支持tab补全。