MapReducer を作成するときにエラーを報告しました。
java.lang.ClassCastException : org.apache.hadoop.mapred.JobConf.getOutputKeyComparator(JobConf.java:887) の org.apache.hadoop.mapred
の java.lang.Class.asSubclass(Unknown Source)の class date2021_11_27_5.Commodity 。 MapTask$MapOutputBuffer.init(MapTask.java:1004) org.apache.hadoop.mapred.MapTask.createSortingCollector(MapTask.java:402) org.apache.hadoop.mapred.MapTask.access$100(MapTask.java:81) ) org.apache.hadoop.mapred.MapTask$NewOutputCollector.<init>(MapTask.java:698) org.apache.hadoop.mapred.MapTask.runNewMapper(MapTask.java:770) org.apache.hadoop で。マップレッド.MapTask.run(MapTask.java:341)
org.apache.hadoop.mapred.LocalJobRunner$Job$MapTaskRunnable.run(LocalJobRunner.java:243)
で java.util.concurrent.Executors$RunnableAdapter.call(不明なソース)
で java.util.concurrent.FutureTask.run(ソース不明)
java.util.concurrent.ThreadPoolExecutor.runWorker(ソース不明)
java.util.concurrent.ThreadPoolExecutor$Worker.run(ソース不明)
java.lang.Thread.run(ソース不明)
2021-11-29 10:00:26,301 情報 [org.apache.hadoop.mapred.LocalJobRunner] - マップ タスク エグゼキュータが完了しました。
2021-11-29 10:00:26,302 警告 [org.apache.hadoop.mapred.LocalJobRunner] - job_local49120036_0001
java.lang.Exception: java.io.IOException:すべてのコレクターの初期化に失敗しました。最後のコレクターのエラーは:class date2021_11_27_5.Commodity
at org.apache.hadoop.mapred.LocalJobRunner$Job.runTasks(LocalJobRunner.java:462)
at org.apache.hadoop.mapred.LocalJobRunner$Job.run(LocalJobRunner.java: 522)
原因: java.io.IOException:すべてのコレクタの初期化に失敗しました。
最後のコレクターのエラーは、 org.apache.hadoop.mapred.MapTask.createSortingCollector(MapTask.java:415) の
org.apache.hadoop.mapred.MapTask.access$100(MapTask.java:81) のclass date2021_11_27_5.Commodity でした
。 org.apache.hadoop.mapred.MapTask$NewOutputCollector.<init>(MapTask.java:698)
org.apache.hadoop.mapred.MapTask.runNewMapper(MapTask.java:770)
org.apache.hadoop.mapred.MapTask.run(MapTask.java:341)
で org.apache.hadoop.mapred.LocalJobRunner$Job$MapTaskRunnable.run(LocalJobRunner.java:243)
で java.util.concurrent.Executors $RunnableAdapter.call(不明なソース)
java.util.concurrent.FutureTask.run(不明なソース)
java.util.concurrent.ThreadPoolExecutor.runWorker(不明なソース)
java.util.concurrent.ThreadPoolExecutor$Worker.run(不明ソース)
java.lang.Thread.run(不明なソース)
原因: java.lang.ClassCastException : class date2021_11_27_5.Commodity
at java.lang.Class.asSubclass(Unknown Source)
at org.apache.hadoop.mapred.JobConf。 getOutputKeyComparator(JobConf.java:887)
org.apache.hadoop.mapred.MapTask$MapOutputBuffer.init(MapTask.java:1004)
org.apache.hadoop.mapred.MapTask.createSortingCollector(MapTask.java:402) で
... 10 詳細
これは、カスタム エンティティ クラスが WritableComparable<Commodity> インターフェイスを実装していないか、compareTo メソッドを書き換えていないため、シリアル化例外とクラス変換例外が発生しないためです。
もう一つの可能性は、
Writable と Comparable<Commodity> の 2 つのインターフェイスが実装されていますが、mapreducer の規定により、Writable と Comparable<Commodity> の 2 つのインターフェイスの代わりに WritableComparable<Commodity> のインターフェイスを実装する必要があります。
このような 2 つのインターフェイスの実装は、カスタム エンティティ クラスを値として使用する場合には問題ありませんが、カスタム エンティティ クラスをキーとして使用する場合には、上記のエラー メッセージが表示されます。
WritableComparable<Commodity> インターフェイスを再実装し、パッケージをインポートするだけです。
Hadoop で Writable インターフェイスと Comparable<Commodity> インターフェイスの実装が規定されている場合、カスタム エンティティ クラスのデータは値としてのみ使用でき、WritableComparable<Commodity> インターフェイスを実装するカスタム エンティティ クラスのデータは両方のキーとして使用できます。そして価値。