1

Hadoopを使用して、シーケンスファイルに保存されている多数の小さなファイルを処理しようとしています。私のプログラムはIOバウンドが高いので、IOスループットが十分に高いことを確認したいと思います。

シーケンスファイルから小さなサンプルファイルを読み取り、これらのファイルをRAMディスク(/ dev / shm / test /)に書き込むMRプログラムを作成しました。計算なしでRAMディスクに書き込まれたファイルを削除する別のスタンドアロンプ​​ログラムがあります。したがって、テストはほぼ純粋なIOバウンドである必要があります。ただし、IOスループットは思ったほど良くありません。

5つのデータノードがあり、各データノードには5つのデータディスクがあります。各ディスクは約100MB/秒のスループットを提供できます。理論的には、このクラスターは100MB / s * 5(ディスク)* 5(マシン)= 2500MB/sを提供できるはずです。しかし、私は約600MB/秒しか得られません。5台のマシンで「iostat-d-x1」を実行しましたが、 IOの負荷が十分にバランスされていないことがわかりました。通常、使用率が100%のディスクはごくわずかであり、使用率が非常に低い(10%以下)ディスクもあります。また、一部のマシンには、ある時点でIOロードがありません。これがスクリーンショットです。(もちろん、各ディスク/マシンのロードは急速に変化します)

ディスク使用率

これは、 「top-cd1」コマンド によるCPU使用率を示す別のスクリーンショットです。CPU使用率

これが私のケースに関するより詳細な設定です:

Hadoopクラスターハードウェア:128GBのRAMと32コアのCPU(実際には2台のXeon E5-2650)を搭載した5台のDellR620マシン。2台のHDDは、CentOS用のRAID1ディスクとHDFS用の5台のデータディスクで構成されています。したがって、uouは上のスクリーンショットで6つのディスクを見ることができます。

Hadoop設定:ブロックサイズ128MB; データノードハンドラーの数は8です。タスクトラッカーごとに15のマップ。2GB Mapは、子ヒーププロセスを削減します。

テストファイルセット:約400,000の小さなファイル、合計サイズ320GB。160のシーケンスファイルに保存され、各seqファイルのサイズは約2GBです。すべてのファイルをさまざまなサイズのseqファイル(1GB、512MB、256MB、128MB)に保存しようとしましたが、パフォーマンスはそれほど変わりませんでした。

システム全体で100%(2500MB / s)のIOスループットが得られるとは思いませんが、40%(1000MB / s)以上が妥当だと思います。誰かがパフォーマンスチューニングのガイドを提供できますか?

4

1 に答える 1

1

私は自分で問題を解決しました。ヒント:CPU使用率が高い。ほぼ純粋なIOジョブであるため、CPU使用率が非常に高いことは非常に異常です。根本的な原因は、各タスクノードが約500のマップを取得し、各マップが正確に1つのJVMを使用することです。デフォルトでは、hadoop map reduceは、新しいマップ用に新しいJVMを作成するように構成されています。

解決策:「mapred.job.reuse.jvm.num.tasks」の値を1から-1に変更します。これは、JVMが制限なく再利用されることを示します。

于 2013-03-27T03:59:20.603 に答える