Performance 如何强制PigStorage输出几个大文件而不是数千个小文件?

Performance 如何强制PigStorage输出几个大文件而不是数千个小文件?,performance,hadoop,hdfs,apache-pig,Performance,Hadoop,Hdfs,Apache Pig,我在我的猪脚本中使用了以下几行: set default_parallel 20; requests = LOAD ‘/user/me/todayslogs.gz’ USING customParser; intermediate_results = < some-processing ... > some_data = FOREACH intermediate_results GENERATE day, request_id, result; STORE some_data INT

我在我的猪脚本中使用了以下几行:

set default_parallel 20;
requests = LOAD ‘/user/me/todayslogs.gz’ USING customParser;
intermediate_results = < some-processing ... >
some_data = FOREACH intermediate_results GENERATE day, request_id, result;
STORE some_data INTO '/user/me/output_data' USING PigStorage(',');

如何强制PigStorage将输出写入更少的输出文件?

发生这种情况的原因是因为您的作业仅限于映射。在处理过程中不需要reduce阶段,因此每个映射器都将记录输出到自己的文件中,最终每个映射器都有一个文件。如果有数千个输入文件,则有数千个输出文件

当您使用ORDER BY时,这种情况消失的原因是,这会触发一个reduce阶段,此时默认的并行度为20

如果您想避免这种行为,您必须以某种方式强制执行reduce阶段。由于您已经在执行一个
加入
,您可以选择不使用“复制的”执行此
。或者,如果您处于不进行连接的情况下,您可以使用do nothing
GROUP BY
强制连接,如下所示:

reduced = FOREACH (GROUP some_data BY RANDOM()) GENERATE FLATTEN(some_data);

您可能希望组合多个输入文件并将其输入到单个映射器中。以下链接应该对您有所帮助。


您可能希望对第一个脚本和第二个脚本都执行此操作。

另一种解决方案是在作业后运行脚本,将小文件连接到大文件。

您能否发布一些代码,说明如何定义某些数据?像@Fred comments一样,您需要使用较少数量的简化程序,或者通过另一个步骤将文件与少量简化程序组合在一起。您使用的是什么操作?如果您的作业是仅映射,则每个映射程序都将创建自己的输出文件。@WinnieNicklaus我怀疑这就是所发生的情况。
获得
中间结果的方法是什么?它是否使用
分组方式
加入方式
?或者只是
FOREACH
FILTER
,诸如此类?@WinnieNicklaus包含一个连接。。。使用“已复制”,后跟筛选器。就这样。No GROUP BY.reduced=FOREACH(按轮(20*RANDOM())对一些_数据进行分组)生成展平(一些_数据);通过将负载更均匀地分布在减速器上,给了我更好的结果。
reduced = FOREACH (GROUP some_data BY RANDOM()) GENERATE FLATTEN(some_data);