pig:强制每个输入行/行一个Map器

uqjltbpv  于 2021-06-04  发布在  Hadoop
关注(0)|答案(1)|浏览(323)

我有一个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

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

hlswsv35

hlswsv351#

根据你的线索,我浏览了Pig的源代码以找出答案。
pig.noSplitCombination 在Pig的剧本里是行不通的。在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.splitCombination 从Pig的属性。所以你的设置没有效果。这是源代码。正确的方法是 set pig.splitCombination false 如你所说。
如果你使用 -Dpig.noSplitCombination=true ,(pig.nosplitcombination,true)存储在hadoop配置中。由于jobconf是从配置中复制的,因此-d的值直接传递给jobconf。
最后,piginputformat读取 pig.noSplitCombination 从jobconf来决定是否使用组合。这是源代码。

相关问题