我一直在处理一个Pig脚本,该脚本具有来自两个不同数据源的内部联接。此联接恰好是引起MapReducing的第一个操作。手之前的唯一操作是过滤器和foreach。当这个Join执行时,所有的东西都完美而快速地抛出了映射阶段,但当它进入reduce阶段时,除了1之外,所有的reducer都很快完成。然而,1只是坐在阶段的Reduce部分,以非常非常慢的速度处理数据。只需等待1个减速器就可以完成,这可能需要一个小时以上。我尝试过增加减速器,也尝试过切换到倾斜联接,但似乎没有任何帮助。
任何需要调查的想法。
我还做了一个解释,看看我是否能看到什么,但这只是显示了一个简单的单一工作流程,没有什么令人惊讶的。
很可能发生的情况是,单个密钥的两侧都有大量实例,并且正在爆炸。
例如,如果您加入:
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"结尾的减号器将比以"zebra"结尾的要多得多。我不认为这里是这样的,因为你的减速器中只有一个受到了冲击,这就是为什么我认为#1可能是这样。
如果你有一把钥匙的大号码,那就是为什么。你也知道是什么关键导致了这个问题。