Hadoop/HDFSの性能評価について

1,103 views
Skip to first unread message

maru

unread,
May 31, 2010, 2:45:32 PM5/31/10
to Hadoopユーザー会
はじめて投稿させていただきます。
表題の件について詳しい方にアドバイスを頂戴したく、メールを書いております。

現在NameNode x1台 + DataNode x16台の環境にHadoop(Cloudera版)を導入していろいろと
評価を行っておりまして、その中で私たちが興味のある項目のひとつに分散されたデータの
入出力にかかる時間そのものを短縮したらシステム全体としてどの程度の性能向上が得られ、
その場合のボトルネックはどこに出てくるのだろうかというものがあります。

いまはアプリケーションを特定せずHadoopの配布物に含まれているTestDFSIOを使用して
分散ファイルシステムとしての性能を見ているのですが、HDFSを構成している物理的な
ファイルが各ノードにローカルに接続されている一般的なSASの上にあるHadoopインスタンスと、
同じく各ノードにローカルに接続されているFusion-io社製ioDrive Duoの上にあるHadoopの
インスタンスとで顕著な違いが見られず、ベンチマーク実行時のパラメータによっては
むしろSAS上に構築したHadoopの方がioDrive上に構築したHadoopよりも高いスループットを
叩き出すような状況です。

既に同様の性能評価を実施された方、あるいは評価した結果が公開されているサイトを
ご存知の方がいましたらどういった傾向が得られたか情報をいただけませんでしょうか。

シングルノード上でNameNode, DataNode, JobTracker, TaskTrackerすべてを稼働させると
ioDriveの方がSASよりもよい結果を出してくるのですが、複数ノードにプロセスを分散させると
傾向がまったく安定せず試行の度に結果がバラバラになるのでどこから手を付けてよいものか
わからないでいる状態です。各ノード間は10GbEスイッチを介して接続してあります。

どんなことでも結構ですので、アドバイスをいただけましたら幸いです。
以上よろしくお願いします。
--
Kiyoshi Mizumaru <kiyoshi....@gmail.com>

Shun0102

unread,
Jun 1, 2010, 1:12:31 AM6/1/10
to Hadoopユーザー会
こんにちは、三上です。

TestDFSIOでの性能でしたら基本的にはノード数を増やせば、一台の時の性能がそのままスケールするはずです。
以下は自分のブログの記事ですが、台数を変えて性能を図った時の結果です。(TestDFSIOではありませんが)
http://shun0102.net/?p=126

Hadoopのインスタンスがどのディスク上にあるか問題ではなく、Hadoopがストレージとしてどのディスクを使用するかが問題なのですが、正しく
設定されているでしょうか?
またディスクは1ノードあたり複数使って性能を向上できるので、SASのディスクやSSDを付けるより1ノードに複数のSATAディスクを付けて使うの
が主流です。
複数ディスクに関して詳しくは http://shun0102.net/?p=75

TestDFSIOでは-nrfile で指定した数のmapタスクが起動しますがノード数と同じか倍数で指定していますか?
これを中途半端な数字にすると負荷が偏って正しい結果がでません。
また、ベンチマーク実行中にモニタリングツールなどでディスクの使用状況を監視するのがおすすめです。
設定が間違ってて使用されてないディスクがあったりするのにすぐ気付けます。
私は VGXPを使っています http://www.logos.ic.i.u-tokyo.ac.jp/~kamo/vgxp/
もしくは面倒であればiostatで見るなど。

あと、ファイルサイズが小さいとメモリへの読み書きだけですんでいてディスクの性能が測れてないことがよくあります。
私は書き込みはメモリの2,3倍以上書き込んで、読み込みの場合はデータをメモリから追い出してから計測しています。

以上参考になりましたでしょうか

Tatsuya Kawano

unread,
Jun 1, 2010, 6:14:13 AM6/1/10
to hado...@googlegroups.com, Hadoopユーザー会

たつやです
こんにちは。

お使いの SSD(ioDrive Duo)ですが、PCI Express x8
接続で転送速度が最大1.5Gバイト/秒になってますので、
SAS HDDの30~40台分くらいのスループットがあるというこ
とでしょうか?

HDFSではレプリケーションを行いますので、SSDに書き込むのと同
じ量のデータが、パケットに入れられた状態でネットワークを流れます。
各ノードのCPUとネットワークスイッチにかなりの負荷がかかるの
ではないでしょうか? 1.5GB/sという数字だけ見ても、Ethernet
の10Gbpsを超えています。

つまり、16ノード x レプリカ数 3 ですと、ネット
ワークスイッチのキャパシティを超えて、輻輳しているのかもしれませ
ん。または、TCP/IPあたりの設定のチューニングが必要なのかもし
れません。

もし、まだ試されてなければ、2ノード x レプリカ数 1
くらいから測定を始め、徐々にノード数を増やしていって、どこで性能が
飽和するか確認してはどうでしょう。レプリカ数 1で16ノー
ドまで測定したら、レプリカ数を2に増やして、再度、2ノー
ドから測定し直します。

このような方法で進めれば、原因の切り分けがしやすくなると思います。

--
河野 達也
Tatsuya Kawano

On Jun 1, 2010, at 3:45 AM, maru <kiyoshi....@gmail.com> wrote:

> はじめて投稿させていただきます。
> 表題の件について詳しい方にアドバイスを頂戴したく、メールを書いて
> おります。
>
> 現在NameNode x1台 + DataNode x16台の環境にHadoop
> (Cloudera版)を導入していろいろと
> 評価を行っておりまして、その中で私たちが興味のある項目のひとつに
> 分散されたデータの
> 入出力にかかる時間そのものを短縮したらシステム全体としてどの程度
> の性能向上が得られ、
> その場合のボトルネックはどこに出てくるのだろうかというものがあり
> ます。
>
> いまはアプリケーションを特定せずHadoopの配布物に含まれてい
> るTestDFSIOを使用して
> 分散ファイルシステムとしての性能を見ているのですが、HDFSを
> 構成している物理的な
> ファイルが各ノードにローカルに接続されている一般的なSASの
> 上にあるHadoopインスタンスと、
> 同じく各ノードにローカルに接続されているFusion-io社製
> ioDrive Duoの上にあるHadoopの
> インスタンスとで顕著な違いが見られず、ベンチマーク実行時のパラ
> メータによっては
> むしろSAS上に構築したHadoopの方がioDrive上に構
> 築したHadoopよりも高いスループットを
> 叩き出すような状況です。
>
> 既に同様の性能評価を実施された方、あるいは評価した結果が公開され
> ているサイトを
> ご存知の方がいましたらどういった傾向が得られたか情報をいただけま
> せんでしょうか。
>
> シングルノード上でNameNode, DataNode, JobTracker, TaskTracker
> すべてを稼働させると
> ioDriveの方がSASよりもよい結果を出してくるのですが、複数
> ノードにプロセスを分散させると
> 傾向がまったく安定せず試行の度に結果がバラバラになるのでどこから
> 手を付けてよいものか
> わからないでいる状態です。各ノード間は10GbEスイッチを介し
> て接続してあります。
>
> どんなことでも結構ですので、アドバイスをいただけましたら幸いで
> す。

Tatsuya Kawano

unread,
Jun 1, 2010, 6:28:08 AM6/1/10
to Tatsuya Kawano, hado...@googlegroups.com

そういえば、どこかで、Facebookの大規模クラスターでのキャッシュの運用の日本語記事を読んだのですが、そこでは、大量のパケットが一気にスイッチへ流れ込む事で、スイッチがパケットを破棄してしまうようなことが書かれていました。

僕は、Ethernet通信のことはあまり詳しくないので、これがどのくらいの規模で起こるのか何ともいえないのですが、こういうことが起こってる可能性も考えながら、原因切り分けをしたほうがいいかもしれません。

あとは、NameNodeがボトルネックになっている可能性もあります。いずれにせよ、レプリカ数とノード数を抑えた状態からの、段階的な測定をお勧めします。

たつや


On Jun 1, 2010, at 7:14 PM, Tatsuya Kawano <tatsu...@gmail.com> wrote:


たつやです
こんにちは。

お使いの SSD(ioDrive Duo)ですが、PCI Express x8 接続で転送速度が最大1.5Gバイト/秒になってますので、SAS HDDの30〜40台分くらいのスループットがあるということでしょうか?

HDFSではレプリケーションを行いますので、SSDに書き込むのと同じ量のデータが、パケットに入れられた状態でネットワークを流れます。各ノードのCPUとネットワークスイッチにかなりの負荷がかかるのではないでしょうか? 1.5GB/sという数字だけ見ても、Ethernetの10Gbpsを超えています。


つまり、16ノード x レプリカ数 3 ですと、ネットワークスイッチのキャパシティを超えて、輻輳しているのかもしれません。または、TCP/IPあたりの設定のチューニングが必要なのかもしれません。

もし、まだ試されてなければ、2ノード x レプリカ数 1 くらいから測定を始め、徐々にノード数を増やしていって、どこで性能が飽和するか確認してはどうでしょう。レプリカ数 1で16ノードまで測定したら、レプリカ数を2に増やして、再度、2ノードから測定し直します。

このような方法で進めれば、原因の切り分けがしやすくなると思います。

--
河野 達也
Tatsuya Kawano



On Jun 1, 2010, at 3:45 AM, maru <kiyoshi....@gmail.com> wrote:

はじめて投稿させていただきます。
表題の件について詳しい方にアドバイスを頂戴したく、メールを書いております。
以上よろしくお願いします。
--
Kiyoshi Mizumaru <kiyoshi....@gmail.com>

Kiyoshi Mizumaru

unread,
Jun 1, 2010, 2:01:07 PM6/1/10
to hado...@googlegroups.com
三上さんこんにちは。返信ありがとうございます。

ノード数の増加に伴って性能がそのままスケールするはずとの指摘については
Hadoop/HDFSの設計思想上そのようになるはずだと期待しているのですが、まだ
納得のいく結果が得られていない状況です。

Hadoopがストレージとしてどのディスクを使用するかが問題とのことですが
これはdfs.name.dir, dfs.data.dir, hadoop.tmp.dirに指定するディレクトリをそれぞれの
インスタンスでioDrive上のファイルシステム、SAS上のファイルシステム、に作った
ディレクトリに設定、実際のファイルも設定したディレクトリ配下に生成される
ことから大丈夫だろうと認識しています。

-nFilesについてはあえて1, 10といった半端な数字とノード数の16の倍数をいくつか
試していますが物理的なストレージデバイスだけの違いで他の条件が同じであれば
ioDriveの方がSASより優位な数値を出すはずだと考えていました。
負荷のバランスを取ることと教えていだたいたモニタリングツールを導入して
再度計測してみたいと思います。

最期の「メモリの2, 3倍以上書き込んで」はmapred.child.java.optsで-Xmx4096mの
ようにして指定しているマッパータスクに与えているメモリ量ということで間違い
ないでしょうか?TestDFSIO.javaにあるWriteMapper#doIOメソッドでは書き込み
完了後にHDFS上のファイルをきちんとcloseしていて、O'ReillyのHadoop: The
Definitive GuideによればHDFS上のファイルがcloseされるときにはsync動作となる
との記述があるので-writeのときにはメモリに載っけただけで返ってくることは
ないのだろうと思っていました。もし誤りであればご指摘ください
(Hadoopのコードを通読してないのでまだまだ理解が足りない部分が多いです)。

参考になるお返事をありがとうございました。
ブログの方もじっくり拝見させていただきます。
--
Kiyoshi Mizumaru <kiyoshi....@gmail.com>

2010/6/1 Shun0102 <shun...@gmail.com>:

Kiyoshi Mizumaru

unread,
Jun 1, 2010, 2:18:07 PM6/1/10
to hado...@googlegroups.com
たつやさんこんにちは。返信ありがとうございます。

ご指摘いただいたネットワークでの輻輳の可能性についてはこちらでも疑っていまして、
現在テストしているHadoopインスタンスはすべてレプリカ数を1にしてテストしています。

ただ正直なところネットワークに関してはそれほど専門的な知識を持ち合わせてないため
どのような調査を行うべきかの指針が明確にわからないでいる状態です。お恥ずかしい。
ただベンチマーク実行時に各ノード(8コア Xeon, HTオフ, 48GBメモリ)でtopコマンドで
見た負荷はスカスカでしたのでどこがボトルネックになってるのか、をどうやって調べて
いこうかで悩んでいました。

まずはご指摘いただいたように少ないノード数から順に増やして行く形で計測を進めて
みたいと思います。


2010/6/1 Tatsuya Kawano <tatsu...@gmail.com>:


>
> たつやです
> こんにちは。
>
> お使いの SSD(ioDrive Duo)ですが、PCI Express x8 接続で転送速度が最大1.5Gバイト/秒になってますので、SAS

> HDDの30~40台分くらいのスループットがあるということでしょうか?


>
> HDFSではレプリケーションを行いますので、SSDに書き込むのと同じ量のデータが、パケットに入れられた状態でネットワークを流れます。各ノードのCPUとネットワークスイッチにかなりの負荷がかかるのではないでしょうか?
> 1.5GB/sという数字だけ見ても、Ethernetの10Gbpsを超えています。
>

> つまり、16ノード x レプリカ数 3
> ですと、ネットワークスイッチのキャパシティを超えて、輻輳しているのかもしれません。または、TCP/IPあたりの設定のチューニングが必要なのかもしれません。
>
> もし、まだ試されてなければ、2ノード x レプリカ数 1

> くらいから測定を始め、徐々にノード数を増やしていって、どこで性能が飽和するか確認してはどうでしょう。レプリカ数
> 1で16ノードまで測定したら、レプリカ数を2に増やして、再度、2ノードから測定し直します。
>

> このような方法で進めれば、原因の切り分けがしやすくなると思います。
>
> --
> 河野 達也
> Tatsuya Kawano
>
>
>
> On Jun 1, 2010, at 3:45 AM, maru <kiyoshi....@gmail.com> wrote:
>
>> はじめて投稿させていただきます。

Shun0102

unread,
Jun 2, 2010, 4:57:24 AM6/2/10
to Hadoopユーザー会
> 最期の「メモリの2, 3倍以上書き込んで」はmapred.child.java.optsで-Xmx4096mの
> ようにして指定しているマッパータスクに与えているメモリ量ということで間違い
> ないでしょうか?

いえ、すでにたつやさんからも指摘がある通りで、OSのバッファキャッシュなのでRAMの48GBに対してです。
私もコードで理解しているわけではないですが、実際にモニタリングしながら書き込みを行うと、ジョブが終了した後も
しばらくディスクへ対する書き込みが発生しています。
ioDriveのような高速なディスクだとそれがはっきりとは現れないかもしれませんが。

またNameNodeへの問い合わせがボトルネックという話を補足すると、
例えば新しいブロックを作成(シーク)に10ms、転送速度が1.5GB/sと仮定すると、
ブロックサイズを64MBにすると1ブロックの書き込みは約40ms( 64MB / 1500MB/sec * 1000)かかり、
それに対して1回のシークが発生するので、全体の時間の20%がシークに費やされてしまいます。
この場合シークタイムを全体の1%以下にするには、約1,5GB以上のブロックサイズにする必要があります。
このシークタイムの仮定が妥当なのかわかりませんが、Hadoop本にもそのような仮定で書いてあります(p45)

なので、NameNodeがボトルネックといっても必ずしも負荷がかかっているわけではないのを注意してください。
> Kiyoshi Mizumaru <kiyoshi.mizum...@gmail.com>
>
> 2010/6/1 Shun0102 <shun0...@gmail.com>:
>
>
>
> > こんにちは、三上です。
>
> > TestDFSIOでの性能でしたら基本的にはノード数を増やせば、一台の時の性能がそのままスケールするはずです。
> > 以下は自分のブログの記事ですが、台数を変えて性能を図った時の結果です。(TestDFSIOではありませんが)
> >http://shun0102.net/?p=126
>
> > Hadoopのインスタンスがどのディスク上にあるか問題ではなく、Hadoopがストレージとしてどのディスクを使用するかが問題なのですが、正しく
> > 設定されているでしょうか?
> > またディスクは1ノードあたり複数使って性能を向上できるので、SASのディスクやSSDを付けるより1ノードに複数のSATAディスクを付けて使うの
> > が主流です。
> > 複数ディスクに関して詳しくはhttp://shun0102.net/?p=75

S.YAMASHITA

unread,
Jun 2, 2010, 9:04:31 AM6/2/10
to Hadoopユーザー会
山下と申します。

# 他の皆様のアイデアに補足して
既に対応されているかもしれませんが、問題を切り分けるとしたら
以下のようなことも考えた方がよいと思います。

・Hadoopパラメータ確認(NameNode,DataNode) : 何を変更したか
・特定のノードが遅い原因になっていないか : タスク実行情報などから確認する
・スイッチ周りの設定の確認
・デバイス周りの確認

---
S.YAMASHITA : shin...@gmail.com
Reply all
Reply to author
Forward
0 new messages