Sqoop导入数据发生数据倾斜问题 及更好解决

Sqoop导入数据发生数据倾斜问题 及更好解决

一:问题

在生产环境中,由于数据是庞大的,且是复杂的

Sqoop抽数使用单实例报内存溢出以及抽数时间过长,决定采用sqoop的多实例并行抽数

官网:http://sqoop.apache.org/docs/1.4.7/SqoopUserGuide.html

二:具体原理:

Sqoop在import时,需要制定split-by参数。Sqoop根据不同的split-by参数值来进行切分,然后将切分出来的区域分配到不同map中。每个map中再处理数据库中获取的一行一行的值,写入到HDFS中。同时split-by根据不同的参数类型有不同的切分方法,如比较简单的int型,Sqoop会取最大和最小split-by字段值,然后根据传入的num-mappers来确定划分几个区域。 比如select max(split_by),min(split-by) from得到的max(split-by)和min(split-by)分别为1000和1,而num-mappers为2的话,则会分成两个区域(1,500)和(501-100),同时也会分成2个sql给2个map去进行导入操作,分别为select XXX from table where split-by>=1 and split-by<500和select XXX from table where split-by>=501 and split-by<=1000。最后每个map各自获取各自SQL中的数据进行导入工作。

bin/sqoop import \
--connect jdbc:mysql://hadoop102:3306//gmall \
--username xxxx \
--passwoed xxxx \
--table xxxx \
--columns xxxx.xxxx \
--where "xxxx" \
--target_dir /xxxx \
--fields-terminated-by '\t'  \
--num-mappers 2 \
--split-by xxxx

注意:

–split-by 后面要是int类型,并且是连续递增的,那么sqpli-by 会平分的很均匀,要是不是自增的那么有的maptask还是很忙,而有的maptask则不是很忙
–num-mappers 后面设置的maptask数目大于1的话,那么–split-by 后面必须跟字段,因为–num-mappers 后面要是1的话,那么
–split-mappers 后面跟不跟字段都没有意义,因为,他只会启动一个maptask进行数据处理。

三:如果id数据分布不均及id重复同样会出现数据倾斜

里需要使用–query 方式:涉及参数 --query、–split-by、–boundary-query

–query: select column1、 column2、 column3、 columnN from (select ROWNUM() OVER() AS ETL_ID, T.* from table T where xxx ) where $CONDITIONS

–split-by: ETL_ID

–boundary-query: select 1 as MIN , sum(1) as MAX from table where xxx

具体原理就是通过ROWNUM() 生成一个严格均匀分布的字段,然后指定为分割字段

上一篇:Azkaban.Sqoop_网站流量日志分析


下一篇:七 sqoop 安装