我有一个pig流工作,其中Map器的数量应该等于输入文件中的行数。我知道那个场景
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为您必须设置的每个输入文件创建一个Map器
set pig.splitCombination false
而不是
set pig.noSplitCombination true
为什么会这样,我不知道!
1条答案
按热度按时间hlswsv351#
根据你的线索,我浏览了Pig的源代码以找出答案。
套
pig.noSplitCombination
在Pig的剧本里是行不通的。在pig脚本中,您需要使用pig.splitCombination
. 然后,Pig将设置pig.noSplitCombination
在jobconf中根据pig.splitCombination
.如果你想设置
pig.noSplitCombination
您需要直接使用命令行。例如,这两种方法的区别是:如果在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是从配置中复制的,因此-d的值直接传递给jobconf。最后,piginputformat读取
pig.noSplitCombination
从jobconf来决定是否使用组合。这是源代码。