MapReducer がエラー クラス変換例外を報告する

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> インターフェイスを実装するカスタム エンティティ クラスのデータは両方のキーとして使用できます。そして価値。

おすすめ

転載: blog.csdn.net/qq_53368181/article/details/121603341