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
--boundary-query: select 1 as MIN , sum(1) as MAX from table where xxx
完整示例语法:
password-file通过 echo -n “password content” > passsword-f

本文介绍了如何利用Sqoop的--query选项和split-by参数,结合自增ID来实现并行数据抽取,并有效处理数据倾斜问题。在数据量不同的情况下,提供了map数量的建议,以平衡数据库压力和导数据效率。通过指定自增ID的范围设置boundary,确保并行过程的高效性。
最低0.47元/天 解锁文章
1604

被折叠的 条评论
为什么被折叠?



