Pig Inner Join生产一个带有1个悬挂减速器的作业



我一直在处理一个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万对。不幸的是,单个减速器不得不承受这次爆炸的冲击力。

添加减速器或使用斜联接在这里没有帮助,因为归根结底,一个减速器需要处理这一对的大爆炸。

以下是一些需要检查的内容:

  1. 听起来似乎只有一个联接键导致了这个问题,因为只有一个减速器受到了冲击。常见的罪魁祸首是NULL。其中任意一个中的列可以为NULL吗?如果是这样的话,它会发生巨大的爆炸!在运行联接之前,请尝试过滤掉两个关系的外键上的NULL,看看是否存在差异。或者,代替NULL。。。也许你有某种默认值,或者一个经常显示的值
  2. 试着弄清楚每把钥匙实际上有多少,并弄清楚爆炸会是什么样子。类似(警告:我实际上并没有测试这个代码,希望它能工作):

    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 ...
    
  3. 同样,它可能与爆炸无关。你的一个亲戚可能有很多次只有一把钥匙。例如,在单词计数示例中,以单词"the"结尾的减号器将比以"zebra"结尾的要多得多。我不认为这里是这样的,因为你的减速器中只有一个受到了冲击,这就是为什么我认为#1可能是这样。

如果你有一把钥匙的大号码,那就是为什么。你也知道是什么关键导致了这个问题。

相关内容

  • 没有找到相关文章