Pig:强制UDF出现在Reducer或设置的映射器数量

时间:2013-03-31 23:21:51

标签: apache-pig

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

如果我无法控制地图制作者的数量,那么无论如何都要强制我的UDF作为减速器发生,因为我可以控制它们吗?

3 个答案:

答案 0 :(得分:4)

  1. 不,您可以明确指定映射器的数量,因为Hadoop不能以这种方式工作。创建的映射器数量大致为total input size / input split size,但如果您有大量小文件(由于HDFS的工作原理而不鼓励这种情况),可能会出现偏差。所以基本上,Pig不允许你这样做,因为Hadoop根据定义没有那个选项。
  2. 否。无论如何,不​​是明确地与猪。还因为“它不会那样工作”。猪编译&为您优化的东西,输出是一个MR作业流。当下一版Pig出现时,你可以轻易改变强制UDF进入减速器的任何黑客行为。如果您觉得在减速器中确实需要UDF,可以创建一个自定义MR作业jar,在其中实现一个直通映射器,然后在reducer中完成工作。您可以使用MAPREDUCE命令从pig中调用它。但是,解决方案听起来不对,你可能会误解某些东西。你可以看看为什么强制减少Pig以获得一个好主意 - DISTINCTLIMITORDER将始终这样做,GROUP通常会这样做好。 JOIN通常会同时获得映射器和缩减器。正如您所看到的,强制减少的操作是利用Hadoop的一些固有特性的操作(如ORDER正在减少因为减速器输入被排序)。没有简单的方法可以在那里潜行UDF,因为没有任何类型的UDF(评估,过滤,加载,存储)可以与减速器轻松配合使用。

答案 1 :(得分:0)

您可以使用“mapred.max.split.size”生成更多数量的地图制作者。拆分适用于某些输入格式和压缩格式。例如,GZ输入不可拆分。 Pig允许组合较小的输入文件。以下是combine small files

的方法

答案 2 :(得分:0)

截至目前的Pig版本,这个技巧总是适用于我,使用DISTINCT,LIMIT,ORDER后嵌套FOREACH中的生成始终作为reducer运行, 对于Eg,

curl_setopt($ch, CURLOPT_REFERER, 'URL'); 
curl_setopt($ch, CURLOPT_FAILONERROR, 0);

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

相关问题