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

Ner*_*ick 2 hadoop mapreduce apache-pig

我有一个我一直在研究的 Pig 脚本,它具有来自 2 个不同数据源的内部联接。这个连接恰好是第一个 MapReducing 导致操作。手头的唯一操作是过滤器和 foreachs。当这个 Join 被执行时,一切都会完美而快速地抛出 map 阶段,但是当涉及到 reduce 阶段时,除了 1 之外的所有 reducer 都完成得很快。然而,1 只是位于阶段的 Reduce 部分,以非常非常缓慢的速度处理数据。可能需要长达一个小时以上的时间,只需等待 1 个减速器完成即可。我尝试增加减速器并切换到倾斜连接,但似乎没有任何帮助。

任何需要研究的想法。

我还做了一个解释,看看我是否能看到任何东西,但这只是显示了一个简单的单一工作流程,没有什么惊人的。

Don*_*ner 5

可能正在发生的事情是一个单一的密钥在双方都有大量的实例并且它正在爆炸。

例如,如果您加入:

x,4      x,'f'
x,5      x,'g'
x,6   X  x,'h'
y,7      x,'i'
Run Code Online (Sandbox Code Playgroud)

... 你会得到 12 双 x!所以你可以想象,如果你在另一个数据集中有 1000 个一个键和 2000 个相同的键,你将从那 2000 行中得到 200 万对。不幸的是,单个减速器不得不承受这次爆炸的冲击力。

添加 reducer 或使用 skew join 在这里无济于事,因为在一天结束时,单个 reducer 需要处理这一对的大爆炸。

这里有几件事要检查:

  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 ...
    
    Run Code Online (Sandbox Code Playgroud)
  3. 同样,它可能与爆炸无关。您的一个关系可能很多次只有一个键。例如,在单词计数示例中,以单词 "the" 结尾的 reducer 将比获得 "zebra" 的reducer 进行更多的计数。我不认为这是这种情况,因为只有一个减速器被锤击,这就是为什么我认为 #1 可能是这种情况。

如果其中一个键的数字很大,这就是原因。而且您还知道导致问题的关键是什么。