我有一个复杂的猪脚本。从它的日志中,我可以看到它依次跨越2或3个MR进程,这取决于数据量。(比方说,A &B)
PS:只有在A完成后才触发B
这是预期的吗?是否有一种方法来找出我的猪脚本的哪个部分触发哪个地图减少过程?我的最终目标是优化pig脚本,使其运行得更快。
我的任务的简单版本如下。这个Pig脚本遍历来自不同应用程序的大量日志文件。对于每个日志,它使用正则表达式解析数据,并报告诸如流量计数、每小时各个维度的平均响应时间等指标
代码真的很长,并且使用过滤器执行多个for-each,一个join &
您可以使用EXPLAIN
查看Pig的脚本执行计划。您将得到如下输出:
A = LOAD 'student' AS (name:chararray, age:int, gpa:float);
B = GROUP A BY name;
C = FOREACH B GENERATE COUNT(A.age);
EXPLAIN C;
-----------------------------------------------
Logical Plan:
-----------------------------------------------
Store xxx-Fri Dec 05 19:42:29 UTC 2008-23 Schema: {long} Type: Unknown
|
|---ForEach xxx-Fri Dec 05 19:42:29 UTC 2008-15 Schema: {long} Type: bag
etc ...
-----------------------------------------------
Physical Plan:
-----------------------------------------------
Store(fakefile:org.apache.pig.builtin.PigStorage) - xxx-Fri Dec 05 19:42:29 UTC 2008-40
|
|---New For Each(false)[bag] - xxx-Fri Dec 05 19:42:29 UTC 2008-39
| |
| POUserFunc(org.apache.pig.builtin.COUNT)[long] - xxx-Fri Dec 05
etc ...
--------------------------------------------------
| Map Reduce Plan
-------------------------------------------------
MapReduce node xxx-Fri Dec 05 19:42:29 UTC 2008-41
Map Plan
Local Rearrange[tuple]{chararray}(false) - xxx-Fri Dec 05 19:42:29 UTC 2008-34
| |
| Project[chararray][0] - xxx-Fri Dec 05 19:42:29 UTC 2008-35
etc ...
然后,查看优化规则和性能增强器,以寻找调整管道的机会。
这种行为可能是可能的,因为你的纱线容器已经满了,正如你所说的,你有大量的数据集,所以猪在内部触发地图减少器,每个减少任务可能会谈论整个纱线容器,因此在成功执行1个任务后,休息任务将被执行。您可以使用ambari控制台(gui)或使用命令
检查MR作业统计信息。hadoop job -list
或试一试yarn application -list
(hadoop 2.3及以上版本)这将显示所有作业列表和每个任务分配的内存大小
为你的问题的第二部分,即,为Pig脚本优化
你可以设置mapreduce的并行属性,如
SET default_parallel XXX
其中XXX为减速机数量