Sqoop的Job与优化
Job操作
job的好处:
1、一次创建,后面不需要创建,可重复执行job即可
2、它可以帮我们记录增量导入数据的最后记录值
3、job的元数据默认存储目录:$HOME/.sqoop/
4、job的元数据也可以存储于mysql中。
复制代码
Sqoop提供一系列的Job语句来操作Sqoop。
$ sqoop job (generic-args) (job-args) [-- [subtool-name] (subtool-args)]
$ sqoop-job (generic-args) (job-args) [-- [subtool-name] (subtool-args)]
复制代码
使用方法:
usage: sqoop job [GENERIC-ARGS] [JOB-ARGS] [-- [<tool-name>] [TOOL-ARGS]]
Job management arguments:
--create <job-id> Create a new saved job
--delete <job-id> Delete a saved job
--exec <job-id> Run a saved job
--help Print usage instructions
--list List saved jobs
--meta-connect <jdbc-uri> Specify JDBC connect string for the
metastore
--show <job-id> Show the parameters for a saved job
--verbose Print more information while working
复制代码
列出Sqoop的Job:
[root@qianfeng01 sqoop-1.4.7] sqoop job --list
复制代码
创建一个Sqoop的Job:
[root@qianfeng01 sqoop-1.4.7]# sqoop job --create sq2 -- import --connect jdbc:mysql://qianfeng01:3306/qfdb \
--username root \
--password 123456 \
--table u2 \
--delete-target-dir \
--target-dir '/sqoopdata/u3' \
-m 1
注意:第一行的--与import之间有空格
复制代码
执行Sqoop的Job:
#如报错json包找不到,则需要手动添加
sqoop job --exec sq1
执行的时候会让输入密码:
输入该节点用户的对应的密码即可
# 1、配置客户端记住密码(sqoop-site.xml)追加
<property>
<name>sqoop.metastore.client.record.password</name>
<value>true</value>
</property>
# 2、将密码配置到hdfs的某个文件,我们指向该密码文件
说明:在创建Job时,使用--password-file参数,而且非--passoword。主要原因是在执行Job时使用--password参数将有警告,并且需要输入密码才能执行Job。当我们采用--password-file参数时,执行Job无需输入数据库密码。
[root@qianfeng01 sqoop-1.4.7]# echo -n "123456" > sqoop.pwd
[root@qianfeng01 sqoop-1.4.7]# hdfs dfs -mkdir /input
[root@qianfeng01 sqoop-1.4.7]# hdfs dfs -put sqoop.pwd /input/sqoop.pwd
[root@qianfeng01 sqoop-1.4.7]# hdfs dfs -chmod 400 /input/sqoop.pwd
[root@qianfeng01 sqoop-1.4.7]# hdfs dfs -ls /input
-r-------- 1 hadoop supergroup 6 2018-01-15 18:38 /input/sqoop.pwd
# 3. 重新创建Job
sqoop job --create u2 -- import --connect jdbc:mysql://qianfeng01:3306/qfdb --username root --table u2 --delete-target-dir --target-dir '/sqoopdata/u3' -m 1 --password-file '/input/sqoop.pwd'
复制代码
查看Sqoop的Job:
[root@qianfeng01 sqoop-1.4.7] sqoop job --show sq1
复制代码
删除Sqoop的Job:
[root@qianfeng01 sqoop-1.4.7] sqoop job --delete sq1
复制代码
问题:
1 创建job报错:19/12/02 23:29:17 ERROR sqoop.Sqoop: Got exception running Sqoop: java.lang.NullPointerException
java.lang.NullPointerException
at org.json.JSONObject.<init>(JSONObject.java:144)
解决办法:
添加java-json.jar包到sqoop的lib目录中。
如果上述办法没有办法解决,请注意hcatlog的版本是否过高,过高将其hcatlog包剔除sqoop的lib目录即可。
2 报错:Caused by: java.lang.ClassNotFoundException: org.json.JSONObject
解决办法:
添加java-json.jar包到sqoop的lib目录中。
复制代码
Sqoop优化
-m与split-by的优化
- 小量数据时(200M左右) :最好使用一一个map,快且减少小文件。
- 大量数据时:要特别考虑数据的特征,对于split- by最完美的情况是有一个:均匀分布的数字(如自增列)或时间字段,且这个字段还有索引(最好字段是int、tinyin),这样在抽取时使得并发的每个sq1处理相近的数据量,并且Sqoop附加的where条件可以使用索引。
- split-by id,-m 2, 数据量1-100。第 一个mapper:(0,50]第二个mapper: (50, 100],对于m要综合考虑数据量、I0、源数据库的性能、集群的资源等等。一种简单的考虑是最大不超过yarn.上分配给这个用户的core个数,最小“数据量/m”要够一个128MB的文件。如果条件允许可以先设置一个值跑着试试,然后观察源数据库负载、集群I0以及运行时长等,再进行相应调整。
--fetch-size n
一次取MySql中批量读取的数据条数。建议优化如下:
- 考虑一条数据的量。(如果2个字段和200个字段的--fetch-size不能一样)
- 考虑数据库的性能
- 考虑网络速度
- 最好的状态是一 次--fetch-size能满足一个mapper