我们在一个小的(16M行)不同的表和一个大的(6B行)倾斜的表之间有一个猪连接。
定期加入在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文件中看到它,但它不会改变任何内容!
这里发生了什么?这是using skewed
创建的分发示例的错误吗?为什么不帮助将参数更改为-1
?
答案 0 :(得分:1)
1MB的小表足够小以适应内存,尝试复制连接。 复制连接只是Map,不会导致Reduce阶段成为其他类型的连接,因此不受连接键中的偏差的影响。它应该很快。
big = LOAD 'big_data' AS (b1,b2,b3);
tiny = LOAD 'tiny_data' AS (t1,t2,t3);
mini = LOAD 'mini_data' AS (m1,m2,m3);
C = JOIN big BY b1, tiny BY t1, mini BY m1 USING 'replicated';
大表总是声明中的第一个。
更新1: 如果原始形式的小表不适合内存,那么作为一种解决方法,您需要将小表分区为足够小以适合内存的分区,而不是将相同的分区应用于大表,希望您能够将相同的分区算法添加到创建大表的系统中,这样就不会浪费时间重新分区。 分区后,您可以使用复制连接,但需要分别为每个分区运行pig脚本。
答案 1 :(得分:0)
在较新版本的Hadoop(> = 2.4.0但可能更早)中,您应该能够使用以下配置属性在作业级别设置最大分割大小:
mapreduce.job.split.metainfo.maxsize = -1