Sqoop抽数性能优化

文章讲述了如何通过调整Sqoop的--split-by参数和--m参数来优化从SQLServer到Hive的数据迁移过程,以避免数据倾斜并提高效率。通过选择合适的split-by字段和设置适当的并行任务数(num-mappers),可以显著减少数据导入时间。实验显示,这种优化策略将迁移时间从16分钟降低到了8分钟。
摘要由CSDN通过智能技术生成

1515万数据通过sqoop从sqlserver抽取到hive

 

 时间16min

调整参数前配置 

sqoop import "-Dorg.apache.sqoop.splitter.allow_text_splitter=true" \
"-D mapred.job.queue.name=dev" \
--connect "" \
--driver "net.sourceforge.jtds.jdbc.Driver" \
--username "" \
--password "" \
--fields-terminated-by '\001' \
--delete-target-dir \
--target-dir "" \
--hive-drop-import-delims \
--split-by 'SID' \
--query "select
 SID
,SITE
,SEQUENCE
 from tab where 1=1 and  \$CONDITIONS" \
--m 4

主要调整参数 

--split-by:

        执行并行导入时,Sqoop 需要一个条件,通过该标准可以拆分工作负载。Sqoop 使用拆分列拆分工作负荷。默认情况下,Sqoop 将标识表中的primary key (如果存在),并用作拆分列。从数据库中检索拆分列的低值和高值,并且映射任务对总范围的均匀大小的组件进行操作。

注意点:

避免数据倾斜的方法

从此得出结论想要避免数据倾斜,对split-by指定字段的要求是 int类型同时数据分布均匀。

--m :

        通过使用 -m或参数–num-mappers,我们可以在 Sqoop 中设置并行性的程度。

注意点:

对于m要综合考虑数据量、IO、源数据库的性能、集群的资理等等。一种简单的考虑是最大不超过yarn上分配给这个用户的vcore个数,最小“数据量/m”要够一个128MB的文件。如果条件允许可以先设置一个值跑着试试,然后观察源数据库负载,集群IO以及运行时长等,再进行相应调整。

我们通过num-mappers 参数控制并行度,split-by参数控制数据分割字段,就可以做到抽数并行化。

我试过单独直接跳帧m,给50发现性能并没有多大的提升,后面通过调整--split-by:字段实现以下效果

受yarn资源影响但是还是快了一半的时间8min证明这种方式是有效的

优化后代码:

sqoop import "-Dorg.apache.sqoop.splitter.allow_text_splitter=true" \
"-D mapred.job.queue.name=dev" \
--connect "" \
--driver "net.sourceforge.jtds.jdbc.Driver" \
--username "" \
--password "" \
--fields-terminated-by '\001' \
--delete-target-dir \
--target-dir "" \
--hive-drop-import-delims \
--split-by 'RANK' \
--query "select
 SID
,SITE
,SEQUENCE
,RANK
 from (select *,row_number() over(order by SID) as RANK from tab) main where 1=1 and  \$CONDITIONS" \
--m 50

--split-by:rank

调整为int类型同时数据分布均匀

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值