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使用率を示す別のスクリーンショットです。
これが私のケースに関するより詳細な設定です:
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)以上が妥当だと思います。誰かがパフォーマンスチューニングのガイドを提供できますか?