1

我正在运行一个执行 GROUP BY 和嵌套 FOREACH 的猪脚本,由于一个或两个减少任务,该脚本需要数小时才能运行。例如:

B = GROUP A BY (fld1, fld2) parallel 50;

C = FOREACH B {
   U = A.fld1;
   DIST = DISTINCT U;
   GENERATE FLATTEN(group), COUNT_STAR(DIST);
}

在检查慢任务的计数器后,我意识到这两个 reducer 处理的数据似乎比其他任务多得多。基本上,我的理解是数据非常倾斜,因此“慢”任务实际上比快速任务做更多的工作。我只是想知道如何提高性能?我讨厌增加并行性来尝试拆分工作,但这是唯一的方法吗?

4

1 回答 1

2

第一个选项是使用自定义分区器。查看文档以GROUP获取更多信息(特别是查看PARTITION BY)。不幸的是,您可能必须在此处编写自己的自定义分区程序。在您的自定义分区器中,将第一组巨大的键发送到减速器 0,将下一组键发送到减速器 1,然后对剩下的内容进行标准哈希分区。这样做是让一个减速器专门处理大的,而其他减速器获得多组键。不过,这并不总能解决偏斜严重的问题。

这两组庞大的数据的计数有多大价值?当诸如NULL或空字符串之类的东西时,我会看到很多巨大的偏差。如果它们不是那么有价值,请在GROUP BY.

于 2012-10-15T02:11:58.017 回答