我有一个我一直在研究的Pig脚本,它有来自2个不同数据源的内部联接。此连接恰好是第一个MapReducing导致操作。只有手工过滤和foreachs的唯一操作。当然后执行此Join时,所有内容都会完美而快速地完成地图阶段,但是当涉及到reduce阶段时,所有减速器都会快速完成。然而,1只是坐在那里的Reduce部分,以极慢的速度对数据进行调整。到这可能需要长达一个小时+只需等待1个减速器完成。我已经尝试过增加减速器以及切换到偏斜连接,但似乎没有任何帮助。
任何有待观察的想法。
我还做了一个解释,看看我是否能看到任何东西,但这只是显示了一个简单的单一工作流程,没有什么了不起的。
答案 0 :(得分:4)
可能发生的事情是单个密钥在双方都有大量的实例并且它正在爆炸。
例如,如果您加入:
x,4 x,'f'
x,5 x,'g'
x,6 X x,'h'
y,7 x,'i'
...你将获得12对x
!因此,您可以想象,如果您在另一个数据集中拥有1000个一个密钥和2000个相同密钥,那么您将从这2000个行中获得200万对。不幸的是,单一的减速器必须承受爆炸的冲击力。
添加缩减器或使用倾斜连接在这里不会有帮助,因为在一天结束时,单个缩减器需要处理这一对的大爆炸。
以下是一些要检查的事项:
NULL
。其中任何一列中的列都可以为NULL吗?如果是这样,它会爆炸!在运行连接之前尝试过滤掉两个关系的外键上的NULL
,看看是否存在差异。或者,而不是NULL ...也许你有某种默认值或一个显示很多的值。尝试找出实际存在的每个键的数量,并找出爆炸的样子。类似的东西(警告:我实际上并没有测试这段代码,希望它有效):
A1 = LOAD ... -- load dataset 1
B1 = GROUP A1 BY fkey1;
C1 = FOREACH B1 GENERATE group, COUNT_STAR(A1) as cnt1;
A2 = LOAD ... -- load dataset 2
B2 = GROUP A2 BY fkey2;
C2 = FOREACH B2 GENERATE group, COUNT_STAR(A2) as cnt2;
D = JOIN C1 by fkey1, C2 by fkey2; -- do the join on the counts
E = FOREACH D GENERATE fkey1, (cnt1 * cnt2) as cnt; -- multiply out the counts
F = ORDER E BY cnt DESC; -- order it by the highest first
STORE F INTO ...
同样,它可能与爆炸无关。你的一个关系可能只有一个键很多次。例如,在单词计数示例中,以“the”结尾的reducer将比获得“zebra”的计数器要多得多。我不认为这是这种情况,因为只有一个减速器受到重创,这就是为什么我认为#1可能就是这种情况。
如果其中一个键有一些巨大的数字,那就是原因。而且你也知道导致这个问题的关键因素。