我有一个Pig Streaming作业,其中映射器的数量应该等于输入文件中的行/行数。我知道这个设置
set mapred.min.split.size 16
set mapred.max.split.size 16
set pig.noSplitCombination true
将确保每个块为16字节。但是如何确保每个map作业只有一行作为输入呢?线的长度是可变的,所以对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
为什么会这样,我不知道!
根据你的提示,我浏览了Pig的源代码来寻找答案。
设置pig.noSplitCombination
在Pig脚本不工作。在Pig脚本中,您需要使用pig.splitCombination
。然后Pig将根据pig.splitCombination
的值设置JobConf中的pig.noSplitCombination
。
如果要直接设置pig.noSplitCombination
,需要使用命令行。例如,
pig -Dpig.noSplitCombination=true -f foo.pig
这两种方式的区别在于:如果在Pig脚本中使用set指令,它将被存储在Pig属性中。如果你使用-D,它存储在Hadoop Configuration中。
如果使用set pig.noSplitCombination true
,则(猪)。noSplitCombination, true)存储在Pig属性中。但是当Pig想要初始化一个JobConf时,它使用pig.splitCombination
从Pig属性中获取值。所以你的设置没有效果。这里是源代码。正确的方法是你提到的set pig.splitCombination false
。
如果您使用-Dpig.noSplitCombination=true
, (猪。noSplitCombination, true)存放在Hadoop Configuration中。由于JobConf是从Configuration复制过来的,所以-D的值直接传递给JobConf。
最后,PigInputFormat从JobConf中读取pig.noSplitCombination
来决定是否使用该组合。以下是源代码