• 进入"运维那点事"后,希望您第一件事就是阅读“关于”栏目,仔细阅读“关于Ctrl+c问题”,不希望误会!

Hadoop实战:Sqoop 1.99把MySQL导数据到HDFS

Hadoop 彭东稳 8年前 (2017-06-21) 38514次浏览 已收录 0个评论

Sqoop客户端

sqoop2客户端提供各种命令行交互接口,供用户使用。sqoop2客户端先连接Sqoop Server,将参数传递过去,再调用mapreduce进行数据导入到出作业。以下是sqoop2中比较重要的几个对象。

1)connector:sqoop2中预定一了各种里链接,这些链接是一些配置模板,比如最基本的generic-jdbc-connector,还有hdfs-connector,通过这些模板,可以创建出对应数据源的link,比如我们链接MySQL,就是使用JDBC的方式进行链接,这时候就从这个generic-jdbc-connector模板继承出一个link,可以这么理解。

2)link:从connector继承出的对象,用于指定的对数据源的链接。

3)job:指定一个导入导出作业,必须指定数据源和数据目的地,并配置各项job参数,用于提交给mapreduce。

sqoop2-shell使用

请确保Sqoop2服务器已经启动,并确保Hadoop启动。其中hadoop不仅要启动hdfs(NameNode、DataNode),还要启动yarn(NodeManager、ResourceManager),当然,一般还会有一个SecondaryNameNode,用于原始NameNode的备援进程。Sqoop具体配置请看上一篇博客:Hadoop实战:Sqoop 1.99安装配置

由于sqoop是一个交互式命令行工具,使用如下命令打开sqoop的shell:

1)配置sqoop server参数

port和host就不用说了,port是默认值;最后一个–webapp官方文档说是指定的sqoop jetty服务器名称,大概是一个自己能识别的用于标示这个服务器的名字吧。

完成后可以验证服务器是否能正确链接上:

这个命令能显示shell和server的版本信息,若server版本信息能正确显示,则没问题!能正确链接上。

注意:我在运行这条命令时出现一个警告,说hadoop native library无法加载什么的,这个目前也没有查到相关说法,但验证下来,hadoop2.6中的lib/native只有一些提供给C/C++调用的二进制文件。若没有影响直接忽略吧。望哪位知道的能告诉我。

2)一些基本概念

MySQL链接使用的是JDBC,这样想来不难理解,必须有对应的驱动文件jar,还得有对应的访问权限,请确保能在server端访问MySQL。参照上一篇博客。可以先看看默认的connector模板都有哪些:

这时候会显示各个conector信息,在1.99.7版本以前,每个connector会有一个id,当创建link时,用这个id指定所继承的connector,但在这个版本中没有这个id了,创建link时直接使用connector名称创建。

其中,最基本的是generic-jdbc-connector,是MySQL等关系型数据库的连接器。支持数据的从关系型数据库的导入导出。除此之外,支持导入导出的还有:hdfs-connector、kite-connector和oracle-jdbc-connector。仅支持数据导入的连接器有: sftp-connector 、 ftp-connector 以及kafka-connector 。

通过这些模板,可以创建出对应数据源的link,比如我们链接MySQL,就是使用JDBC的方式进行链接,这时候就从这个generic-jdbc-connector模板继承出一个link。那如果我们需要连接hdfs,则需要使用hdfs-connector模版。

link:从connector继承出的对象,用于指定的对数据源的链接。

job:指定一个导入导出作业,必须指定数据源和数据目的地,并配置各项job参数,用于提交给mapreduce。

3)创建一个jdbc的link

这里我们使用的是generic-jdbc-connector:

这时候就会出现交互会话,提示你输入各项参数:

Name:标示这个link的字符串,如:link-name。

JDBC Driver Class:指定JDBC启动时所需要加载的Driver类,填写:com.mysql.jdbc.Driver。

JDBC Connection String:指定JDBC连接字符串,后面跟上需要连接的数据库,如:jdbc:mysql://localhost:3306/test。

Username:指定需要连接的用户名(要有test库的select权限)。

Password:指定连接用户名的密码。

FetchSize:这个属性并没有在官方文档上描述,我也不知道说的是什么,直接回车了,使用的默认值。

填写完上面几项,将提供一个可以输入JDBC属性的hash,提示符是entry#,这时候可以手动指定很多JDBC属性的值。

本例只覆盖了一个protocol值为tcp:protocol=tcp

再按回车,之后会再定义一下SQL标准。各个数据库系统提供商们对SQL语言标准的理解和实现各有不同,于是各有各的一些细微差别。以下属性就是用于指定这些区别的。至此,就可以完成这个link的创建。命令行提示符也会还原为sqoop:000>。

注意Identifier enclose:  这里不能直接回车!要打一个空格符号然后再回车!因为如果不打空格,查询MySQL表的时候会在表上加上“”,导致查询出错!

4)创建一个hdfs的link

查看创建的link

5)创建传输JOB

-f指定from,即是数据源位置,-t指定to,即是目的地位置。本例是从MySQL传递数据到HDFS,所以就是from mysql to HDFS。参数值就是在创建链接(link)时指定的Name。

以下是各个属性

Name:一个标示符,自己指定即可。

Schema Name:指定Database或Schema的名字,这里指定数据库名字为sbtest即可,本例的数据库。

Table Name:本例使用的数据库表为sbtest1,自己指定导出的表,多表的情况请自行查看官方文档。

SQL Statement:如果指定了表这里就不需要指定SQL查询语句了。

配置完以上几项,又回出现element#提示符,提示输入一些hash值,这里我没有再指定什么。直接回车过。而以下几个配置我也是直接回车,使用默认值,大概是一些与数据库相关的参数。

Partition column:

Partition column nullable:

Boundary query

Last value

后面需要配置数据目的地各项值:

Null alue:大概说的是如果有空值用什么覆盖

File format:指定在HDFS中的数据文件是什么文件格式,这里使用TEXT_FILE,即最简单的文本文件。

Compression codec:用于指定使用什么压缩算法进行导出数据文件压缩,我指定NONE。

Custom codec:这个就是指定的custom压缩算法,本例选择NONE,所以直接回车过去。

Output directory:指定存储在HDFS文件系统中的路径,本例中指定/sqoop(会自动在HDFS创建)。

Append mode:用于指定是否是在已存在导出文件的情况下将新数据追加到数据文件中。

Extractors:不清楚是什么

Loaders:不清楚是什么

最后再次出现element#提示符,用于输入extra mapper jars的属性,可以什么都不写。直接回车。至此若出现successful则证明已经成功创建。

查看任务

6)启动JOB

我这里MySQL数据库有一百万数据

然后start job即可

然后赶快查看这个任务的状态(当任务执行完成后无法查看的):

所以推荐去Web UI查看,当job运行的时候,你去某个节点上jps一下,会发现有几个YarnChild和AppMaster的进程。所以,sqoop2也是由yarn框架来管理的,我们可以通过 http://Hadoop:8088来查看进程的运行的状态(当Yarn重启后,历史任务会消失,可以安装JobHistoryServer解决)。

启动过程中很有可能会报错,我测试中报错很多,这是后来成功的。比如启动job的时候提示:“Exception: org.apache.sqoop.common.SqoopException Message: GENERIC_JDBC_CONNECTOR_0016:Can’t fetch schema -”。需要好好检查在创建数据库链接时,链接参数格式问题,特别是注意Identifier enclose:  这里不能直接回车!要打一个空格符号然后再回车!因为如果不打空格,查询MySQL表的时候会在表上加上“”,导致查询出错!

要设置可查看具体出错信息

当任务完成后,可以去HDFS查看文件:

参考:http://www.cnblogs.com/avivaye/p/6197123.html

官网:http://sqoop.apache.org/docs/1.99.7


如果您觉得本站对你有帮助,那么可以支付宝扫码捐助以帮助本站更好地发展,在此谢过。
喜欢 (3)
[资助本站您就扫码 谢谢]
分享 (0)

您必须 登录 才能发表评论!