我使用自定义InputFormat
和RecordReader
创建了自定义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);
我确保loadFunc返回2个输入拆分,但不知何故只创建了一个PigSplit。 任何线索都可以解决这个问题。
编辑2:所以我下载了猪0.13的源代码并编译了它并运行了我的脚本,令人惊讶的是它工作正常并且当我这样做时使用了两个拆分,遗憾的是我无法在服务器节点上执行此操作。 我注意到,创建inputsplits的堆栈跟踪在cloudera中的现成编译版本和我编译的下载版本之间是不同的。
cloudera版本使用org.apache.pig.backend.hadoop.executionengine.mapReduceLayer.PigInputFormat
创建InputSplits,而下载的版本使用org.apache.pig.impl.io.ReadToEndLoader
我真的对这个感到困惑。
答案 0 :(得分:0)
因此,经过调查,结果发现Pig版本&lt; = 0.13中存在一个错误,假设每个InputSplit应该有一个长度(它总是假设它正在从文件中读取),因为在我的例子中是CustomInputSplit.getLength返回0,然后猪只采取第一个InputSplit并离开其他人。 解决方法是返回输入拆分的getLength中的任何值。
正如我在问题中所提到的,加载InputSplits的行为在此之后发生了变化,在这些情况下无需解决问题。