6

Hadoop での I/O アクティビティをテストするために、ディスク集中型の Hadoop アプリケーションを探していましたが、ディスク使用率を 50% 以上に保つアプリケーションや、実際にディスクをビジー状態に保つアプリケーションが見つかりませんでした。randomwriter を試してみましたが、驚くべきことに、ディスク I/O を集中的に使用することはありません。

そこで、Mapper でファイルを作成し、それにテキストを書き込む小さなプログラムを作成しました。このアプリケーションはうまく機能しますが、ネーム ノード、ジョブ トラッカー、およびスレーブの 1 つであるマスター ノードでのみ使用率が高くなります。ディスク使用率は、他のタスク トラッカーでは NIL または無視できます。タスク トラッカーでディスク I/O が非常に低い理由がわかりません。私が何か間違ったことをしている場合、誰かが私を正しい方向に動かしてくれませんか? 前もって感謝します。

これは、UTF文字列を作成してファイルに書き込むためにWordCount.javaファイルに書いたサンプルコードセグメントです-

Configuration conf = new Configuration();
FileSystem fs = FileSystem.get(conf);
Path outFile;
while (itr.hasMoreTokens()) {
    word.set(itr.nextToken());
    context.write(word, one);
    outFile = new Path("./dummy"+ context.getTaskAttemptID());
    FSDataOutputStream out = fs.create(outFile);

    out.writeUTF("helloworld");
    out.close();
    fs.delete(outFile);
  }
4

2 に答える 2

1

各行のセルごとにJavaオブジェクトを作成し、ディスクに保存する前にJavaオブジェクトのシリアル化を実行するメカニズムは、IOを利用する機会がほとんどないと思います。
私の経験では、シリアル化は毎秒数 MB またはそれ以上の速度で動作していますが、毎秒 100 MB ではありません。
したがって、出力パスで Hadoop レイヤーを回避したことはまったく正しいことです。次に、HDFS への書き込みがどのように機能するかを考えてみましょう。データは、ローカル データ ノードを介してローカル ディスクに書き込まれ、その後、レプリケーション ファクターに応じて、ネットワーク内の他のノードに同期的に書き込まれます。この場合、ネットワーク帯域幅よりも多くのデータを HDFS に書き込むことはできません。クラスターが比較的小さい場合は、価値があります。3 ノード クラスターとトリプル レプリケーションの場合、すべてのデータをすべてのノードにパスするため、クラスター全体の HDFS 書き込み帯域幅は約 1 GBit になります (そのようなネットワークがある場合)。
したがって、次のことをお勧めします
。a) レプリケーション ファクターを 1 に減らし、ネットワークにバインドされないようにします。
b)マッパーへの1回の呼び出しでより大きなデータのチャンクを書き込みます

于 2012-11-20T14:29:37.643 に答える