我在HDFS中有大量的.gz文件,我正尝试使用PigStorage加载它们以处理数据,但出现以下异常
java.io.EOFException: Unexpected end of input stream at org.apache.hadoop.io.compress.DecompressorStream.decompress(DecompressorStream.java:137) at org.apache.hadoop.io.compress.DecompressorStream.read(DecompressorStream.java:77) at java.io.InputStream.read(InputStream.java:85) at org.apache.hadoop.util.LineReader.readDefaultLine(LineReader.java:205) at org.apache.hadoop.util.LineReader.readLine(LineReader.java:169) at org.apache.hadoop.mapreduce.lib.input.LineRecordReader.nextKeyValue(LineRecordReader.java:139) at org.apache.pig.builtin.TextLoader.getNext(TextLoader.java:55) at org.apache.pig.backend.hadoop.executionengine.mapReduceLayer.PigRecordReader.nextKeyValue(PigRecordReader.java:194) at org.apache.hadoop.mapred.MapTask$NewTrackingRecordReader.nextKeyValue(MapTask.java:530) at org.apache.hadoop.mapreduce.MapContext.nextKeyValue(MapContext.java:67) at org.apache.hadoop.mapreduce.Mapper.run(Mapper.java:144) at org.apache.hadoop.mapred.MapTask.runNewMapper(MapTask.java:763) at org.apache.hadoop.mapred.MapTask.run(MapTask.java:363) at org.apache.hadoop.mapred.Child$4.run(Child.java:255) at java.security.AccessController.doPrivileged(Native Method) at javax.security.auth.Subject.doAs(Subject.java:396) at org.apache.hadoop.security.UserGroupInformation.doAs(UserGroupInformation.java:1232) at org.apache.hadoop.mapred.Child.main(Child.java:249)
这可能是某些文件损坏的结果。
pig 是否有任何类型的错误处理,通过它我可以跳过损坏的文件。以下是我正在使用的示例代码:
cal = load '$inputdir/CAL/*/*/*/*/*/*/*.gz' USING PigStorage('\t');
最佳答案
这可能与损坏的文件有关。
您可以使用mapred.max.map.failures.percent
设置(或mapred.max.reduce.failures.percent
,但这与您的情况无关)来控制可以忽略的失败百分比。
问题在于,单个映射器可以读取多个gz文件,因此损坏的文件会使映射器失败,并使其跳过可以的文件。
关于hadoop - 在Pig脚本中加载.gz文件时出错,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23794644/