gpt4 book ai didi

hadoop - pig : Force one mapper per input line/row

转载 作者:可可西里 更新时间:2023-11-01 14:18:59 27 4
gpt4 key购买 nike

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

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

将确保每个 block 为 16 个字节。但是我如何确保每个 map 作业都只有一行作为输入?这些行的长度是可变的,因此对 mapred.min.split.sizemapred.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 脚本中设置 pig.noSplitCombination 不起作用。在 Pig 脚本中,您需要使用 pig.splitCombination。然后Pig会根据pig.splitCombination的值设置JobConf中的pig.noSplitCombination

如果要直接设置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 属性中获取值。所以你的设置没有效果。 Here是源代码。正如您提到的,正确的方法是 set pig.splitCombination false

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

最后,PigInputFormat 从JobConf 中读取pig.noSplitCombination 来决定是否使用该组合。 Here是源代码。

关于hadoop - pig : Force one mapper per input line/row,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17054880/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com