猪 - 性能调整出错后需要提示
pig - need tips after performance tuning gone wrong
我有一个 Pig 脚本大约需要 10 分钟才能完成,我认为仍有一些性能改进的空间。
所以,我首先将 JOIN
s 和 GROUP
s 放在嵌套的 FOREACH
中,并将之前的 FILTER
s 放在同一个 [=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-projected 中的任何一个是可以使用复制连接加载到内存中的小集合,我假设 B-projected 比 A-projected 小。
如果这不适用于您的情况,请跳过此选项。
您也可以尝试使用 PARALLEL 关键字设置用于此连接的 reducer 数量。
应用过滤器后,您将获得所需 ID 的列表,您可以使用这些 ID 从 A 或 B 获取其他信息。
同时考虑调整 MapReduce 属性,例如 io.sort.mb、mapred.job.shuffle.input.buffer.percent 等
希望对您有所帮助。
我有一个 Pig 脚本大约需要 10 分钟才能完成,我认为仍有一些性能改进的空间。
所以,我首先将 JOIN
s 和 GROUP
s 放在嵌套的 FOREACH
中,并将之前的 FILTER
s 放在同一个 [=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-projected 中的任何一个是可以使用复制连接加载到内存中的小集合,我假设 B-projected 比 A-projected 小。 如果这不适用于您的情况,请跳过此选项。
您也可以尝试使用 PARALLEL 关键字设置用于此连接的 reducer 数量。
应用过滤器后,您将获得所需 ID 的列表,您可以使用这些 ID 从 A 或 B 获取其他信息。
同时考虑调整 MapReduce 属性,例如 io.sort.mb、mapred.job.shuffle.input.buffer.percent 等
希望对您有所帮助。