Hadoopは初めてです。最近、hdfs / hadoop上の多くの小さなファイルを処理(読み取りのみ)しようとしています。平均ファイルサイズは約1kbで、ファイル数は10M以上です。いくつかの制限があるため、プログラムはC++で作成する必要があります。
これは単なるパフォーマンス評価であるため、データノードには5台のマシンのみを使用します。各データノードには5つのデータディスクがあります。
パフォーマンスベースラインを構築するために(HDFSからではなく)ハードディスクから直接ファイルを読み取る小さなC++プロジェクトを作成しました。プログラムは、ディスクごとに4つの読み取りスレッドを作成します。パフォーマンスの結果は、ディスクあたり約14MB/秒になります。合計スループットは約14MB/秒*5* 5 = 350MB /秒(14MB/秒*5ディスク*5マシン)です。
ただし、このプログラム(C ++を引き続き使用し、libhdfs.soに動的にリンクされ、4 * 5 * 5 = 100スレッドを作成)がhdfsクラスターからファイルを読み取る場合、スループットは約55MB/秒になります。
このプログラミングがmapreduceでトリガーされた場合(hadoopストリーミング、5つのジョブ、それぞれに20のスレッドがあり、スレッドの総数は100のままです)、スループットは約45MB/秒に低下します。(私はそれがいくつかの簿記プロセスによって遅くなると思います)。
HDFSが実現できる妥当なパフォーマンスとは何か疑問に思っています。ご覧のとおり、ネイティブコードと比較すると、データスループットは約1/7です。それは私の設定の問題ですか?またはHDFSの制限?またはJavaの制限?私のシナリオに最適な方法は何ですか?シーケンスファイルは(大いに)役立ちますか?期待できるネイティブIO読み取りと比較した場合の妥当なスループットはどれくらいですか?
これが私の設定の一部です:
NameNodeヒープサイズ32G。
ジョブ/タスクノードのヒープサイズは8Gです。
NameNodeハンドラー数:128
DataNodeハンドラー数:8
DataNode転送スレッドの最大数:4096
1GBpsイーサネット。
ありがとう。