如何提高具有非常偏差数据的猪作业的表现?

时间:2012-10-12 22:15:50

标签: apache-pig

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

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

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

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

1 个答案:

答案 0 :(得分:2)

第一个选项是使用自定义分区程序。 Check out the documentation on GROUP for more info (check out PARTITION BY, specifically).不幸的是,您可能必须在此处编写自己的自定义分区程序。在您的自定义分区程序中,将第一组大量密钥发送到reducer 0,将下一组密钥发送到reducer 1,然后在剩下的内容上执行标准散列分区。这样做是让一个reducer专门处理大的,而其他的可以获得多组密钥。但是,这并不能解决歪斜不良的问题。

这两大套数据的计数有多大价值?在NULL或空字符串之类的东西时,我看到很多偏差。如果它们没有那么有价值,请在GROUP BY之前将其过滤掉。