Hadoop合宿を行ないました

現在の会社(エスプランニング)では、今年から蘭越町に保養所でキャンプや様々なイベントを行っているのですが、その中の1つとして開発や研修などを行うために数日間の合宿を行うことがあります。今回、@niku_name と @irasally と3人でオライリーHadoop本を読み、分散処理についての基礎知識を深めるという目的で山篭りをしてきました。

尚、3人とも本を8章まで予習してから臨みます。

1日目

朝から札幌は初雪で10cm近い積雪。はっきり言って死にたい気分で蘭越に出発。ニセコのちょっと先なので、札幌からは約2時間かかります。途中、倶知安で3日分の食材を購入し、ランチ。広華という中華料理屋ですが、なかなかの味でした。

保養所に到着したのが1時前くらい。室温が4℃くらいなのでまずはウォームアップw
2時くらいから輪読会(エクストリームリーディング形式)で開始。夕方くらいまでかけて1〜2章。1ー2章は自分の担当でしたが、まずはHadoopが必要となっている背景、つまり分散処理が必要なシーンが増えてきているという話、そしてそれをどう解決しなくてはいけないかという内容です。2章はMapReduceを簡単に説明し、MapperとReducerをこんなふうにJavaで書くという内容でした。この辺りはまだ簡単な内容です。

夕方には近場の温泉に行き、夕食は奮発してすき焼き!でした。

食後、夜の部ということで3章。3章は@niku_nameが担当でしたが、HDFS、つまりHadoop分散ファイルシステムの話です。ブロックを大きくとり、ディスクアクセスの頻度を減らしたり、複数のマシンに分散して保管するが抽象的なファイルシステムからは、それを意識しなくていいといった内容がかなり細かく説明されています。とはいえ、ここでは「ふーん」という感じで、内容としては7−8章あたりで一気に生きてきます。

ちなみに、ネームノードは重要。すべての問い合わせはネームノードが司令塔となるのです。もし、問い合わせであるノードが反応ない場合、ネームノードはそのノードを基本的には切り捨てて、別のノードにバックアップを増やして、しれっと生き続けるのがHDFSの思想です。

     ∩___∩     /゙ミヽ、,,___,,/゙ヽ
     | 丿     ヽ    i ノ       `ヽ'
    /  ○   ○ |    / `(○)  (○)´i、  ネームノード先生助けてっ!、
    | U  ( _●_)  ミ  彡,U ミ(__,▼_)彡ミ   データノードちゃんが息をしてないのっっ!!
   彡、    |∪| ,,/   ,へ、,   |∪|  /゙
   /  ヽ  ヽノ  ヾ_,,..,,,,_ /  '  ヽノ `/´ ヽ
   |      ヽ  ./ ,' 3  `ヽーっ   /    |
   │   ヾ    ヾl   ⊃ ⌒_つ ソ      │
   │    \__`'ー-⊃⊂'''''"__,,,ノ   |
               ` ̄´  ` ̄´

就寝は24時くらいと健全。

2日目

2日目は6時半くらいに起床。朝食をとったら8時には勉強会を開始。夜までビッチリです。

まずは@irasallyが4章をリード。内容はHadoopのI/Oということで、分散ファイルシステム上のファイルI/OのAPIを見つつ、圧縮やシリアリゼーションについて学びます。この辺りの内容ですが、どれも効率よく分散システムを作るために必要な素材です。悩む箇所もありつつ飛ばしていきましたが、7章や8章あたりで「なるほど〜」となり正解です。特に最後のSequenceFileやMapFileは凄く重要なんだけど、ここではあまりよく解らないかも・・・。

午後からは自分が5章をリード。内容としては2章で扱ったMapReduceのプログラムをもう少しアプリケーションらしくリファクタリングし、単体テストも作るという内容です。後半はクラスタを組んで実行する流れですが、時間と環境の問題でさらりと流しました。この辺り、もう少し実際にガツガツ動かして試してみたいですね。

夕方からは@niku_nameにより6章。MapReduceの細かい動作についての解説です。

ジョブの投入からMapの分割の流れ、ここはいかに効率よく分散処理ができるかの肝です。そしてReduceに渡される前にあるプロセスとしてのソートとマージ。2章や4章を読めばなんとなくMapReduceのプログラムを作ることはできますが、この部分を理解しているかどうかで、まともにスケールするアプリケーションになるかは変わって来る重要な部分です。
この辺は、Hadoopの細かい動きについてなのですが、様々な障害を想定されたシーケンスやハートビートに関しては学ぶところが多いです。そしてコードを読みながらもう1度確認していくと更に理解は深まるし、スキルアップにもなるところですね。

2日目の夕食はカレー。そして温泉。

夜は宴会・・・はありません。2日目は本当に丸1日Hadoop漬けです。
@irasallyが7章。今度はMapReduceのInputとOutputのフォーマットに関する話。
入出力については様々な形式が想定されますが、圧縮と分散の相性がよくない。うまく途中で切れて読めるような形式としてはZipくらいなんですね。2日目は7章の半ばでタイムアウトです。

3日目

3日目も8時くらいから読書会を開始。
まずは昨日の残りの7章。流石に疲れ果てていた2日目の深夜では厳しかった内容も、朝1ならばスラスラと入ってきます。この辺りから『何が解らないのかが解って』きて、議論が多くなってきた感じです。最初のうちはどうしても「何が解らないのかが解らない」状態ですから、手探りです。全体が見てきて色々と見る目が変わってきたわけです。

そしてラストの8章。自分がカウンターやソート・ジョインについてまとめました。特にソートの部分は重要で、Google App Engine/Datastoreを勉強していたことがここに生きていました。どうしてソートするのか?ソートしたキーを検索するにはどういう仕組みになっているのか?という点です。
また、この辺りでは3章や4章で学んだ基礎が生きてきて、すべてが繋がってきたという感覚です。

札幌への戻りもあるので午後には合宿の全日程を終了。3日間、勉強は丸2日ですが、非常に濃い内容を学ぶことができました。そして集中できた。たまに「山篭り」ということを冗談で話していますが、山篭りはいいです、オススメです。

今後

とりあえず、会社の研修でHadoopを学んできたわけですが、このままでは勿体無いです。是非、社外向けにも札幌でHadoopの勉強会をやろうと計画しています。
Hadoop本は非常に詳しく書いていますが、それでも前提知識無しに1人で読むには厳しい本です。特に先のほうで使うから前半で詳しく解説、という形は心が折れやすいです。興味があれば、是非、一緒にHadoopを学びましょう。