1.区别ETL作业调度工具和任务流调度工具
kettle是一个ETL工具,ETL(Extract-Transform-Load的缩写,即数据抽取、转换、装载的过程)。
kettle中文名称叫水壶,该项目的主程序员MATT 希望把各种数据放到一个壶里,然后以一种指定的格式流出。
所以他的重心是用于数据
oozie是一个工作流,Oozie工作流是放置在控制依赖DAG(有向无环图 Direct Acyclic Graph)中的一组动作(例如,Hadoop的Map/Reduce作业、Pig作业等),其中指定了动作执行的顺序。
oozie工作流中是有数据流动的,但是重心是在于工作流的定义。
二者虽然都有相关功能及数据的流动,但是其实用途是不一样的。
2.ETL作业调度工具
2.1Sqoop调度工具
2.1.1列举出所有数据库
查看帮助
bin/sqoop help
列举出所有linux上的数据库
bin/sqoop list-databases --connect jdbc:mysql://localhost:3306 --username root --password root
列举出所有Window上的数据库
bin/sqoop list-databases --connect jdbc:mysql://192.168.22.36:3306 --username root --password root
查看数据库下的所有表
bin/sqoop list-tables --connect jdbc:mysql://localhost:3306/mysql --username root --password root
2.12导入数据库表数据到HDFS
(1)确定mysql服务启动正常
查询控制端口和查询进程来确定,一下两种办法可以确认mysql是否在启动状态
办法1:查询端口
$ netstat -tulpn
MySQL监控的TCP的3306端口,如果显示3306,证明MySQL服务在运行中
办法二:查询进程
可以看见mysql的进程
ps -ef | grep mysqld
没有指定数据导入到哪个目录,默认是/user/root/表名
bin/sqoop import \
--connect jdbc:mysql://192.168.77.137/zhjy \
--password 123456 \
--username root \
--table zf_jygz_thjc \
--m 1 \
--fields-terminated-by '\t'
或是
bin/sqoop import \
--connect jdbc:mysql://192.168.77.137/zhjy \
--password 123456 \
--username root \
--table zf_jygz_thjc \
--m 5 \
--split-by ZF_BH(一般在设置-m>1时使用)
--fields-terminated-by '\t'
原因:
如果表中有主键,m的值可以设置大于1的值;如果没有主键只能将m值设置成为1;或者要将m值大于1,需要使用--split-by指定一个字段
设置了-m 1 说明只有一个maptask执行数据导入,默认是4个maptask执行导入操作,但是必须指定一个列来作为划分依据
导入数据到指定目录
在导入表数据到HDFS使用Sqoop导入工具,我们可以指定目标目录。使用参数 --target-dir来指定导出目的地,使用参数—delete-target-dir来判断导出目录是否存在,如果存在就删掉
bin/sqoop import \
--connect jdbc:mysql://192.168.77.137/zhjy \
--username root \
--password 123456 \
--delete-target-dir \ --如果目录存在,将目录删除
--table zf_jygz_thjc \
--target-dir /user/zhjy \ --指定保存目录
--m 1 \
--fields-terminated-by '\t'
查询导入
bin/sqoop import \--connect jdbc:mysql://192.168.72.133:3306/company \
--username root \--password root \--target-dir /user/company \--delete-target-dir\--num-mappers 1\--fields-terminated-by "\t"\--query 'select name,sex from staff where id <=1 and $CONDITIONS;'
提示:must contain '$CONDITIONS' in WHERE clause。
where id <=1 匹配条件
$CONDITIONS:传递作用。
如果 query 后使用的是双引号,则 $CONDITIONS前必须加转义符,防止 shell 识别为自己的变量。
--query时不能使用--table一起使用
需要指定--target-dir路径
导入到hdfs指定目录并指定要求
bin/sqoop import \--connect jdbc:mysql://192.168.72.133:3306/company \--username root \--password root\
#提高数据库到hadoop的传输速度--direct--table staff \
--delete-target-dir \
#导入指定列,涉及到多列,用逗号分隔--column id,sex \--target-dir /user/company \--num-mappers 1 \
#指定分隔符--fields-terminated-by '\t'
#指定导出存储格式--as-textfile
#指定数据压缩(压缩,解压缩方式)--compress--compression-codec org.apache.hadoop.io.compress.SnappyCodec
数据导出储存方式(数据存储文件格式---( textfil parquet)--as-textfileImports data as plain text (default)--as-parquetfile Imports data to Parquet Files)
导入表数据子集到HDFS
bin/sqoop import \--connect jdbc:mysql://172.16.43.67:3306/userdb \
--username root \--password root \--table emp_add \--target-dir /sqoop/emp_add \-m 1\--delete-target-dir\--where "city = 'sec-bad'"
sqoop导入blob数据到hive
对于CLOB,如xml文本,sqoop可以迁移到Hive表,对应字段存储为字符类型。
对于BLOB,如jpg图片,sqoop无法直接迁移到Hive表,只能先迁移到HDFS路径,然后再使用Hive命令加载到Hive表。迁移到HDFS后BLOB字段存储为16进制形式。
bin/sqoop-import \
--connect jdbc:mysql://192.168.77.137:3306/zhjy \
--username root \
--password 123456 \
--table ceshi \
--columns "id,name,photo" \
--split-by id \
-m 4 \
--inline-lob-limit=16777126 \设置内联的