可以使用简单的测试重现该问题 “猪”脚本如下:
SET pig.noSplitCombination true;
dataIn = LOAD 'input/Test';
DEFINE macro `TestScript` input('DummyInput.txt') output('A.csv', 'B.csv', 'C.csv', 'D.csv', 'E.csv') ship('TestScript');
dataOut = STREAM dataIn through macro;
STORE dataOut INTO 'output/Test';
实际的脚本是一个复杂的R程序,但这里是一个简单的“TestScript”,可以重现问题并且不需要R:
# Ignore the input coming from the 'DummyInput.txt' file
# For now just create some output data files
echo "File A" > A.csv
echo "File B" > B.csv
echo "File C" > C.csv
echo "File D" > D.csv
echo "File E" > E.csv
输入'DummyInput.txt'现在是一些虚拟数据。
Record1
Record2
Record3
对于测试,我使用以下脚本在HDFS中加载虚拟数据。这将导致200个输入文件。
for i in {0..199}
do
hadoop fs -put DummyInput.txt input/Test/Input$i.txt
done
当我运行猪作业时,它运行没有错误。 200个映射器按预期运行。但是,我希望在各种HDFS目录中看到200个文件。相反,我发现缺少许多输出文件:
1 200 1400 output/Test/B.csv
1 200 1400 output/Test/C.csv
1 189 1295 output/Test/D.csv
1 159 1078 output/Test/E.csv
根“输出/测试”有200个文件,这是正确的。文件夹“B.csv”和“C.csv”也有200个文件。但是,文件夹“D.csv”和“E.csv”缺少文件。
我们已经查看了日志,但是没有任何内容指出为什么本地输出文件没有从数据节点复制到HDFS。