性能—如何强制pigstorage输出几个大文件而不是数千个小文件?

pgx2nnw8  于 2021-06-03  发布在  Hadoop
关注(0)|答案(3)|浏览(293)

我在我的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 INTO '/user/me/output_data' USING PigStorage(',');

“/user/me/todayslogs.gz”包含数千个gzip文件,每个文件大小为200MB。
当脚本完成时,“/user/me/output\u data”在hdfs上有数千个小文件(<1kb)。
我必须在另一个pig脚本中读取“/user/me/output\u data”中的文件,以便进一步处理。我知道那会影响表演。如果某些数据输出的文件是gzip-ed,则性能会更差。
这是mapreducelauncher的输出。

2013-11-04 12:38:11,961 [main] INFO  org.apache.pig.backend.hadoop.executionengine.mapReduceLayer.MapReduceLauncher - Processing aliases campaign_join,detailed_data,detailed_requests,fields_to_retain,grouped_by_reqid,impressions_and_clicks,minimal_data,ids_cleaned,request_id,requests,requests_only,requests_typed,xids_from_request
2013-11-04 12:38:11,961 [main] INFO  org.apache.pig.backend.hadoop.executionengine.mapReduceLayer.MapReduceLauncher - detailed locations: M: requests[30,11],campaign_join[35,16],null[-1,-1],null[-1,-1],detailed_requests[37,20],detailed_data[39,16],null[-1,-1],minimal_data[49,15],null[-1,-1],ids_cleaned[62,18],grouped_by_reqid[65,21] C:  R: null[-1,-1],xids_from_request[66,21],impressions_and_clicks[69,26],fields_to_retain[70,20],requests_only[67,17],request_id[68,18],requests_typed[73,17]

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

gywdnpxw

gywdnpxw1#

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

k4emjkb1

k4emjkb12#

发生这种情况的原因是因为你的工作只是Map。在处理过程中不需要reduce阶段,因此每个Map器都会将记录输出到自己的文件中,最终每个Map器只有一个文件。如果有数千个输入文件,那么就有数千个输出文件。
当你使用 ORDER BY 因为这会触发一个reduce阶段,此时默认的并行度20开始起作用。
如果你想避免这种行为,你必须以某种方式强制一个reduce阶段。既然你已经在做 JOIN ,你可以选择不这样做 USING 'replicated' . 或者,如果您处于不执行连接的情况下,可以使用“不执行任何操作”强制执行连接 GROUP BY ,就像这样:

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

qcuzuvrc3#

您可能需要合并多个输入文件并将其输入到单个Map器中。下面的链接应该对您有所帮助。
http://pig.apache.org/docs/r0.10.0/perf.html#combine-文件
您可能希望为第一个脚本和第二个脚本执行此操作。

相关问题