我正在运行一个pig脚本,它执行一个groupby和一个嵌套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);
}
在检查慢任务的计数器时,我发现两个reducer处理的数据比其他任务多得多。基本上,我的理解是,数据是非常倾斜的,因此“慢”的任务实际上比“快”的任务做更多的工作。我只是想知道如何提高性能?我讨厌增加平行度来分割工作,但这是唯一的方法吗?
1条答案
按热度按时间bihw5rsg1#
第一个选项是使用自定义分区器。查看上的文档
GROUP
更多信息(请查看PARTITION BY
,具体来说)。不幸的是,您可能需要在这里编写自己的自定义分区器。在您的自定义分区器中,将第一个庞大的密钥集发送到reducer 0,将下一个密钥集发送到reducer 1,然后对剩下的部分执行标准哈希分区。这样做的目的是让一个减速机独占地处理大的减速机,而其他减速机获得多组键。不过,这并不总能解决严重倾斜的问题。这两大数据集的计数有多大价值?我经常看到像这样的事情
NULL
或空字符串。如果它们没那么值钱,就在测试前把它们过滤掉GROUP BY
.