猪 - 性能调整出错后需要提示

pig - need tips after performance tuning gone wrong

我有一个 Pig 脚本大约需要 10 分钟才能完成,我认为仍有一些性能改进的空间。

所以,我首先将 JOINs 和 GROUPs 放在嵌套的 FOREACH 中,并将之前的 FILTERs 放在同一个 [=13] 中=].

我也加了using 'replicated'.

现在的问题是需要 30 多分钟而不是 10 分钟。

除了 PIG 的文档之外,还有什么地方有最佳实践和性能改进技巧吗?

为了得到更好的图片,这里有一些代码:

--before
previous_join = JOIN A by id, B by id --for symplification
filtering = FILTER previous_join BY ((year_min > 1995 ? year_min - 1 : year_min) <= list_year and (year_max > 2015 ? year_max - 1 : year_max) >= list_year);

final_filtered = FOREACH filtering GENERATE user_id as user_id,  list_year;

--after
final_filtered = FOREACH (JOIN A by id, B by id) {
   tmp = FILTER group BY ((A::year_min > 1995 ? A::year_min - 1 : A::year_min) <= B::list_year and (A::year_max > 2015 ? A::year_max - 1 : A::year_max) >= B::list_year and A::premium == 'true');
   GENERATE A::user_id AS user_id, B::list_year AS list_year;
};

是我做错了什么还是方法不对?

谢谢。

在先前的情况下 [before] 您在执行连接后执行过滤和投影。 如果您计算每个操作的时间日志并找出瓶颈操作,将会很有帮助。

您是否也可以尝试将过滤语句拆分为多个关系而不是一个,然后检查过滤时间的差异?

filter_by_min_year = FILTER previous_join BY ((A::year_min > 1995 ? A::year_min - 1 : A::year_min) <= B::list_year);
filter_by_max_year = FILTER filter_by_min_year BY (A::year_max > 2015 ? A::year_max - 1 : A::year_max) >= B::list_year);

总体而言,您希望找到具有 A::year_min <=B::list_year 和 A::year_max >= B::list_year 的 ID(+更多列) 除了对原始 A 和 B 执行联接,您可以尝试对它们都使用投影以仅包含联接和后续操作所需的列。

A-projected = foreach A generate id, year_min, year_max;
B-projected = foreach B generate id, list_year;
C = join A-projected by id, B-projected by id USING 'replicated';

如果 A-projected 或 B-pr​​ojected 中的任何一个是可以使用复制连接加载到内存中的小集合,我假设 B-pr​​ojected 比 A-projected 小。 如果这不适用于您的情况,请跳过此选项。

您也可以尝试使用 PARALLEL 关键字设置用于此连接的 reducer 数量。

应用过滤器后,您将获得所需 ID 的列表,您可以使用这些 ID 从 A 或 B 获取其他信息。

同时考虑调整 MapReduce 属性,例如 io.sort.mb、mapred.job.shuffle.input.buffer.percent 等

希望对您有所帮助。