はどーぷ (grep)

最近 Hadoop を使ったプログラムを始めました。プログラミングのノウハウはつかめてきたのですが、どうにも不安な点がひとつあります。それは、Hadoop で作ったプログラムって本当に速いのかという点です。特に興味があるのは小規模クラスタ上で動かしたときの性能です。

というのも Yahoo! inc. や FaceBook のような世界規模のサービスを行っている会社であれば、Hadoop のために100台といわず1000台以上のマシンを Hadoop 専用に使用して、ログや社内で保持しているデータの解析がでるきでしょう。しかし一方で多くの会社ではせいぜい 5~10台程度の計算機しか使えないと考えるためです (5台もログや内部データの解析に使えないという話もありますがw) 。

このような実験には PFINTTレゾナントが行った実験 (http://dev.pg-feed.com/data/frame_180098.html) があります。このなかで彼らは Hadoop に付随するサンプルツールを用いて計算機台数と計算時間との相関を調べています。彼らの実験レポートは網羅的になされていてすばらしいですが、 Hadoop をベースにしたプログラムと一般の Unix コマンドとの速度比較にも興味があります。

そこで Hadoop 用のプログラムを4台の計算機上で動かして同様な機能を持つ Unix コマンドと比較してみました。具体的にはHadoop パッケージに付随する grep (hadoop-*-examples.jar grep) と grep コマンドの計算時間の比較を行いました。使用した計算機4台のうち 1 台はマスターノードとして NameNode と JobTrackerを動作させました。ネットワークは 1GBps のEthernet という環境です。テストデータは Hadoop パッケージに付随するランダムテキストデータ生成ツール (hadoop-*-examples.jar randomtextwriter) を用いて 約 30G バイトのデータを生成しました。

結果 grep -c 'chordacentrum se[rbm]' と正規表現にマッチする件数をカウントした場合が 11分14秒だったのに対して Hadoop 上に実装された grep は 6分47秒と高速に処理ができています。Hadoop 上に実装されている grep はマッチしたパターンを計算した上でパターンを出現回数でソートしているため、余分な計算が入っています。そこで hadoop に付随する grep プログラムを少々変更してソート計算をしないようにすると 6分21秒とちょっと速くなりました。とはいえ、この程度の差だと高めの計算機を導入すると grep コマンドのほうが速くなりそうではあります。

書き込み処理の方が HDFS の良さが出てきそうなので、今度は大量な書き込みを行う場合についての比較をしてみたいです。