猪为什么运行多个 mapreduce 进程?

pig why it runs more than one mapreduce process?

我有一个复杂的 pig 脚本。从它的日志中我可以看到它连续跨越 2 或 3 个 MR 进程,具体取决于数据量。 (比方说,A 和 B)

PS: B只在A完成后触发

这是预期的吗?有没有办法找出我的 pig 脚本的哪一部分触发了哪个 map reduce 进程? 我的最终目标是将 pig 脚本优化到 运行 更快。

我的任务的简单版本如下。这个 Pig 脚本会遍历来自不同应用程序的大量日志文件。对于每个日志,它使用正则表达式解析数据并报告流量计数、每小时各种维度的平均响应时间等指标

代码真的很长,并且使用过滤器执行多个 for-each,一个连接和一个具有多个维度的大 GROUP BY。

这种行为可能是因为你的 yarn 容器变满了,正如你所说的你有大数据集,所以 pig 在内部触发 map reducers 并且每个 reduce 任务可能正在谈论整个 yarn 容器因此在成功执行 1 个任务后休息任务将被执行。您可以使用 ambari 控制台 (gui) 或使用命令

检查您的 MR 作业统计信息
hadoop job -list

或者试试 yarn application -list(hadoop 2.3 及以上版本) 这将显示每个任务分配的所有作业列表和内存大小

关于问题的第二部分,即 Pig 脚本优化

你可以设置 mapreduce parallel 属性 like

SET default_parallel XXX 

其中 xxx 是您的减速器数量

您可以使用 EXPLAINview Pig's execution plan 作为您的脚本。你会得到这样的输出:

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 ...  

然后,查看 Optimization Rules and Performance Enhancers 调整管道的机会。