Pig自定义loadFunc总是使用1个mapper和1个inputSplit

时间:2014-12-10 09:01:47

标签: java hadoop mapreduce apache-pig

我使用自定义InputFormatRecordReader创建了自定义loadFunc。 每当InputFormat返回多个输入分割时,PigSplit始终只包含一个输入分割,并且只使用一个映射器。

实施太大了,无法在此处发布,但是有任何明显的原因可能会发生这种情况吗?

编辑:我正在使用pig 0.13并添加了一些我发现的日志记录 InputFormat创建的Loadfunc会返回包含两个输入拆分的列表,然后PigInputFormat会使用此列表创建PigSplits

我仍然无法找出Pig在哪里省略了其中一个输入分割而只使用了第一个。

这是来自PigInputFormat.java(src)第273行的代码

 InputFormat inpFormat = loadFunc.getInputFormat();
 List<InputSplit> oneInputSplits = inpFormat.getSplits(
 HadoopShims.createJobContext(inputSpecificJob.getConfiguration(), jobcontext.getJobID()));
 List<InputSplit> oneInputPigSplits = getPigSplits(oneInputSplits, i, inpTargets.get(i), HadoopShims.getDefaultBlockSize(fs, isFsPath? path: fs.getWorkingDirectory()),
combinable, confClone);
splits.addAll(oneInputPigSplits);

我确保loa​​dFunc返回2个输入拆分,但不知何故只创建了一个PigSplit。 任何线索都可以解决这个问题。

编辑2:所以我下载了猪0.13的源代码并编译了它并运行了我的脚本,令人惊讶的是它工作正常并且当我这样做时使用了两个拆分,遗憾的是我无法在服务器节点上执行此操作。 我注意到,创建inputsplits的堆栈跟踪在cloudera中的现成编译版本和我编译的下载版本之间是不同的。

cloudera版本使用org.apache.pig.backend.hadoop.executionengine.mapReduceLayer.PigInputFormat创建InputSplits,而下载的版本使用org.apache.pig.impl.io.ReadToEndLoader

我真的对这个感到困惑。

1 个答案:

答案 0 :(得分:0)

因此,经过调查,结果发现Pig版本&lt; = 0.13中存在一个错误,假设每个InputSplit应该有一个长度(它总是假设它正在从文件中读取),因为在我的例子中是CustomInputSplit.getLength返回0,然后猪只采取第一个InputSplit并离开其他人。 解决方法是返回输入拆分的getLength中的任何值。

正如我在问题中所提到的,加载InputSplits的行为在此之后发生了变化,在这些情况下无需解决问题。