Sqoop1.99.7安装、配置和使用(二)

来源:互联网 发布:小米5移动卡没有4g网络 编辑:程序博客网 时间:2024/05/24 06:59

转载请注明出处:http://blog.csdn.net/u012842205/article/details/52346595

参考这篇写的更好:http://blog.csdn.net/m_signals/article/details/53190965

错误:http://blog.csdn.net/wqhlmark64/article/details/73274910

本文将接上文,记录Sqoop1.99.7基本使用。这里我们使用sqoop2将MySQL中的一个数据表导出到HDFS,都是最简单的使用。


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


一、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。


二、客户端使用

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

[plain] view plain copy
  1. bin/sqoop2-shell  
若成功会开启sqoop的shell命令行提示符:sqoop:000>


(1)配置sqoop server参数

[plain] view plain copy
  1. sqoop:000> set server --host your.host.com --port 12000 --webapp sqoop  

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

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

[plain] view plain copy
  1. sqoop:000> show version --all  
这个命令能显示shell和server的版本信息,若server版本信息能正确显示,则没问题!能正确链接上。

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

这里可能会出错:只需要配置完server之后退出shell再进一次客户端shell即可

sqoop:000> show version --allclient version:  Sqoop 1.99.7 source revision 435d5e61b922a32d7bce567fe5fb1a9c0d9b1bbb  Compiled by abefine on Tue Jul 19 16:08:27 PDT 20160    [main] WARN  org.apache.hadoop.util.NativeCodeLoader  - Unable to load native-hadoop library for your platform... using builtin-java classes where applicableException has occurred during processing commandException: org.apache.hadoop.security.authentication.client.AuthenticationException Message: Authentication failed, status: 404, message: Not Foundsqoop:000>

(2)配置链接到MySQL的链接(link)

MySQL链接使用的是JDBC,这样想来不难理解,必须有对应的驱动文件jar,还得有对应的访问权限,请确保能在server端访问MySQL。参照上一篇博客。

可以先看看connector模板都有哪些:

[plain] view plain copy
  1. show connector  
这时候会显示各个conector信息,在1.99.7版本以前,每个connector会有一个id,当创建link时,用这个id指定所继承的connector,但在这个版本中没有这个id了,创建link时直接使用connector名称创建,这里我们使用的是generic-jdbc-connector:

[plain] view plain copy
  1. 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://192.168.56.101:3306/k1,k1是本例的数据库名称。

Username:链接数据库的用户名,也就是mysql客户端传入的-u参数。本例是root。

Password:链接数据库的用户密码。

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


填写完上面几项,将提供一个可以输入JDBC属性的hash,提示符是entry#,这时候可以手动指定很多JDBC属性的值。本例只覆盖了一个protocol值为tcp:

protocol=tcp

再按回车,之后会再定义一下SQL方言。也就是说,各个数据库系统提供商们对SQL语言标准的理解和实现各有不同,于是各有各的一些细微差别。以下属性就是用于指定这些区别的。当然,很坑的是,官方文档上并没有说明这些属性如何填写,连提都没提。

Identifier enclose:指定SQL中标识符的定界符,也就是说,有的SQL标示符是一个引号:select * from "table_name",这种定界符在MySQL中是会报错的。这个属性默认值就是双引号,所以不能使用回车,必须将之覆盖,我使用空格覆盖了这个值。吐槽一下,这个错误我整了一整天才搞明白,官方文档也是坑啊!


至此,就可以完成这个link的创建。命令行提示符也会还原为sqoop:000>。使用以下命令查看是否创建成功:

[html] view plain copy
  1. show link  

(3)配置链接到HDFS的link:

同理,使用以下命令,connector指定为HDFS:

[plain] view plain copy
  1. sqoop:000> create link -connector hdfs-connector  

hdfs的参数只有一个Name和一个HDFS URI,Name同上的MySQL,自己指定一个喜欢的标示符即可。这个url是hadoop中配置hdfs-site.xml中的属性fs.defaultFS的值。本例为hdfs://192.168.56.101:9000

Conf directory: /usr/local/hadoop-2.6.0/etc/hadoop

回车后没有什么错误就会显示successful信息。


(4)配置传输事务job:

链接都指定了,接下来就要指定Job,用于提交给mapreduce:

[plain] view plain copy
  1. sqoop:000> create job -f "link-name1" -t "link-name2"  
-f指定from,即是数据源位置,-t指定to,即是目的地位置。本例是从MySQL传递数据到HDFS,所以就是from mysql to HDFS。参数值就是在创建链接(link)时指定的Name。本例是: create job -f "mysql-test" -t "hdfs-sq-test"


以下是各个属性

Name:一个标示符,自己指定即可。mysql-sq-hdfs

Schema Name:指定Database或Schema的名字,在MySQL中,Schema同Database类似,具体什么区别没有深究过,但官网描述在创建时差不多。这里指定数据库名字为k1即可,本例的数据库。

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

SQL Statement:就是sql查询语句,文档上说需要指定一个$condition,但我一直没有创建成功,貌似是一个条件子句。

配置完以上几项,又回出现element#提示符,提示输入一些hash值,这里我没有再指定什么。直接回车过。而以下几个配置我也是直接回车,使用默认值,大概是一些与数据库相关的参数。【这个查看日志,看sqoop的运行过程可以知道执行了:Using dataSql: SELECT * FROM  kf . kf  WHERE ${CONDITIONS}】

Partition column: id【我的数据库里面没有指定主键;在这设置id为主键】

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文件系统中的路径,这里最好指定一个存在的路径,或者存在但路劲下是空的,貌似这样才能成功。/mysql-sq-hdfs

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

Extractors:不清楚是什么,我取了一个1

Loaders:同上

最后再次出现element#提示符,用于输入extra mapper jars的属性,可以什么都不写。直接回车。


至此若出现successful则证明已经成功创建。


三、开启事务

使用如下命令

[plain] view plain copy
  1. sqoop:000> start job --name mysql-sq-hdfs
    Exception has occurred during processing command
    Exception: org.apache.sqoop.common.SqoopException Message: GENERIC_JDBC_CONNECTOR_0025:No primary key -Please specify partition column
  2. 【原因:我的mysql表里面没有指定主键?我输入Partition column: id】
报错之后需要修改job:
sqoop:000> update job --name mysql-sq-hdfs;不需要改的地方直接enter,
报错2:没有输入mysql密码
sqoop:000> start job --name mysql-sq-hdfsException has occurred during processing commandException: org.apache.sqoop.common.SqoopException Message: GENERIC_JDBC_CONNECTOR_0001:Unable to get a connection -

报错3:

2017-11-08 18:12:19 CST: FAILURE_ON_SUBMITException: java.io.FileNotFoundException: File does not exist: hdfs://192.168.56.101:9000/usr/local/sqoop-1.99.7/server/lib/joda-time-2.4.jar

就根据提示,把所有提示的jar(hadoop、hbase、hive)全部给他上传到hdfs的路径下,

问题解决。但是总感觉这样解决方法不妥

终极解决方法:http://bbs.csdn.net/topics/390795507 sqoop2必须运行在hadoop集群或者伪分布式上面;
I solve the problem in adding in mappred-site.xml :

<property>
<name>mapreduce.framework.name</name>
<value>yarn</value>
</property>
 

name就是创建job时指定的Name属性,不出意外将正确执行,之后使用如下命令就能查看其进度了:

[plain] view plain copy
  1. status job -n name  

四、写在最后 运行信息:

sqoop:000> start job --name my-hdfsSubmission detailsJob Name: my-hdfsServer URL: http://localhost:12000/sqoop/Created by: hadoopCreation date: 2017-11-08 18:38:21 CSTLastly updated by: hadoopExternal ID: job_1510137441584_0001http://localhost:8088/proxy/application_1510137441584_0001/2017-11-08 18:38:21 CST: BOOTING  - Progress is not available



原创粉丝点击