2

我正在寻找有关如何通过 Pig 工作提高性能的任何提示。

输入是单个文件 (MB),但对于文件中的每一行,都会执行一个 CPU 密集型任务。

因此,理想的做法是将此文件拆分到我的 Amazon EMR 集群中的许多映射器(和机器)上。

但是我找不到这样做的方法,因为 Hadoop 自然只会以 64(或者是 128?)MB 的间隔分割,所以我只有 1 个映射器!

我看过 NLineInputFormat ( http://www.olenick.com/blog/hadoop-for-small-data/ ),但这是针对旧 API 的,也不确定它如何与 Pig 一起使用。

为了使事情进一步复杂化,我正在使用 CSVExcelStorage piggybank loadfunc 进行加载。

谢谢

邓肯

4

3 回答 3

2

解决了。

这需要更多的参数设置。我并不是说您需要设置所有这些,但我没有时间进行反复试验以查看最低要求的设置是多少。非常高兴在此得到纠正!

将以下内容放在猪脚本的顶部:

SET mapred.max.split.size 131072; -- 128KB
SET mapred.min.split.size 131072;
SET default_parallel 2;
SET pig.noSplitCombination true; 
SET mapred.max.jobs.per.node 1;

我已经将我的块设置为 128KB,因为我的输入真的那么小!

另外,设置dfs块大小。在 Amazon EMR 中,通过设置以下 Boostrap 操作来执行此操作:

--hdfs-key-value dfs.block.size=131072

通过查看输出,我们可以看到这已经奏效:

Job Stats (time in seconds): JobId Maps Reduces MaxMapTime MinMapTIme AvgMapTime MedianMapTime MaxReduceTime MinReduceTime AvgReduceTime MedianReducetime Alias Feature Outputs job_201309111450_0001 14 0 15 9 11 12 0 0 0 0 A,cleansed,nostop MAP_ONLY s3n://mybucket/out42,

所以我们可以看到使用了 14 个映射器。还生成了 14 个部分(在我的情况下),总运行时间与单个记录的时间相同(在我的情况下为 4 分钟)。

于 2013-09-11T15:12:41.217 回答
1

尝试使输入拆分尽可能小。设置此属性:

SET mapred.max.split.size  1000; -- or whatever

该数字是以字节为单位的拆分大小。如果您有一个 30 MB 的文件并想要 3000 个映射器(例如),请尝试将最大拆分大小设置为10000.

于 2013-09-10T18:13:45.793 回答
1

这不是一个详细的解决方案,只是一个大致的想法......

您可以通过在 reduce 阶段(而不是 map 阶段)执行 UDF 来解决这个问题,并使用 PIG 的并行功能来控制 reducer 的数量。为了给你一个提示,你可以设置脚本的默认减速器数量(例如 40 个):

SET default_parallel 40;

强制 UDF 在 reducer 中运行的一种方法是执行 GROUP,然后通过每个组调用 UDF。

例如

ag = 按 x PARALLEL 40 分组;b = FOREACH ag GENERATE yourUdf(a);

一个组需要一个排序阶段,因此该组之后的 FOREACH 将在减速器中运行。

如果您没有一个好的密钥可供选择,您可以尝试 GROUP a ALL,它可能会起作用。此外,您需要更改 UDF 以接收 DataBag 而不是元组或标量,因为每个组都作为包传递。实现起来可能有点棘手,但一旦完成,它就非常简单和优雅。

如果您的脚本中已经有一个 GROUP,您可以使用它并保存额外的 map-reduce 作业。还有其他条款也强制您可能要考虑的减少阶段。

大卫

于 2013-09-10T22:07:42.153 回答