2016-05-31 3 views
1

私はHadoopのmap reduceを使用してxmlファイルを解析しています。だから、Parserというクラスがあり、xmlファイルを解析するためのメソッドparse()を持つことができます。そして私はMapperのmap()関数でそれを使うべきです。Hadoopは各マッパーに1つのインスタンスを使用します

しかし、毎回Parserに電話をかけたいときは、Parserインスタンスを作成する必要があります。しかし、このインスタンスはマップ・ジョブごとに同じでなければなりません。だから私はちょうどこのParserを一度インスタンス化することができますか?

もう1つのアドオンに関する質問ですが、なぜMapperクラスは常に静的なのですか?

+1

、変数のインスタンスを共有することも...わからないことができません。あなたはそれをどこで見ますか? –

+1

2番目のステートメントをスクラッチします...最近mapreduceは書いていませんが、ここに説明がありますhttp://stackoverflow.com/questions/11570674/why-declaring-mapper-and-reducer-classes-as-static –

+0

サンプルコードでは、Mapperは静的クラスです。 [link](https://hadoop.apache.org/docs/current/hadoop-mapreduce-client/hadoop-mapreduce-client-core/MapReduceTutorial.html) –

答えて

3

マッパーごとに1つのパーサーインスタンスを確保するには、マッパー設定メソッドを使用してパーサーインスタンスをインスタンス化し、クリーンアップメソッドを使用してクリーンアップしてください。

私たちが持っていたprotobufパーサーに同じことを適用しましたが、パーサーインスタンスがスレッドセーフであり、共有データがないことを確認する必要があります。 注:セットアップとクリーンアップメソッドは、マッパーごとに1回だけ呼び出されるため、ここでプライベート変数を初期化できます。 「変数のインスタンスを共有することは不可能である、分散コンピューティング環境では...」に言っcricket_007

we have a practice of reusing of writable classes instead of creating new writables every time we need. we can instantiate once and re-set the writable multiple times as described by Tip 6 同様パーサオブジェクトも再使用することができる(チップ6明確にするために スタイル)。以下のコードで説明します。 EXの場合 :マッパーは常に静的であれば、分散コンピューティング環境では

private YourXMLParser xmlParser = null; 
    @Override 
     protected void setup(Context context) throws IOException, InterruptedException { 
      super.setup(context); 
      xmlParser= new YourXMLParser();   
     } 

    @Override 
     protected void cleanup(Mapper<ImmutableBytesWritable, Result, NullWritable, Put>.Context context) throws IOException, 
         InterruptedException { 
      super.cleanup(context); 
        xmlParser= null; 
    } 
関連する問題