Pig:每个输入行/行强制一个映射器

时间:2013-06-11 22:25:39

标签: hadoop mapreduce apache-pig

我有一个Pig Streaming作业,其中映射器的数量应该等于输入文件中的行数/行数。我知道那个设置

set mapred.min.split.size 16 
set mapred.max.split.size 16
set pig.noSplitCombination true 

将确保每个块为16个字节。但是,我如何确保每个地图作业只有一行作为输入?这些行是可变长度的,因此使用mapred.min.split.sizemapred.max.split.size的常数不是最佳解决方案。

以下是我打算使用的代码:

input = load 'hdfs://cluster/tmp/input';
DEFINE CMD `/usr/bin/python script.py`;
OP = stream input through CMD;
dump OP;

解决了!感谢zsxwing

而且,如果其他人遇到这种奇怪的废话,请知道:

要确保Pig为每个输入文件创建一个映射器,您必须设置

set pig.splitCombination false

set pig.noSplitCombination true

为什么会这样,我不知道!

1 个答案:

答案 0 :(得分:6)

根据你的线索,我浏览了猪源代码以找出答案。

在Pig脚本中设置pig.noSplitCombination不起作用。在Pig脚本中,您需要使用pig.splitCombination。然后,Pig会根据pig.noSplitCombination的值在 JobConf 中设置pig.splitCombination

如果要直接设置pig.noSplitCombination,则需要使用命令行。例如,

pig -Dpig.noSplitCombination=true -f foo.pig

这两种方式的区别在于:如果在Pig脚本中使用 set 指令,它将存储在Pig属性中。如果您使用 -D ,则会将其存储在Hadoop配置中。

如果您使用set pig.noSplitCombination true,则(pig.noSplitCombination,true)会存储在Pig属性中。但是当Pig想要初始化 JobConf 时,它会使用Pig属性中的pig.splitCombination来获取值。所以你的设置没有效果。 Here是源代码。正如您所提到的,正确的方法是set pig.splitCombination false

如果您使用-Dpig.noSplitCombination=true,则(pig.noSplitCombination,true)会存储在Hadoop配置中。由于 JobConf 是从配置复制的,因此 -D 的值会直接传递给 JobConf

最后,PigInputFormat从 JobConf 中读取pig.noSplitCombination以决定是否使用该组合。 Here是源代码。