sqoop基础

注意: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个