背景
有时候需要将大数据hive与传统关系型数据传递,这个时候就需要一个同步组件了,sqoop就是这么一个导数据的小工具
Sqoop简介
- Sqoop是一款开源的工具,主要用于在Hadoop(Hive)与传统的数据库(mysql、postgresql...)间进行数据的传递,可以将一个关系型数据库(例如 : MySQL ,Oracle ,Postgres等)中的数据导进到Hadoop的HDFS中,也可以将HDFS的数据导进到关系型数据库中。
- Sqoop项目开始于2009年,最早是作为Hadoop的一个第三方模块存在,后来为了让使用者能够快速部署,也为了让开发人员能够更快速的迭代开发,Sqoop独立成为一个Apache项目。
PS:Sqoop2的最新版本是1.99.7,算是2.x系列了,与1不兼容 ,在CDH安装中,是可以选装Sqoop组件的
Sqoop1.99.7官方安装文档https://sqoop.apache.org/docs/1.99.7/admin/Installation.html
部署与配置
## 这个地址可以找到需要的版本,本文采用的是1.99.7的版本
http://archive.apache.org/dist/sqoop
PS: sqoop-1.99.7-bin-hadoop200.tar.gz是可以直接离线安装部署的版本,其他需要进行编译,比较麻烦
## 在线或者是离线获取离线包
wget http://archive.apache.org/dist/sqoop/1.99.7/sqoop-1.99.7-bin-hadoop200.tar.gz
## 解压文件
tar -zxvf sqoop-1.99.7-bin-hadoop200.tar.gz
1)Hadop相关的依赖
在sqoop官方部署文档中,有提到,如果是已经设置了HADOOP_HOME,会自动使用对应的lib文件(修改的文件在/etc/profile[不同系统有不通的配置方式])
export HADOOP_HOME=
export HADOOP_COMMON_HOME=
export HADOOP_HDFS_HOME=
export HADOOP_MAPRED_HOME=
export HADOOP_YARN_HOME=
如果已经配置$HADOOP_HOME变量,sqoop将会使用以下路径下的配置文件:
$HADOOP_HOME/share/hadoop/common, $HADOOP_HOME/share/hadoop/hdfs, $HADOOP_HOME/share/hadoop/mapreduce and $HADOOP_HOME/share/hadoop/yarn
2)Hadoop相关的配置
需要修改HDOOP_HOME/etc/hadoop路径下的core-site.xml和container-executor.cfg文件
## core-site.xml追加
hadoop.proxyuser.sqoop2.hosts
*
hadoop.proxyuser.sqoop2.groups
*
## container-executor.cfg 追加内容
allowed.system.users=sqoop2
3) 三方依赖包配置
在/etc/profile文件中追加配置SQOOP_SERVER_EXTRA_LIB,在SQOOP_HOME路径下创建extLib,并配置到/etc/profile中
# 三方依赖库
export SQOOP_SERVER_EXTRA_LIB = $SQOOP_HOME/extLib
4)配置server中的配置文件
主要是sqoop_bootstrap.properties sqoop.properties两个文件
## 修改sqoop.properties文件中的 hadoop配置文件的路径
org.apache.sqoop.submission.engine.mapreduce.configuration.directory=/opt/hadoop/hadoop-3.1.3/etc/hadoop
## @LOGDIR@ @BASEDIR@两个位置的变量最好也修改成真实的路径
5) 执行启动命令
正常启动会有正常提示,如果是有异常的话需要根据日志进行排错
## 初始化仓库
sqoop2-tool upgrade
## 校验
sqoop2-tool verify
## 启动服务
sqoop2-server start
## 停止服务
sqoop2-server stop
错误解决
[root@hadoop-master bin]# ./sqoop2-tool upgrade
Setting conf dir: /usr/local/share/demo/sqoop/sqoop-1.99.7-bin-hadoop200/bin/../conf
Sqoop home directory: /usr/local/share/demo/sqoop/sqoop-1.99.7-bin-hadoop200
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.UpgradeTool
0 [main] INFO org.apache.sqoop.core.PropertiesConfigurationProvider - Starting config file poller thread
Tool class org.apache.sqoop.tools.tool.UpgradeTool has finished correctly.
[root@hadoop-slave01 bin]# ./sqoop2-tool verify
Setting conf dir: /usr/local/share/demo/sqoop/sqoop-1.99.7-bin-hadoop200/bin/../conf
Sqoop home directory: /usr/local/share/demo/sqoop/sqoop-1.99.7-bin-hadoop200
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.
6 [main] INFO org.apache.sqoop.core.PropertiesConfigurationProvider - Starting config file poller thread
Exception in thread "main" java.lang.NoSuchMethodError: com.google.common.base.Preconditions.checkArgument(ZLjava/lang/String;Ljava/lang/Object;)V
at org.apache.hadoop.conf.Configuration.set(Configuration.java:1357)
at org.apache.hadoop.conf.Configuration.set(Configuration.java:1338)
at org.apache.sqoop.security.authentication.SimpleAuthenticationHandler.secureLogin(SimpleAuthenticationHandler.java:37)
at org.apache.sqoop.security.AuthenticationManager.initialize(AuthenticationManager.java:98)
at org.apache.sqoop.core.SqoopServer.initialize(SqoopServer.java:57)
at org.apache.sqoop.tools.tool.VerifyTool.runTool(VerifyTool.java:36)
at org.apache.sqoop.tools.ToolRunner.main(ToolRunner.java:72)
错误分析
从具体报错来看是缺少了要使用的方法, 那么这个就和依赖包的版本可能有极大的关系,从包路径来来是google的包,进而猜测是guava低版本依赖造成的
## 用命令找到需要调整的包
## grep -P 正则 (包含guava并以jar结尾或者是./开头包含server、shell、tools.的目录)
[[email protected]]#
ls -lR | grep -P '^(-.*guava.*jar)$|(\.\/[server|shell|tools].*)'
./server:
./server/lib:
-rw-r--r-- 1 root root 1648200 7月 20 2016 guava-11.0.2.jar
./shell:
./shell/lib:
-rw-r--r-- 1 root root 1648200 7月 20 2016 guava-11.0.2.jar
./tools:
./tools/lib:
-rw-r--r-- 1 root root 1648200 7月 20 2016 guava-11.0.2.jar
将对应的路径下的guava包替换成高本版的包,重新启动问题得以解决
## 已经替换成了新的包
[root@hadoop-slave01 sqoop-1.99.7-bin-hadoop200]#
ls -lR | grep -P '^(-.*guava.*jar)$|(\.\/[server|shell|tools].*)'
./server:
./server/lib:
-rw-r--r-- 1 root root 2747878 6月 16 10:34 guava-27.0-jre.jar
./shell:
./shell/lib:
-rw-r--r-- 1 root root 2747878 6月 16 10:34 guava-27.0-jre.jar
./tools:
./tools/lib:
-rw-r--r-- 1 root root 2747878 6月 16 10:19 guava-27.0-jre.jar