マージ/コーピングが行われている間、reduce ステップで次のエラーが発生します。
java.io.IOException: Task: attempt_201306130308_0177_r_000002_0 - The reduce copier failed
at org.apache.hadoop.mapred.ReduceTask.run(ReduceTask.java:384)
at org.apache.hadoop.mapred.Child$4.run(Child.java:217)
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:1063)
at org.apache.hadoop.mapred.Child.main(Child.java:211)
Caused by: java.io.IOException: Intermediate merge failed
at org.apache.hadoop.mapred.ReduceTask$ReduceCopier$InMemFSMergeThread.doInMemMerge(ReduceTask.java:2703)
at org.apache.hadoop.mapred.ReduceTask$ReduceCopier$InMemFSMergeThread.run(ReduceTask.java:2628)
Caused by: java.io.IOException: Rec# 13932: Failed to skip past record of length: 129
at org.apache.hadoop.mapred.IFile$InMemoryReader.next(IFile.java:542)
at org.apache.hadoop.mapred.Merger$Segment.next(Merger.java:220)
at org.apache.hadoop.mapred.Merger$MergeQueue.adjustPriorityQueue(Merger.java:330)
at org.apache.hadoop.mapred.Merger$MergeQueue.next(Merger.java:350)
at org.apache.hadoop.mapred.Merger.writeFile(Merger.java:156)
at org.apache.hadoop.mapred.ReduceTask$ReduceCopier$InMemFSMergeThread.doInMemMerge(ReduceTask.java:2687)
... 1 more
この場所にある IFile.java のコードを見ると、次のようになります。
long skipped = dataIn.skip(recordLength);
if (skipped != recordLength) {
throw new IOException("Rec# " + recNo + ": Failed to skip past record of length: " +
recordLength);
}
基本的に、どういうわけか、次のレコードのメモリ内読み取りに一貫性がありません。これはどのように可能ですか?バッファがメモリに完全に収まらず、メモリを増やす必要があるためですか?
次に何を試すべきか提案はありますか?