2013-03-31 31 views
3

我有一个猪脚本,运行一个非常耗时的UDF。猪似乎将UDF设置为作为地图作业运行而不是减少作业。结果,创建一个次优的少量映射器来运行这项工作。我知道我可以使用setDefaultParallel以及PigLatin中的PARALELL x命令设置用于猪的缩减器的默认数量,以设置给定生产线的缩减器的数量。但是,我如何设置mappers的数量呢?通过定义我自己的InputSplit大小,我已经看到有关增加映射器数量的文章,但我想明确地将映射器的数量设置为主机数量*内核数量,文件大小与它无关。猪:强制UDF发生在减速器或设定的映射器数量

如果我无法控制mappers的数量,是否有强迫我的UDF作为reducer出现,因为我可以控制这些?

回答

4
  1. 没有,你可以不指定映射器的数量明确,只是因为Hadoop的不工作的方式。创建的映射器的数量大致为total input size/input split size,但如果您有大量小文件(由于HDFS的工作原理而不鼓励使用),则映射器可能会偏斜。所以基本上,Pig不会让你这样做,因为Hadoop根据定义没有这个选项。
  2. 不可以。也因为“它不以那种方式工作”。猪编译&为你优化事情,输出是一个MR工作流。当下一个版本的猪出现时,任何用于强制UDF进入减速器的窍门都可以轻松改变。如果你觉得你真的需要在Reducer中使用UDF,你可以创建一个自定义MR作业jar,在其中实现一个drop-through mapper,然后在reducer中完成你的工作。你可以用MAPREDUCE指令从猪身上调用。但是,解决方案听起来不对,您可能会误解某些内容。你可以看看是什么迫使猪减少得到大的想法 - 一个DISTINCT,LIMITORDER将永远这样做,GROUP通常也会做。 A JOIN通常会同时得到一个映射器和一个reducer。正如你所看到的,强制减少的操作是利用Hadoop某些固有特性的操作(例如ORDER处于减少状态,因为reducer输入被排序)。没有简单的方法可以偷偷在那里使用UDF,因为没有UDF类型(eval,filter,load,store)可以轻松地与reducer一起使用。
+0

啊,那太臭了......哦,谢谢。 – Manny

0

您可以通过使用“mapred.max.split.size”来产生更多数量的映射器。分割适用于某些输入格式和压缩格式。例如,GZ输入不可拆分。 Pig允许将较小的输入文件组合在一起。下面是如何combine small files

0

由于目前猪版的,这一招总是对我的作品,在嵌套FOREACH的生成使用DISTINCT,LIMIT后,订单始终运行作为还原剂, 用于例如,

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

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

相关问题