sqoop进行大量oracle表导入到HDFS发生的数据倾斜

qq_29089829 2017-11-23 10:12:52
由于数据的庞大以及年代的的久远,即便设置-m 30都是基本集中在一个map中,尤其是对于几十g数据的表,这种情况下,split by没有任何的用处,有没有其他的解决方法,而且是编写shell脚本大量的表一次性导,不是一张一张表导入,版本号是1.4.4,没有1.4.5的sqoop for oracle,网上查到可以用--query的方法,自己设定sql语句,但是并不清楚怎么去编写,sqoop自己提供的min,max(primary key)感觉已经是最优的sql了
...全文
1481 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
码太狼 2018-01-17
  • 打赏
  • 举报
回复
看一下sqoop源码map的实现。根据函数计算出primary key的max和min,然后(max-min)/map数量,计算出的值平均分给map,map根据各自的primary key的max和min进行导数据。如果primary key本来就是不均匀的,map分配的数据量也不会均匀。 所以一般情况下设置map=1就可以了。 或者根据表的实际字段信息,用sql语句将表分为多个sql开启多个sqoop导出数据。
缱绻浮生丶 2018-01-16
  • 打赏
  • 举报
回复
数据量庞大的时候,建议增量和多个map去跑任务
缱绻浮生丶 2018-01-16
  • 打赏
  • 举报
回复
#!/bin/sh echo "importTable:DM_COLLECT_C_ORG_MAPPING " step_s=$(date +'%Y-%m-%d %H:%M:%S') /usr/lib/sqoop-1.4.6/bin/sqoop import --connect jdbc:db2://10.80.56.16:50001/CPI_DM --username **** --password **** --query 'select ORG_MAPPING_ID,SYS_CODE,S_ORG_CODE,S_ORG_NAME,ORG_CODE,ORG_NAME,DATA_VERSION,DATA_STATUS from DM.COLLECT_C_ORG_MAPPING where 1=1 and $CONDITIONS' --append --target-dir /spicins/dmm/COLLECT_C_ORG_MAPPING -m 1 --null-string '' --null-non-string '' --fields-terminated-by ',' step_e=$(date +'%Y-%m-%d %H:%M:%S') step_time=$(($(date +%s -d "$step_e") - $(date +%s -d "$step_s"))) echo "importTable DM_COLLECT_C_ORG_MAPPING exe time:" echo "scale=2;$step_time / 60"|bc
qq_29089829 2017-12-14
  • 打赏
  • 举报
回复
有没有人回答,之前发错区块了,之所以需要解决这个是因为大表会卡死,然后十几个小时过后就会出现快照过旧然后任务就停滞卡死需要kill掉了

20,807

社区成员

发帖
与我相关
我的任务
社区描述
Hadoop生态大数据交流社区,致力于有Hadoop,hive,Spark,Hbase,Flink,ClickHouse,Kafka,数据仓库,大数据集群运维技术分享和交流等。致力于收集优质的博客
社区管理员
  • 分布式计算/Hadoop社区
  • 涤生大数据
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧