6

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

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

将确保每个块为 16 个字节。但是如何确保每个地图作业都只有一行作为输入?这些行是可变长度的,因此使用一个常数来表示mapred.min.split.sizeandmapred.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

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

4

1 回答 1

7

按照您的提示,我浏览了 Pig 源代码以找出答案。

pig.noSplitCombination在 Pig 脚本中设置不起作用。在 Pig 脚本中,您需要使用pig.splitCombination. 然后 Pig 会根据 的值pig.noSplitCombinationJobConfpig.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.splitCombination来自 Pig 的属性来获取值。所以你的设置没有效果。是源代码。正确的方法是set pig.splitCombination false你提到的。

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

最后,PigInputFormatpig.noSplitCombinationJobConf中读取来决定是否使用组合。是源代码。

于 2013-06-14T02:03:34.033 回答