注意:sqoop在工作中的定位是会用就行
参数:
--target-dir \ hdfs目标的目录
--delete-target-dir \导入的目标目录如果存在则删除那个目录
--num-mappers \相当于-m,并行导入时map task的个数
--fields-terminated-by\
--query "$2" 'and $CONDITIONS;' 指定满足sql和条件的数据导入
-m maptask的个数
--merge-key 主键
--incremental 导入模式 用来指定增量导入的模式
sqoop导入导出NULL存储一致性问题
Hive中的Null在底层是以"\N" 来存储,而Mysql中的Null在底层就是null,为了保证数据两端的一致性,转化的过程中遇到null-string,null-non-string数据都转化成指定的类型,通常指定成"\N".在导出数据时采用-input-null-string "\N" --input-null-non-string "\N" ;两个参数
sqoop数据导出一致性问题
1 场景1:如sqoop在导出到mysql时,使用4个map任务,过程中有2个任务失败,那此时mysql中存储了另外两个任务导入的数据,此时老板正好看到了这个报表的数据,而开发工程师发现任务失败后,会调试问题并最终将全部数据正确的导入mysql,那后面的老板再次看报表数据,发现本次看到的和之前的不一致这是生成环境不允许的
使用--stageing-table选项,将hdfs中的数据先导入到辅助表中,当hdfs中的数据导出成功后,辅助表中的数据在一个事务中导出到目标表中(也就是说这个过程要不完全成功,要不完全失败)
为了能够使用staging这个选项,staging表在运行任务前或者是空的,要不就是用--clear-staging-table配置,如果staging表中有数据,并且使用了--clear-staging-table选项,sqoop执行导出任务前会删除staging表中所有的数据
注意:--direct导入时staging方式是不可用的,使用了--update-key选项时staging方式也不能用
案例
sqoop export \
--connect url \
--username root \
--password 123456 \
--table app_come \
--columns id,twatch...\
--fields-terminated-by "\t" \
--export-dir "/user/hive/warehouse/tmp.db/app_cme_{day}" \
--staging-table app_come \
--clear-staging-table \
--input-null-string '\\N' \
--null-non-string '\\N' \
2 设置map数量为1个
多个map任务时,使用-staging-table方式,仍然可以解决数据一致性问题
sqoop 底层运行的任务是什么?
只有Map阶段,没有reduce阶段的任务
Map task并行度设置大于1的问题?
并行度导入数据的时候,需要制定那个字段进行切分,该字段通常是主键或者是自增长不重复的数值型字段,否则会报错
import fail:No primary key could be found for table ....
也就是说当map rask并行度大于1时,下面两个参数需要同时使用
--split-by id 指定根据id字段进行切分
--m n 指定mapbingxingdun个