pig-性能调优出错后需要提示

8e2ybdfx  于 2021-06-25  发布在  Pig
关注(0)|答案(1)|浏览(385)

我有一个Pig脚本,花了大约10分钟完成,我认为仍然有一些性能改进的空间。
所以,我先把 JOIN s和 GROUP 在嵌套的 FOREACH 并且把前面的 FILTER 在同一个房间里 FOREACH .
我还补充道 using 'replicated' .
现在的问题是,不是花10分钟,而是花了30多分钟。
除了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;
};

是我做错了什么还是这是一个错误的方法?
谢谢。

mklgxw1f

mklgxw1f1#

在前一种情况下,[之前]在执行联接之后执行过滤和投影。如果您计算每个操作的时间日志并确定瓶颈操作,这将很有帮助。
您是否也可以尝试将筛选语句拆分为多个关系而不是一个关系,并检查筛选计时的差异?

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\u min<=b::list\u year和a::year\u max>=b::list\u year的ID(+更多的列),而不是对原始a&b执行联接,可以尝试在这两个ID上使用投影,以便只包含联接和以后操作所需的列。

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-projected中的任何一个都是一个可以使用复制联接加载到内存中的小集合,那么我假设b-projected是一个比a-projected更小的集合。如果这不适用于您的情况,请跳过此选项。
您还可以尝试使用parallel关键字来设置要用于此联接的减速器的数量。
应用过滤器后,您将获得所需id的列表,您可以使用该列表从a或b获取其他信息。
还可以考虑调整mapreduce属性,如io.sort.mb、mapred.job.shuffle.input.buffer.percent等。
希望这有帮助。

相关问题