我正在运行一个pig脚本,它执行GROUP BY和嵌套的FOREACH,由于一个或两个reduce任务,它需要几个小时才能运行。例如:
B = GROUP A BY (fld1, fld2) parallel 50;
C = FOREACH B {
U = A.fld1;
DIST = DISTINCT U;
GENERATE FLATTEN(group), COUNT_STAR(DIST);
}在检查慢任务的计数器后,我意识到这两个reducers处理的数据比其他任务多得多。基本上,我的理解是数据是非常不对称的,所以“慢”的任务实际上比快的任务做了更多的工作。我只是想知道如何提高性能?我讨厌通过增加并行度来拆分工作,但这是唯一的方法吗?
发布于 2012-10-15 10:11:58
第一个选项是使用自定义分区程序。Check out the documentation on GROUP for more info (check out PARTITION BY, specifically).不幸的是,您可能必须在此处编写自己的自定义分区程序。在您的自定义分区程序中,将第一个巨大的键集发送到reducer 0,将下一个键集发送到reducer 1,然后对剩下的部分进行标准的散列分区。这样做的目的是让一个reducer独占处理大的,而其他的获得多组密钥。然而,这并不总是能解决严重倾斜的问题。
这两个庞大的数据集的价值有多大?当像NULL或空字符串这样的东西时,我看到了很大的偏差。如果它们不是那么有价值,那么在GROUP BY之前过滤掉它们。
https://stackoverflow.com/questions/12867846
复制相似问题