我们在一个小的(16m行)独立表和一个大的(6b行)倾斜表之间有一个pig连接。常规连接在2小时内完成(经过一些调整)。我们试过了 using skewed
而且能把表演提高到20分钟。
但是,当我们尝试一个更大的倾斜表(19b行)时,我们从sampler作业得到以下消息:
Split metadata size exceeded 10000000. Aborting job job_201305151351_21573 [ScriptRunner]
at org.apache.hadoop.mapreduce.split.SplitMetaInfoReader.readSplitMetaInfo(SplitMetaInfoReader.java:48)
at org.apache.hadoop.mapred.JobInProgress.createSplits(JobInProgress.java:817) [ScriptRunner]
我们每次尝试都可以复制 using skewed
,并且在使用正则联接时不会发生。
我们试着设置 mapreduce.jobtracker.split.metainfo.maxsize=-1
我们可以在job.xml文件中看到它,但它不会改变任何东西!
这里发生了什么?这是由创建的分发示例的bug吗 using skewed
? 为什么把参数改成 -1
?
2条答案
按热度按时间ars1skjm1#
在较新版本的hadoop(>=2.4.0,但可能更早)中,您应该能够通过使用以下配置属性在作业级别设置最大拆分大小:
mapreduce.job.split.metainfo.maxsize=-1
syqv5f0l2#
1mb的小表足够小,可以放入内存,请尝试复制联接。复制连接是只Map的,不会像其他类型的连接那样引起reduce stage,因此不会受到连接键中的偏移的影响。应该很快。
大table总是第一个在声明中。
更新1:如果原始形式的小表不适合内存,那么作为解决方案,您需要将小表划分为足够小的分区以适合内存,然后对大表应用相同的分区,希望您可以将相同的分区算法添加到创建大表的系统中,这样你就不会浪费时间重新划分了。分区之后,您可以使用复制连接,但是需要为每个分区分别运行pig脚本。