我有一个Pig Streaming作业,其中映射器的数量应该等于输入文件中的行数/行数。我知道那个设置
set mapred.min.split.size 16
set mapred.max.split.size 16
set pig.noSplitCombination true
将确保每个块为16个字节。但是,我如何确保每个地图作业只有一行作为输入?这些行是可变长度的,因此使用mapred.min.split.size
和mapred.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
为什么会这样,我不知道!
答案 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是源代码。