sqoop2.x版本小计
来源于 https://zhuanlan.zhihu.com/p/60988746
sqoop虽说只是一个导数据的小工具而已,但是莫名感觉喜欢用啊,不知道为什么感觉在hadoop里面sqoop挺不受重视的,几年才一个大版本,1.99算是2.X版本的,这几天刷刷我sqoop党的存在感,找了一个sqoop1.99.7试用了一下,感觉还不错。
顺手推荐一个笔记小工具typora
1.1 安装
tar -zxvf sqoop-1.99.7-bin-hadoop200.tar.gz -C /usr/local
mv sqoop-1.99.7-bin-hadoop200 sqoop
1.2 sqoop 环境变量设置
.bashrc 中增加以下变量声明:
export SQOOP_HOME=/home/hadoop/sqoop
export PATH=$SQOOP_HOME/bin:$PATH
export CATALINA_HOME=$SQOOP_HOME/server
export LOGDIR=$SQOOP_HOME/logs
1.3 hadoop 参数配置
Sqoop server 需要模拟用户访问集群内外的HDFS和其他资源,所以,需要配置Hadoop通过所谓proxyuser系统显示地允许这种模拟。也就是要在hadoop 目录的etc/hadoop/core-site.xml 中增加下面两个属性。两个value的地方写*或实际用户名均可。
<property>
<name>hadoop.proxyuser.sqoop2.hosts</name>
<value>*</value>
</property>
<property>
<name>hadoop.proxyuser.sqoop2.groups</name>
<value>*</value>
</property>
$SERVER_USER是运行Sqoop2 Server的系统用户,本例我使用了hadoop用户运行server,所以将之代替为hadoop。
1.4 sqoop server 配置
conf/sqoop.properties
mapreduce的配置文件路径
org.apache.sqoop.submission.engine.mapreduce.configuration.directory=$HADOOP_HOME/etc/hadoop // 把$HADOOP_HOME替换为实际i的路径
##### sqoop2支持hadoop的simple>和kerberos两种验证机制,需要配置,否则会报authentication异常
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
同时,把有LOGDIR, BASEDIR引用的均替换为实际的绝对路径,如/home/hadoop/sqoop/logs, /home/hadoop/sqoop
1.5 安装mysql JDBC Driver 到sqoop/server/lib 下
1.6 初始化metadata repository
bin/sqoop2-tool upgrade
1.7 测试
执行 bin/sqoop2-tool verify 将看到如下 successful相关信息。
................
Verification was successful.
Tool class org.apache.sqoop.tools.tool.VerifyTool has finished correctly.
1.8 开启服务器
sqoop2的运行模式不再是sqoop1的一个小工具,而加入了服务器,这样只要能访问到mapreduce配置文件及其开发包,sqoop服务器部署在哪里都无所谓,而客户端shell是不需要任何配置的。直接用即可。
开启服务器:
bin/sqoop2-server start
先更到这 有时间再更
二、客户端使用
由于sqoop是一个交互式命令行工具,使用如下命令打开sqoop的shell:
bin/sqoop2-shell 若成功会开启sqoop的shell命令行提示符:sqoop:000>
(1)配置sqoop server参数
sqoop:000> set server --host http://your.host.com --port 12000 --webapp sqoop port和host就不用说了,port是默认值;最后一个--webapp官方文档说是指定的sqoop jetty服务器名称,大概是一个自己能识别的用于标示这个服务器的名字吧。
完成后可以验证服务器是否能正确链接上:
sqoop:000> show version --all 这个命令能显示shell和server的版本信息,若server版本信息能正确显示,则没问题!能正确链接上。 注意:我在运行这条命令时出现一个警告,说hadoop native library无法加载什么的,这个目前也没有查到相关说法,但验证下来,hadoop2.6中的lib/native只有一些提供给C/C++调用的二进制文件。若没有影响直接忽略吧。望哪位知道的能告诉我。
(2)配置链接到MySQL的链接(link)
MySQL链接使用的是JDBC,这样想来不难理解,必须有对应的驱动文件jar,还得有对应的访问权限,请确保能在server端访问MySQL。参照上一篇博客。
可以先看看connector模板都有哪些:
show connector 这时候会显示各个conector信息,在1.99.7版本以前,每个connector会有一个id,当创建link时,用这个id指定所继承的connector,但在这个版本中没有这个id了,创建link时直接使用connector名称创建,这里我们使用的是generic-jdbc-connector: sqoop:000> create link -connector generic-jdbc-connector 这时候就会出现交互会话,提示你输入各项参数: Name:标示这个link的字符串,可以是一个自己喜欢的名称。
Driver Class:指定jdbc启动时所需要加载的driver类,这个类实现了java.sql.Driver接口。对本文来说,这个值是com.mysql.jdbc.Driver。
Connection String:广为人知的数据库链接字符串,本例为jdbc:mysql://localhost/db_ez,db_ez是本例的数据库名称。
Username:链接数据库的用户名,也就是mysql客户端传入的-u参数。本例是ez。
Password:链接数据库的用户密码。
FetchSize:这个属性并没有在官方文档上描述,我也不知道说的是什么,直接回车了,使用的默认值。
填写完上面几项,将提供一个可以输入JDBC属性的hash,提示符是entry#,这时候可以手动指定很多JDBC属性的值。本例只覆盖了一个protocol值为tcp:
protocol=tcp
再按回车,之后会再定义一下SQL方言。也就是说,各个数据库系统提供商们对SQL语言标准的理解和实现各有不同,于是各有各的一些细微差别。以下属性就是用于指定这些区别的。当然,很坑的是,官方文档上并没有说明这些属性如何填写,连提都没提。
Identifier enclose:指定SQL中标识符的定界符,也就是说,有的SQL标示符是一个引号:select * from "table_name",这种定界符在MySQL中是会报错的。这个属性默认值就是双引号,所以不能使用回车,必须将之覆盖,我使用空格覆盖了这个值。吐槽一下,这个错误我整了一整天才搞明白,官方文档也是坑啊!
至此,就可以完成这个link的创建。命令行提示符也会还原为sqoop:000>。使用以下命令查看是否创建成功:
show link
(3)配置链接到HDFS的link: 同理,使用以下命令,connector指定为HDFS:
sqoop:000> create link -connector hdfs-connector
hdfs的参数只有一个Name和一个HDFS URI,Name同上的MySQL,自己指定一个喜欢的标示符即可。这个url是hadoop中配置hdfs-site.xml中的属性fs.defaultFS的值。本例为hdfs://localhost:9000 回车后没有什么错误就会显示successful信息。
(4)配置传输事务job:
链接都指定了,接下来就要指定Job,用于提交给mapreduce:
sqoop:000> create job -f "link-name1" -t "link-name2" -f指定from,即是数据源位置,-t指定to,即是目的地位置。本例是从MySQL传递数据到HDFS,所以就是from mysql to HDFS。参数值就是在创建链接(link)时指定的Name。
以下是各个属性
Name:一个标示符,自己指定即可。
Schema Name:指定Database或Schema的名字,在MySQL中,Schema同Database类似,具体什么区别没有深究过,但官网描述在创建时差不多。这里指定数据库名字为db_ez即可,本例的数据库。
Table Name:本例使用的数据库表为tb_forhadoop,自己指定导出的表。多表的情况请自行查看官方文档。
SQL Statement:就是sql查询语句,文档上说需要指定一个$condition,但我一直没有创建成功,貌似是一个条件子句。
配置完以上几项,又回出现element#提示符,提示输入一些hash值,这里我没有再指定什么。直接回车过。而以下几个配置我也是直接回车,使用默认值,大概是一些与数据库相关的参数。
Partition column:
Partition column nullable:
Boundary query
Last value
后面需要配置数据目的地各项值:
Null alue:大概说的是如果有空值用什么覆盖
File format:指定在HDFS中的数据文件是什么文件格式,这里使用TEXT_FILE,即最简单的文本文件。
Compression codec:用于指定使用什么压缩算法进行导出数据文件压缩,我指定NONE,这个也可以使用自定义的压缩算法CUSTOM,用Java实现相应的接口。
Custom codec:这个就是指定的custom压缩算法,本例选择NONE,所以直接回车过去。
Output directory:指定存储在HDFS文件系统中的路径,这里最好指定一个存在的路径,或者存在但路劲下是空的,貌似这样才能成功。
Append mode:用于指定是否是在已存在导出文件的情况下将新数据追加到数据文件中。
Extractors:不清楚是什么,我取了一个1
Loaders:同上
最后再次出现element#提示符,用于输入extra mapper jars的属性,可以什么都不写。直接回车。至此若出现successful则证明已经成功创建。