2

私の仕事の流れは以下の通りです。

膨大な量のデータを処理しています。MapFileキャッシュする必要がある があります。このファイルのサイズは現在 1 GB ですが、最終的には大きくなると思います。

MapFile の内容は次のようになります。

12345,45464       192.34.23.1
33214,45321       123.45.32.1
  • では、map-phaseにある入力ファイルから各レコードを処理しますTextInputFormat。行を解析 (トークンごとに分割) し、最初の 2 つのトークン (token1 と token2) を取得します。

(token1,token2) のペアがキャッシュされたファイルにない場合は、API 呼び出しを実行して情報を取得し、(可能であれば) キャッシュに保存して処理を続行します。

 private Parser parser = new customParser();

protected void map(LongWritable key, Text value, Context context)
        throws IOException, InterruptedException {

      parser.parse(value);
      Pair pair = new Pair();
      pair.setFirst(parser.getFirst());
      pair.setSecond(parser.getSecond());
      IP ip = null;

      //here is the catch
      //check if pair exists in cache
      if cache.contains(pair){
          ip=cache.get(pair);
       }
       else {
          ip=getFromAPI(pair);//This does API call outside network.
          cache.put(pair,ip);
       }
      context.write(pair,ip);
      }
    }

ここで私が見ている主な問題は

  1. すべてのノードでキャッシュ内の大きなファイルを取得する方法。DistributedCache は、ファイルをローカル ノードにコピーすることで機能します。しかし、このファイルはサイズが大きいため、ここにネットワーク トラフィックが関係しており、私の日常業務では、ファイルを配布し続けたくありません。

  2. MapFile(キャッシュ)を効率的に検索する方法、mapFile全体がメモリ内にありません。

  3. 私のキャッシュであるこのMapFileに書き込む方法。

ありがとう

4

1 に答える 1

0

私が見たところ、これを処理するには 3 つの方法があり、最適な方法はキャッシュ ファイルがどのように大きくなるかによって異なります。

  1. キャッシュ ファイルがあまり大きくならないと予想され、他のアプリケーションや MapReduce ジョブを妨げることなく常にメモリに収まる場合は、キャッシュ ファイルをHDFS キャッシュに入れることができます。この機能は、Hadoop 2.3.0 以降でサポートされています。

    HDFS キャッシングにより、ユーザーは特定のファイルまたはディレクトリを HDFS に明示的にキャッシュできます。その後、DataNode は、mmap と mlock を使用して、対応するブロックをオフヒープ メモリにキャッシュします。キャッシュされると、Hadoop アプリケーションは、キャッシュされたブロックの場所を照会し、メモリの局所性のためにタスクを配置できます。最後に、メモリローカルの場合、アプリケーションは新しいゼロコピー読み取り API を使用して、追加のオーバーヘッドなしでキャッシュされたデータを読み取ることができます。

最後の 2 つのオプションは、キャッシュ ファイルが大きくなったときに安全にメモリに保持できない場合に適しています。

  1. Thomas Jungblut によるこの回答では、キャッシュ ファイルを HDFS に配置し、レプリケーション カウントを増やしてFileSystem APIで読み取ることを提案しています。これにより、非ローカル レプリカのネットワーク通信が行われますが、DistributedCache 内のすべてのノードへの転送よりも少ないことが望まれます。FileSystem API を使用すると、既存のファイルに追加して、ファイルを更新することもできます。

  2. キャッシュ ファイルが非常に大きくなり、追加のレプリケーションを保存する際に問題が発生する可能性がある場合は、代わりに、最初のマッピング ステップの一部として取得できるようにすることを検討してください。

    たとえば、キャッシュ ファイルと処理するファイルの両方をマッパーへの入力として取得し、両方の入力に対してトークン ペアをマップすることができます。縮小ステップでは、トークン ペアにキャッシュ ファイルと処理済みファイルの両方からの行がある場合は何も出力せず、他の 2 つの可能性のあるケースでは対応するキャッシュ行を出力することによって、新しいキャッシュ ファイルが構築されます。

于 2014-11-02T13:43:33.633 に答える