前提是安装好sqoop!!
1.服务端
如图,我们可以使用 sqoop2-server [ start | stop ] 来启动和关闭服务端。之后使用 jps 命令可以查看到
会多了这个进程。
在启动服务成功后,会在自动生成两个文件(如果没有文件),(默认的是BASEDIR 和LOGDIR),
前者存放创建的link和job,后者存放日志文件,
如果采用默认的,当你换个路径启动服务,link和job会找不到,即使你回到原来的路径启动也找到了,所有建议采用绝对路径,配置文件路径:$SQOOP_HOME/conf/sqoop.properties
附上全局替换命令:(把@LOGDIR@ 换成 /user/hadoop/sqoop-1.99.7/logs)
# 设置日志文件的目录 0,%s/@LOGDIR@/\/usr\/hadoop\/sqoop-1.99.7\/logs/g # 设置数据的存放目录 0,%s/@BASEDIR@/\/usr\/hadoop\/sqoop-1.99.7\/bin\/BASEDIR/g
使用sqoop前请确保hadoop服务和Sqoop2服务器均已启动。其中Hadoop不仅要启动hdfs(NameNode、Datanode),还要启动yarn(NodeManager、ResourceManager),当然,一般还会有一个SecondaryNameNode,用于原始NameNode的备援进程。
2.客户端
服务启动后,使用命名进入: sqoop2-shell
若成功会开启sqoop的shell命令行提示符:sqoop:000>
我们在使用的过程中可能会遇到错误,使用以下命令来使错误信息显示出来(每次进来都要设置才起作用)set option --n[ame] verbose --v[alue] true
连接Sqoop服务端:
#我们的服务端安装在master这个节点上所以--host是master(每次进来都要设置才起作用)
set server --h[ost] master
(set server --h[ost] master --p[ort] 12000 --w[ebapp] sqoop)
或者: set server -u[rl] http://master:12000/sqoop
使用命令查看刚刚设置的信息:
showversion--a[ll]
可以使用help查看帮助文档,虽然不太详细,比较蠢,试一试命令就知道怎么用了
MysqL链接使用的是JDBC,这样想来不难理解,必须有对应的驱动文件jar,还得有对应的访问权限,请确保能在server端访问MysqL。
可以先看看connector模板都有哪些: showconnector
这时候会显示各个conector信息, 在1.99.7版本以前,每个connector会有一个id ,当创建link时,用这个id指定所继承的connector,但在这个版本中没有这个id了,创建link时直接使用connector名称创建,这里我们使用的是generic-jdbc-connector(一般数据库都可以用这个):
2.1创建MysqL链接
createlink-c[onnector] generic-jdbc-connector
这时候就会出现交互会话,提示你输入各项参数:
Name: MysqL-link 标示这个link的字符串,就是一个名字,但是不能重复
Driver Class:指定jdbc启动时所需要加载的driver类,这个类实现了Java.sql.Driver接口。对本文来说,这个值是com.MysqL.jdbc.Driver。
Connection String:本例为jdbc:MysqL://master:3306/hive, #注意:jdbc:MysqL://主机名(ip):端口/数据库名
Username:链接数据库的用户名,也就是MysqL客户端传入的-u参数。本例是hive。
Password:链接数据库的用户密码。(注:在使用update命令时,这里默认是没有的,其他参数都会保存原来输过的值)
FetchSize:直接回车了,使用的默认值,不是很清楚这个值,请知道的大牛告知,按字面意思就是获取一次资源时的大小。
填写完上面几项,将提供一个可以输入JDBC属性的hash,提示符是entry#,这时候可以手动指定很多JDBC属性的值。本例只覆盖了一个protocol值为tcp:protocol=tcp
再按回车,之后会再定义一下sql方言。也就是说,各个数据库系统提供商们对sql语言标准的理解和实现各有不同,于是各有各的一些细微差别。以下属性就是用于指定这些区别的。 官方文档上并没有说明这些属性如何填写,连提都没提(官网有时还是挺坑的)。
Identifier enclose:指定sql中标识符的定界符,也就是说,有的sql标示符是一个引号:select * from "table_name", 在写MysqL的sql语句中会加上双引号,这种定界符在MysqL中是会报错的,。这个属性默认值就是双引号,所以不能直接回车使用默认值,必须将之覆盖,我使用空格覆盖了这个值。
至此,就可以完成这个link的创建。命令行提示符也会还原为sqoop:000>。使用以下命令查看是否创建成功:
show link,后面也可以加参数,-n或者-a之类的
2.2创建HDFS链接
createlink-c hdfs-connector
Name: hdfs-link 与MysqL的一样,是个名字但不重复
HDFS URI:hdfs://master:9000/这个url是hadoop中配置hdfs-site.xml中的属性fs.defaultFS的值(老版的hadoop是fs.default.name,如果没找到就使用webUI (http://主机名(ip):8088/conf) 去配置中心看)。
Hadoop conf directory:/mysoftware/hadoop-2.7.1/etc/hadoop #Hadoop配置文件的目录
2.3 创建一个job
createjob-f"MysqL-link"-t"hdfs-link"
-f指定from,即是数据源位置,-t指定to,即是目的地位置。本例是从MysqL传递数据到HDFS,所以就是from MysqL to HDFS。参数值就是在创建链接(link)时指定的Name。名字在上面取好了,知道为啥名字不能重复了吧
Name: MysqL_hdfs_job #Name必须唯一
Schema name: hive #必填,数据库名称
Table name: DBS #必填,表名
#以下几个配置我也是直接回车,使用默认值,从名字上能看出个大概的值
Table sql statement: #可选
Table column names: #可选
Partition column name: #可选
Null value allowed for the partition column: #可选
Boundary query: #可选
Check column: #可选
Last value: #可选
Override null value: #可选
Null value:
Output format: #输出文件格式
0 : TEXT_FILE
..........
Choose: 0 #必选
Compression format: #用于指定使用什么压缩算法进行导出数据文件压缩,我指定NONE,这个也可以使用自定义的压缩算法CUSTOM,用Java实现相应的接口
0 : NONE
..........
Choose: 0 #必选 这个就是指定的custom压缩算法
Output directory: /mysqoop # 指定存储在HDFS文件系统中的路径,这里最好指定一个存在的路径,或者存在但路径下是空的,貌似这样才能成功。
Append mode: #是否追加文件,不懂的是,要求文件夹是空,连文件都没有何来追加!
#下面两个数量怎么取值,还不是很情况,请大牛告知
Extractors: 2 #可选,对应mapreduce的job中的map的数量
Loaders: 1 #可选,对应mapreduce的job中的reduce的数量
最后再次出现element#提示符,用于输入extra mapper jars的属性,可以什么都不写。直接回车。
至此若出现successful则证明已经成功创建。
2.4 运行job
start job -n MysqL_hdfs_job -s (名字上的引号要不要都无所谓)
-s 参数可以看到运行的状态,
也可以用status job -n MysqL_hdfs_job 查看或者使用webUI查看 (http://主机名(ip):8088/cluster/apps),也能看日志
如果失败,优先看sqoop shell中有没有报错,再者看日志,可以在webUI中和sqoop的日志文件看,前面有提及,如果日志中没有明显的报错,一般是你设置某个参数时不正确,或者是(hadoop)配置文件有问题,
报错时的推荐参数:
在Hadoop的yarn-site.xml 这个配置文件中设置以下属性
<property>
<name>yarn.log-aggregation-enable</name>
<value>true</value>
</property>
在mapred-site.xml中设置:(默认200)
<property>
<name>mapred.child.java.opts</name>
<value>-Xmx1024m</value>
</property>
参考文章:
http://www.cnblogs.com/avivaye/p/6196485.html
http://www.cnblogs.com/avivaye/p/6197123.html
http://blog.csdn.net/M_SIGNALs/article/details/53189424
http://blog.csdn.net/u012842205/article/details/52346595
http://blog.csdn.net/u014729236/article/details/46876651
还有很多地方不太懂,求知道的大牛,不吝赐教!共勉!