2013-05-02 8 views
5

マッパまたはレデューサクラスのメソッドrun()はHadoopフレームワークからどのように呼び出されますか?フレームワークはrun()メソッドを呼び出していますが、コンテキストオブジェクトは1つ必要です。そのため、Hadoopはそのオブジェクトをどのように渡していますか?その情報にはどのような情報が含まれていますか?Hadoop Mapperコンテキストオブジェクト

答えて

3

run()メソッドは、Javaランタイムポリモーフィズム(メソッドオーバーライド)を使用して呼び出されます。下のリンクの#569行目を見ると、拡張されたマッパー/レデューサーはJava Reflection APIを使用してインスタンス化されます。 MapTaskクラスは、クライアントプログラムは以下の通りHadoop Source MapTask.java

mapperContext = contextConstructor.newInstance(mapper, job, getTaskID(), 
                input, output, committer, 
                reporter, split); 

    input.initialize(split, mapperContext); 
    mapper.run(mapperContext); 
    input.close();` 
から取られたコードである job.setMapperClass()

を使用して、拡張マッパ/減速クラスを設定されていたジョブの設定オブジェクトから拡張マッパー/減速の名前を取得します

行番号621は、実行時の多型の例です。この行で、MapTaskは 'Mapper Context'をパラメータとして構成されたマッパーのrun()メソッドを呼び出します。 run()が拡張されていない場合、org.apache.hadoop.mapreduce.Mapperのrun()メソッドが呼び出され、構成されたマッパーのmap()メソッドが再び呼び出されます。上記リンクの回線#616で

、MapTaskは@harpunにより述べたように等のジョブ設定のすべての詳細をコンテキスト・オブジェクトを作成し、回線#621

上でrun()メソッドに渡し

上記の説明は、適切なReduceTaskクラスをメインエントリクラスとして、タスクを削減する場合にも有効です。

+0

ありがとうございましたniranjanは、すべての単純なジョブを実行している間にすべてのhadoopフレームワーククラスが実行されることを説明できますか? –

+0

これは簡単な答えではありません。実際には、拡張されたクラスが呼び出される前に実行されるソフトウェアレイヤ全体であるhadoopフレームワーククラスがたくさんあります。私は、あなたのIDEにhadoopソースをダウンロードして接続し、コールスタックで使用されている高水準クラスを理解するためのジョブをデバッグすることを提案します。 –

+0

@NiranjanSarvi、MapTaskクラスがコンテキストクラスである他のクラスのオブジェクトを作成する方法を教えてください。 Contextクラスは抽象クラスであり、Maptaskクラスでも実装されていないため、MapTaskクラスとContextクラスの間に関係はありますか?それは他の方法から来ていますか? – Kate

0

はい、マッピングタスクの実行時にマッパーのrun()メソッドがMRフレームワークによって呼び出されます。コンテキストに関する限り、Mapper.Contextのドキュメントを見てください。特に、実装されたインタフェースとそのjavadocは、コンテキストに含まれる情報の完全な概要を示します。文脈を通して、あなたのようなデータにアクセスすることができます。現在実行タスクの試み

  • 現在のキーの

    • ジョブ情報(ジョブ構成、マッパー/減速クラス名、ジョブ名、作業ディレクトリ)
    • 状態を、値、入力分割(マップタスク固有情報)

    もちろん、Reducerのコンテキストオブジェクトは同じです:Reducer.Context

  • 関連する問題