HBaseのHFile直読みとHDFSのReaderの速度比較
今晩の Hadoop ソースコードリーディングで #HBase 入門(第3回)の発表をします。発表用スライドのダウンロードはこちらから: http://bit.ly/aTHMzu (PDF 7.6MB) #hadoopreading
2010-08-17 07:04:41@tatsuya6502 今日のHadoopReadingの資料について素朴な質問です。HBaseはLZO圧縮が入っていると思うのですが、HDFSもLZO圧縮してこの速度だったのでしょうか???
2010-08-17 13:46:56@m_mouri 資料に載せたのは、HDFS、HBase 共に圧縮なしのときの結果です。HBase 側は lzo ありも測定したのですが、資料からは省略しました。ちなみに、HDFSは SequenceFile を使いました。
2010-08-17 18:31:14Hadoop ソースコードリーディングで #HBase 入門(第3回)の発表をします。発表用スライドのダウンロードはこちらから: http://bit.ly/aTHMzu (PDF 7.6MB) #hadoopreading
2010-08-17 18:45:02HFileとHDFSの速度比較ですが、HDFSが遅い?については調査してみます。一度に読み込むバイト数が違うのかも。 #hadoopreading
2010-08-17 21:46:16HFile 側は、HFile.Reader を使っていて、これは FSDataInputStreamから、約64KBのデータブロックを readFullyでまとめて読んでます。 #hadoopreading
2010-08-17 21:47:08HDFS側は SequenceFile scanner を使いました。ディフォルト設定だったので、一度に読み込むバイト数が HFile.Reader に比べて少なかったのかも。 #hadoopreading
2010-08-17 21:47:45どうみても有りますね。RT @yutuki_r: HDFSって結構色々やってるけど、まだまだ高速化の余地あるんかな #hadoopreading
2010-08-17 21:57:27それは遅いと思う。RT @tatsuya6502: HDFS側は SequenceFile scanner を使いました。ディフォルト設定だったので、一度に読み込むバイト数が HFile.Reader に比べて少なかったのかも。 #hadoopreading
2010-08-17 21:57:47HDFS SequenceFile.Reader の readバッファーサイズは、ディフォルトで 4KB のようです。 http://ow.ly/2qZyX これが原因かな。64KB に変えて HFile 直読みと比較し直してみます。 #hadoopreading
2010-08-18 06:47:53@tatsuya6502 さすがに4KBでは比較にならんかと思われ。 #hadoopreading
2010-08-18 08:47:13@tatsuya6502 そういえば、m1.xlargeのインスタンスのディスクI/Oスループットは197.14MB/sec出るそうです。http://bit.ly/98jez7なので、SequenceFileもこの程度出てもおかしくないと思うんですよね。
2010-08-18 09:47:14ですね... まさかデータより小さいとは。バッファサイズを64KBから増やしていって、8,000バイトのデータでどこまで伸びるかやってみます。RT @okachimachiorz: @tatsuya6502 さすがに4KBでは比較にならんかと思われ。 #hadoopreading
2010-08-18 09:52:51おお、それは参考になります。もう少し試してみます。QT @m_mouri: @tatsuya6502 m1.xlargeのディスクI/Oスループットは197.14MB/sec出るそうです。http://bit.ly/98jez7なので、SequenceFileもこの程度出ても
2010-08-18 10:27:20#hadoopreading HDFSのreadが HFile直読みV2より遅かった件、再テストは週末になりそう。いま想像している理由は、HFile.ReaderがFSDataInputStreamから約64KBのブロック単位でreadしていることに対して、
2010-08-19 12:18:19SequenceFile.Reader では、FSDataInputStreamから1行単位(僕のテストでは 500バイト〜8000バイト)でreadしていること。read回数の多い後者が遅くなる。 #hadoopreading
2010-08-19 12:19:28解決策の1つは、FSDataInputStreamのバッファサイズを大きくすること。SequenceFile.Readerからのread回数は減らせないが、Data Nodeとの通信回数は減らせるので、高速化が期待できる。 #hadoopreading
2010-08-19 12:20:26もうひとつの解決策は、SequenceFile.Readerのブロック圧縮を有効にすること。これにより、SequenceFile.ReaderがFSDataInputStreamから約100KBのブロック単位でreadするようになる。 #hadoopreading
2010-08-19 12:21:51週末のテストが楽しみ。納得できる結果が得られたら、 HBase 開発チームに連絡して、 今回作ったプログラムの組み込み方法を検討しよう。 #hadoopreading
2010-08-19 12:23:16@tatsuya6502 SequenceFileのブロック圧縮を有効にすると妙に速くて関心したのですが、まさか読み込むブロックサイズが変化していたとは想像できませんでした。えー!
2010-08-19 12:31:53@m_mouri SequenceFileでは圧縮を有効にすると速くなるんですか。予想通りだ。ちなみに HFileで圧縮を有効にすると10〜20%遅くなりました。SequenceFileでは圧縮のデメリットよりも、ブロック単位のreadで高速化するメリットの方が大きいのかと。
2010-08-19 12:49:41@tatsuya6502 圧縮すると速いです。ただ、gzip圧縮は経験的にテキストだと1/5ぐらいになるので、てっきりボトルネックがDisk I/OからCPUに移動したと思い込んでました。BLOCK圧縮をONにして、codecをNONEにできると原因がはっきりしそうですが、
2010-08-19 12:57:19@tatsuya6502 クラスが用意されていないので、試すなら自分でorg.apache.hadoop.io.compress.CompressionCodecを実装する必要がありそうです。
2010-08-19 12:59:43@m_mouri なるほど!い い考えですね。何もしないコーデックを使うのが実は最高性能をだしそうです。RT: クラスが用意されていないので、試すなら自分でorg.apache.hadoop.io.compress.CompressionCodecを実装する必要がありそうです
2010-08-19 13:04:57