Sqoop 并行抽取数据同时cover数据倾斜:
核心思想就是自己生成一个有序且均匀的自增ID,然后作为map的切分轴,这样每个map就可以分到均匀的数据,可以通过设置map的个数来提高吞吐量。
建议:
数据量500w 以下使用4个map即可。
数据量500w以上8即可,太多会对数据库加压,造成其他场景使用性能降低。
如果是为了专门导数据,和下游计算的并行度,可以适当调大。
引出场景:
通常可以指定split-by 对应的zizengID 列,然后使用–num-mappers或者-m指定map的个数,即并发的抽取进程数量。但是有时候会碰到很多的表没有添加自增ID或者,整数型的主键,或者 主键分布不均,反而会拖慢整个job的进程。
根据sqoop源码的设计,我们可以使用–query语句中添加自增ID,作为split-by的参数,与此同时通过设置的自增ID的范围可以设置boundary。。
核心语法如下:
```bash
--query 方式:涉及参数 --query、--split-by、--boundary-query
--query: select col1、 col2、 coln3、 columnN from (select ROWNUM() OVER() AS INC_ID, T.* from table T where xxx ) where $CONDITIONS
--split-by: INC_ID