4

我有一个运行非常耗时的 UDF 的猪脚本。Pig 似乎将 UDF 设置为作为映射作业而不是缩减作业运行。结果,创建了少量的映射器来运行该作业。我知道我可以设置在 pig 中使用的默认减速器数量,setDefaultParallel也可以使用PARALELL xPigLatin 中的命令来设置给定行的减速器数量。但是我该怎么做才能设置映射器的数量呢?我已经看到有关通过定义我自己的 InputSplit 大小来增加映射器数量的帖子,但我想将映射器的数量明确设置为主机数 * 核心数,文件大小不应该与它有任何关系。

如果我无法控制映射器的数量,是否有强制我的 UDF 作为减速器出现,因为我可以控制它们?

4

3 回答 3

4
  1. 不,您不能仅仅因为 Hadoop 不能那样工作而明确指定映射器的数量。创建的映射器数量大致为total input size/ input split size,但如果您有大量小文件(由于 HDFS 的工作方式不鼓励这样做),则可能会出现偏差。所以基本上,Pig 不允许你这样做,因为 Hadoop 根据定义没有该选项。
  2. 不,无论如何,不​​会明确与 Pig 一起使用。也因为“它不是那样工作的”。Pig 为您编译和优化东西,输出是一个 MR 作业流。当下一版本的 Pig 发布时,您为强制 UDF 进入减速器所做的任何 hack 都可以轻松更改。如果你觉得你真的需要在 reducer 中使用 UDF,你可以创建一个自定义 MR 作业 jar,在其中实现一个 drop-through 映射器,然后在 reducer 中完成你的工作。MAPREDUCE你用命令从 pig 调用它。但是,该解决方案听起来是错误的,您可能会误解某些内容。你可以看看是什么迫使 Pig 获得了大的想法—— a DISTINCTLIMIT并且ORDER总是会这样做, aGROUP通常也会这样做。一种JOIN通常会得到一个映射器和一个reducer。如您所见,强制 reduce 的操作是利用 Hadoop 的一些内在特性的操作(例如ORDER因为 reducer 输入已排序而处于 reduce 中)。没有简单的方法可以将 UDF 潜入其中,因为没有任何类型的 UDF(eval、filter、load、store)可以轻松地与 reducer 一起使用。
于 2013-04-01T12:21:27.280 回答
0

您可以使用“mapred.max.split.size”对生成更多映射器进行一些控制。拆分适用于某些输入格式和压缩格式。例如,GZ 输入不可拆分。Pig 允许合并较小的输入文件。这是组合小文件的方法

于 2013-07-01T16:07:57.777 回答
0

从当前的 Pig 版本开始,这个技巧总是对我有用,使用 DISTINCT、LIMIT、ORDER 后在嵌套的 FOREACH 中生成总是作为减速器运行,例如,

A = FOREACH (GROUP DATA BY some_unique_field/all fields){
    LIMIT DATA.field 1;
    GENERATE udf.func(fields);
}

这些还会删除数据中的所有重复行。

于 2016-06-24T05:44:37.583 回答