我正在运行一个执行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);
}
在检查慢速任务的计数器时,我意识到两个减速器看起来正在处理比其他任务更多的数据。基本上,我的理解是数据非常偏斜,因此“慢”的任务实际上比快速任务做更多的工作。我只是想知道如何提高性能?我讨厌增加并行性以试图分裂工作,但这是唯一的方法吗?
答案 0 :(得分:2)
第一个选项是使用自定义分区程序。 Check out the documentation on GROUP
for more info (check out PARTITION BY
, specifically).不幸的是,您可能必须在此处编写自己的自定义分区程序。在您的自定义分区程序中,将第一组大量密钥发送到reducer 0,将下一组密钥发送到reducer 1,然后在剩下的内容上执行标准散列分区。这样做是让一个reducer专门处理大的,而其他的可以获得多组密钥。但是,这并不能解决歪斜不良的问题。
这两大套数据的计数有多大价值?在NULL
或空字符串之类的东西时,我看到很多偏差。如果它们没有那么有价值,请在GROUP BY
之前将其过滤掉。