GREE LabsでHadoopの話を聞いてきた
GREEさんで不定期でやってる、GREE Labsオープンソーステクノロジー勉強会で、Hadoopの話を聞いてきました。Hadoopは、つまりはGoogleのGFSやMapReduceのクローンだそうで、「Googleを支える技術」にトキメいた人なら必見ですね。
発表は、技術面を簡潔に押さえたうえでわかりやすく、そのうえ実際の利用事例の話も聞けたのが面白かったと思います。最近のWeb系では、サービス面でもマネタイズ面でも、データマイニングとか行動ターゲティングとかがアツいんだなぁと思いました。
プレゼン資料もust録画も公開されていますが、以下、自分のメモという意味で記録しておきます。
Hadoopについて(太田一樹)
Preferred InfrastructureのCTOで、Sedueの作者。大量のデータの処理がテーマで、半分は酒でできているw。そんなこんなで、はてブ検索でも使われている技術を作った。
HadoopとはGoogleの基盤ソフトウェアのクローンで、GFSやMapReduceを実装。ていうか、作者はGoogleの論文を見て実装した。ぜんぶJava。実装を見て、Yahoo! Reserchが作者をスカウトしたんだとか。ちなみに、ぬいぐるみの名前が由来。
参考としては、Codezineに記事を書いたのでそれとか、NTTレゾナントと共同で、実用性まで解析した資料を公開したとか。
まず問題として、インターネットの爆発的普及により、超大規模なデータが蓄積されている。超すごい。読み込むだけで100日かかったりする
なので、とにかく大量のマシンを用意したりするけど、起動、監視、通信、デバッグ、最適化など、プログラミングが非常に困難になる。
スパコンの世界では、MPIという、並列プログラミングのためのライブラリが主流だったりする。だけど、耐障害性への考慮が少ないし、プリミティブな処理しかしてくれない。
そこでMapReduce。めんどうなことをやってくれるフレームワーク。ジョブはよく死ぬが、処理は続く。
MapReduceは、Map、Shuffle、Reduceの3つのフェーズで動く。入力は、keyとvalueのペア、つまりハッシュ。ワードカウントの例でいうと、入力で1単語ずつ入ってきたものが、MapperのMapフェーズで1単語ごとに「foo: 1」みたいな単位に分解される。ReducerのShuffleフェーズがキーごとに同じReducerにまとめて分散、それを受けてReducerのReduceフェーズが加算して、まとめるとワードカウントが完成する。
MapReduceがうまくはまる処理には、grep、sort、ログ解析、Webのページ構造のグラフ化、転置インデックス作成、機械学習(つまりはてブの自動分類など)がある。機械学習については、ApacheのMahoutライブラリも登場してwktk。
Hadoopは、GFS相当のHadoop Distibuted File System(HFS)とHadoop MapReduceからなる。HFSは、MasterとSlaveからなり、ブロック単位(デフォルト64MB)で情報を管理。MasterはNameNodeと呼ばれ、メタデータを管理する。SlaveはDataNodeと呼ばれ、データ本体を管理する。NameNodeがsingle point of failerや負荷になる危険性もある。
Hadoop MapReduceは、これもMaster - Slave構成。ジョブを割りふるJobTrackerと、各ジョブを実行するTaskTrackerからなる。JobTrackerは、TaskTrackerを監視して、死んだノードの処理はほかに振り直すといったこともやる。
Hadoop自体はJavaで作られてるけど、Hadoop Streamingというのもある。標準入出力をインターフェイスとしてMapReduceのノードを作れ、map.rbとかreduce.rbとか書ける。
実例としては、まずもちろんYahoo!。2,000ノードぐらいのシステムを利用して、検索、広告、ログ処理、データ解析など、Information Retrievalに使っている。
AmazonやFacebookも、400ノードぐらいのシステムで使っている。ほか、行動ターゲティングの解析をしている会社が使っている。
国内では、Preferred Infrastructureが新はてブの解析システムに導入した。ほか、相談をもらうケースでは、Luceneを高速化したいとか、ログ処理が遅いとか、CellのクラスターでSPUにノードを割り当てている人とかがある。
- Q: 分散ストレージとしてだけ使っている事例はあるか
- A: 某キャリアの事例
- Q: Hbase(tableのやつ)はどうか
- A: 動きませんでした
- Q: テキスト処理がメイン?
- A: はい。ただ最近Facebookが、Hiveという、SQLの裏でMapReduceするのをやっている
- Q: Hadoopにする処理の目安
- A: 10Gや20Gなど、Luceneでは何十時間かかるデータ
- Q: GFSはファイルのappendができるがHadoopはできないとか。ログ解析はappendだと思うが
- A: たとえば1G単位とかで処理する。あと、0.19ではappendが追加された。
- Q: MapReduceは可用性より分散?
- A: 両方あるとは思うが、可用性はまだそれほど実例がでていないので(Yahoo!さんしだい?)
- Q: DBで大きなデータがあって、Hadoopで解析するとき、同期は
- A: 大きなデータでは同期はしない。たとえば数時間に1度ダンプしてきて処理するようにする
- Q: 1台でできる処理をHadoopにしたとき、性能は
- A: 単体で済む処理はそちらが速い。起動などでオーバーヘッドがある(10〜20秒程度)。そのオーバーヘッドを乗り越えられる処理はHadoopで
HadoopとEC2による「安くて簡単」大規模データ処理(Tsutomu Okura:大倉努)
日本中のブログを収集し、著者のプロフィールを推測し、各属性で話題になっているキーワードを分析する「blogeye」を開発した人。Haddoop+Amazon EC2+Amazon S3を使いまくっている。
もともとデータマニングアルゴリズムを研究していて、適用対象としてブログを選んだ。日本のブログは1千万ちょっとで、blogeyeを1年やって2億記事ぐらい集まった。これを処理するのに、学生なのでお金も手間もかけられない。でもアルゴリズムは手軽に試したい。そこでHadoop+EC2+S3。導入コストは0。従量制だけど、EC2からS3の読み書きはタダ。
Hadoopは動的にノードの追加や削除ができるのがいい。大きなジョブがあるときだけECのノードを増やせる。HadoopのS3ライブラリもあり、安定している。
blogeyeでの利用。S3は読み書きが遅いので、キャッシュやクロールデータはMySQLに。属性推定ジョブにHadoopを使いまくり。普段は4ノードだけど、属性推定ジョブを動かすときには80ノード。
クロールは、レスポンスがこなかったりとか、大量のレスポンスが来たりとか、危ない処理。なので、MasterではやらずSlaveにして、死ぬときにはそのスレッドだけにする。
インデックスはMySQL+Senna。クエリーはフロントエンドにインデックスのレプリカを置いてそこで受ける。できるだけ多くの処理をインデクシングで並列に済ませておく。
なんといっても一番がんばってるのが著者属性推定ジョブ。MapReduceを使って、ページ単位からサイト単位にデータ単位を変換、サイトをキーにしたページのハッシュを作り。それをReduceで処理する。80ノードで2日かかり、Amazon代が4万円。
Hadoopは優先度を設定できるようになったので、たとえば、最新記事をリスティングするサイトは、時間をはずせないので優先度をあげるといったことができる。
困ったところは、HadoopのデフォルトではMapと同時にReduceも開始されること。ジョブによってMapの処理時間が違うので、Reducerが終わっても次のReduceが始められないということにもなる。というわけで「スケジューラーをいじってみるといいかも」とか(やってるということかな?)。
- Q: Shuffleフェーズは?
- A: Mapperでは各データをコンテナに入れてReducerに送る。Reducerが定期的にMapperに問い合わせて、そろったデータがあれば転送されて処理する
- Q: 学習アルゴリズムは、最初は人力? 文体とかで判断?
- A: 両方とも、はい。Hadoopの中では「この単語があれば何パーセントで女性」のような、いちど学習させたデータを元にしている
- Q: 80ぐらいのノードで、EC2とS3のバランスは
- A: 実はバランスをとっていない。サイズを自由に変えられる。EC2にデータを持つと落ちたときに消えるので、念のためすべてS3に
- Q: いままでいくらぐらいAmazonに貢いだかw
- A: 1年で40万円ぐらい。いまはとある企業のサーバーに
- Q: 著者属性推定処理のためだけにHadoop?
- A: ふだんはクローラーや、各種アルゴリズムの研究。同じクラスター内で
- Q: EC2のVMには種類がいろいろあるが、どれを?
- A: 1年前は1種類しかありませんでしたw。たぶん速いマシンでも意味はない…そんなことはないかなぁ…場合に応じて(悩む)。あと、1台のマシンで複数のジョブを走らせたほうがいい。CPUをよく使うジョブと、I/Oをよく使うジョブとをまぜる。
- Q: 台数を増やすのは簡単?
- A: スクリプト一発でできた
- Q: Hadoopの障害や欠点
- A: 1年で2回、Hadoopを再起動した。マスターでクローラを動かしてハマったときと、もう1回は忘れたw。優先度を設定できなかったのが最初困ったけど、さっき言ったように、できるようになった。あとは、これもさっき言ったように、Reducerの起動を変えるオプションはあってもいい。そうそう、ログが巨大になりローカルディスクがいっぱいになるのは注意。
- Q: これじゃなくちゃと思った理由
- A: 計算力の必要なときとそうでないときの差が大きいこと。
コメント
コメントの投稿
トラックバック
http://emasaka.blog65.fc2.com/tb.php/505-39b8c6f8
