Sqoop即SQL to Hadoop,是一个将数据在关系数据库(如 MySQL/Oracle 等)和大数据产品(如 Hadoop/Hive/HBase等)之间导入/导出的有效工具,底层是通过MapReduce作业来完成。它充分利用了MapReduce的并行特点以批处理的方式加快数据的传输,同时也借助MapReduce实现了容错。
目前主要包括两个版本:Sqoop1和Sqoop2,这两个版本不同,是完全不兼容的,版本<=1.4.6的都是Sqoop1,版本>=1.99.2的都是Sqoop2。Sqoop官网:http://sqoop.apache.org/
不借助Sqoop实现数据的导入导出,我们也可以通过自己编写MapReduce来完成,但这样做存在的问题就是手动编写MapReduce比较麻烦,增加工作量,无法复用。
Sqoop 1.x
Sqoop1.x中,仅仅使用了一个Sqoop客户端,它是单用户的、架构部署简单。客户端发送命令到Sqoop,Sqoop转换为MapReduce作业运行在Hadoop集群环境上,从而实现RDBMS和Hadoop之间相互导入导出。Sqoop1.x只一个mapreduce作业,只有map没有reduce。
Sqoop2.x
Sqoop2.x 中,引入了sqoop server集中化管理Connector,支持多种交互方式:命令行、Web UI、Rest API,所有的链接安装在sqoop server上,完善了权限管理机制(可配置管理员、使用者等角色),Connector规范化( 不再包含数据传输,格式转换、与Hive、Hbase交互等功能仅负责数据读写)。Sqoop2.x中的MapReduce作业既有Map也有Reduce。
Sqoop官网:http://sqoop.apache.org/,
笔者下载的Sqoop1的版本为1.4.6
解压安装包
$ tar -zxvf sqoop-1.4.6.bin__hadoop-2.0.4-alpha.tar.gz
$ mv sqoop-1.4.6.bin__hadoop-2.0.4-alpha sqoop1
$ cd sqoop1/conf
$ cp sqoop-env-template.sh sqoop-env.sh
$ vim sqoop-env.sh
修改sqoop-env.sh配置文件,设置HADOOP_COMMON_HOME、HADOOP_MAPRED_HOME、HIVE_HOME这三个属性,如下
export HADOOP_COMMON_HOME=/usr/local/hadoop
export HADOOP_MAPRED_HOME=/usr/local/hadoop
export HIVE_HOME=/home/hadoop/hive
将MySQL的驱动包复制到如下命令
$ cp mysql-connector-java-5.1.38.jar /home/hadoop/sqoop1/lib
$ vim ~/.bashrc
# Sqoop
export SQOOP_HOME=/home/hadoop/sqoop1
export PATH=$PATH:$SQOOP_HOME/bin
$ source ~/.bashrc
sqoop1/bin目录下存放了sqoop1.x的执行脚本,里面也有windows下的执行脚本,windows下的执行脚本我们不需要,执行如下命令删除
$ cd sqoop1/bin
$ rm *.cmd
上图中可以看到有一个sqoop的命令,但是又不知道如何使用,所以输入如下命令来查看帮助
$ sqoop help
笔者在输入sqoop help命令后,报错:
错误: 找不到或无法加载主类 org.apache.sqoop.Sqoop
解决方法:将sqoop1目录下的sqoop-1.4.6.jar拷贝到hadoop的lib目录下
$ cp sqoop-1.4.6.jar $HADOOP_HOME/lib/
拷贝到hadoop的lib目录后,如果还是报错,那么打开sqoop脚本显示指定sqoop-1.4.6.jar文件的所在位置
修改前:
exec ${HADOOP_COMMON_HOME}/bin/hadoop org.apache.sqoop.Sqoop "$@"
修改后:
exec ${HADOOP_COMMON_HOME}/bin/hadoop jar $SQOOP_HOME/sqoop-1.4.5.jar org.apache.sqoop.Sqoop "$@"
输入如下命令,查看当前Sqoop的版本信息
$ sqoop version
每次执行命令都会出现如下的警告信息,笔者是一个强迫症患者,看到这些警告甚是不爽,虽然不会对我们的操作造成任何影响。你可以直接略过。
Warning: /home/hadoop/sqoop2/../hcatalog does not exist! HCatalog jobs will fail.
Please set $HCAT_HOME to the root of your HCatalog installation.
Warning: /home/hadoop/sqoop2/../accumulo does not exist! Accumulo imports will fail.
Please set $ACCUMULO_HOME to the root of your Accumulo installation.
Warning: /home/hadoop/sqoop2/../zookeeper does not exist! Accumulo imports will fail.
Please set $ZOOKEEPER_HOME to the root of your Zookeeper installation.
解决方法:修改Sqoop的文件bin/configure-sqoop,注释掉如下内容
if [ ! -d "${HCAT_HOME}" ]; then
echo "Warning: $HCAT_HOME does not exist! HCatalog jobs will fail."
echo 'Please set $HCAT_HOME to the root of your HCatalog installation.'
fi
if [ ! -d "${ACCUMULO_HOME}" ]; then
echo "Warning: $ACCUMULO_HOME does not exist! Accumulo imports will fail."
echo 'Please set $ACCUMULO_HOME to the root of your Accumulo installation.'
fi
if [ ! -d "${ZOOKEEPER_HOME}" ]; then
echo "Warning: $ZOOKEEPER_HOME does not exist! Accumulo imports will fail."
echo 'Please set $ZOOKEEPER_HOME to the root of your Zookeeper installation.'
fi
查看数据库使用的命令是list-databases,如果不知道怎么使用,可以使用如下命令来查看命令帮助
$ sqoop help list-databases
输入命令查看mysql中的所有数据库(如果想要换行在末尾加上’\’)
$ sqoop list-databases --connect jdbc:mysql://localhost:3306 --username root --password P@ssw0rd
使用sqoop查看mysql中的所有数据库时,出现了两个错误,错误信息及解放方法如下
错误1:
Got exception running Sqoop: java.lang.RuntimeException: Could not load db driver class: com.mysql.jdbc.Driver
解决方法:
1).将mysql的驱动包拷贝到$SQOOP_HOME/lib下
2).检查sqoop的环境变量是否配置成功
错误2:
SQLException: Access denied for user ‘root’@’localhost’ (using password: YES)
原因:mysql没有开启远程访问权限
解决方法:mysql中执行如下命令,开启远程访问权限
GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY 'P@ssw0rd' WITH GRANT OPTION;
$ sqoop list-tables --connect jdbc:mysql://localhost:3306/hive_metadata --username root --password P@ssw0rd
笔者下载的Sqoop2的版本为1.99.5
安装配置参考官网:http://sqoop.apache.org/docs/1.99.5/Installation.html
$ tar -zxvf sqoop-1.99.5-bin-hadoop200.tar.gz
$ mv sqoop-1.99.5-bin-hadoop200 sqoop2
$ cd sqoop2/bin/
bin 目录下存放了sqoop的执行脚本,默认这些执行脚本是没有可执行权限的(可能和版本有关),输入如下目录,来授予可执行权限
$ chmod a+x *
在sqoop的server/conf目录下的catalina.properties文件中配置Hadoop 库的路径,修改common.loader这个参数来包含Hadoop 库的所有目录,输入如下目录进入Hadoop库所在目录
$ cd $HADOOP_HOME/share/hadoop
将上图中所有所有目录下的jar包都添加到common.loader参数中,如下
$ cd sqoop2/server/conf
$ vim catalina.properties
common.loader=${catalina.base}/lib,${catalina.base}/lib/*.jar,${catalina.home}/lib,${catalina.home}/lib/*.jar,${catalina.home}/../lib/*.jar,/usr/local/hadoop/share/hadoop/common/*.jar,/us r/local/hadoop/share/hadoop/common/lib/*.jar,/usr/local/hadoop/share/hadoop/hdfs/*.jar,/usr/local/hadoop/share/hadoop/hdfs/lib/*.jar,/usr/local/hadoop/share/hadoop/httpfs*.jar,/usr/local/ hadoop/share/hadoop/httpfs/../lib/*.jar,/usr/local/hadoop/share/hadoop/mapreduce/*.jar,/usr/local/hadoop/share/hadoop/mapreduce/lib/*.jar,/usr/local/hadoop/share/hadoop/tools/lib/*.jar,/u sr/local/hadoop/share/hadoop/yarn/*.jar,/usr/local/hadoop/share/hadoop/yarn/lib/*.jar
最后,需要安装JDBC驱动,笔者使用的是MySQL,所以将MySQL的JDBC驱动放入server/lib/目录下即可。
$ cp mysql-connector-java-5.1.38.jar $SQOOP2_HOME/server/lib/
服务端的配置文件存放在server/config目录下,修改sqoop.properties中的
org.apache.sqoop.submission.engine.mapreduce.configuration.directory这个属性设置为当前安装Hadoop的配置文件所在目录,比如
org.apache.sqoop.submission.engine.mapreduce.configuration.directory=/usr/local/hadoop/etc/hadoop
因为sqoop访问Hadoop的MapReduce使用的是代理的方式,必须在Hadoop中配置所接受的proxy用户和组,找到Hadoop的core-site.xml配置文件,添加如下内容,重启Hadoop即可。
<property>
<name>hadoop.proxyuser.sqoop2.hostsname>
<value>*value>
property>
<property>
<name>hadoop.proxyuser.sqoop2.groupsname>
<value>*value>
property>
$ vim ~/.bashrc
添加如下内容
# Sqoop
export SQOOP_HOME=/home/hadoop/sqoop2
export PATH=$PATH:$SQOOP_HOME/bin
$ source ~/.bashrc
$ sqoop2-tool verify
如果看到类似如下的信息,恭喜你Sqoop的安装配置已经成功
Verification was successful.
Tool class org.apache.sqoop.tools.tool.VerifyTool has finished correctly.
安装和配置后,可以使用以下命令启动Sqoop服务器
$ sqoop2-server start
sqoop的日志信息默认存放在/home/hadoop/@LOGDIR@目录下的sqoop.log文件中,该目录可在sqoop.properties配置文件中的
org.apache.sqoop.log4j.appender.file.File这个属性中设置,笔者使用的是默认,输入如下命令查看sqoop的日志信息
$ tail -fn200 /home/hadoop/@LOGDIR@/sqoop.log
可以使用以下命令停止服务器
$ sqoop2-server stop
$ sqoop2-shell
如果想要退出客户端,输入命令exit即可。
输入命令help或\h查看sqoop命令使用帮助
输入如下命令,来查看sqoop的版本信息
show version
如果想要查看更多的版本信息,加上参数-a
show version -a
查看所有的服务信息
show server --all
sqoop 客户端启动后,输入如下命令来连接客户端
set server
set有四个参数分别如下
笔者在使用set命令连接sqoop的服务端时都是使用默认参数,默认主机为localhost,端口为12000,默认web应用为sqoop,你也可以指定参数,如下
set server --host localhost --port 12000 --webapp sqoop