2011年9月12日月曜日

読書日記「Googleを支える技術」

ちょっと分散システムの仕組みについて復習してみたかったので、昔読んで面白かった本を引っ張り出してみました。Googleの大規模検索システムが、どのような仕組みで動いていいるのかを、検索エンジンのクローリングやインデクシングから分散システムのハード(データセンターなど)とソフト(データベースやデータ処理)、さらにおまけで開発手法まで説明した本です。Googleのオフィシャルな本ではないですが、Googleの大規模検索システムの概要をとても分かりやすく易しく説明しています。コンピュータサイエンスのバックグラウンドがあれば専門領域が違っても一日で理解できるくらいの内容です。




今回は分散処理の仕組みだけチェックしておきたかったので、3章の「分散ストレージ」と4章の「分散データ処理」の部分を中心に読みました。Googleのシステムはデータやその処理を複数のコンピューターに分散することによって高速化やデータの扱う大規模化を図っています。また、処理を分散させるためのデータのコピーや、ハードウェアが壊れた時のフェイルオーバー機能をもたせており、2章と3章ではそれら仕組みが説明されています。

3章の「分散ストレージ」ではGFS、Big TableとChunkという3つの分散ストレージを紹介し、データの分散方法や、多重化されたデータベースに対するアップデート、エラー時の対応などが説明されています。

GFS
ハードディスク上のデータの大容量化、分散化を可能にする技術です。チャンクと呼ばれる細かい単位に分けられ、マスタによって場所などが保持される。データの読み込みはマスタにデータの場所を問い合わせるのみで簡単に行うことができる。ただ、書き込み時にはロック機能がないため不整合が起こる可能性がある。その代わり、ファイル末尾にレコード追加するような機能を備えており、これだとアトミックな操作はできるが同じデータを重複して書きこむ可能性もある。読み込み、書き込みともにスケールアウトするが、書き込み時にはデータ多重化のためにチャンクのコピーを伴うため読み込みより時間がかかる。

Big Table
ある程度構造化された大規模データを扱うためのテーブル。他のテーブルとのリレーションは持たないが、フィールドにはどんなデータでも格納できるというデータ構造。行キーのカラムキーとタイムスタンプの3つによってデータを特定することができる。ロックは行単位でのみ可能。データはタブレットと呼ばれる単位で分散して格納され、マスタによって管理される。タブレットへの書き込み操作はmemorableというログにジャーナルされ、それがある程度のサイズになったところで新しいタブレットが作られて、タブレットの分割や結合が起こる。

Chunk
ロックとイベント通知の機能を備えた小規模データ向けのストレージ。GSFやBig Tableなどの外部リソースのロック制御や、DNSとして使われている。レプリカと呼ばれるマシンで5重に多重化されており、その一つがマスタとして働く。

4章の「分散データ処理」ではMapReduceによる分散処理の仕組みの説明や、Sanzallという簡単にMapReduceの仕組みを使うためのスクリプト言語について説明しています。ほぼマシン台数に応じて比例してスケールするというかなり優秀な結果がでているそうです(サーバを50台から600台に増やしても1.3倍程度しかトランザクションが増加しないらしい)。

MapReduce
言わずと知れた分散データ処理技術です。データはKeyとValueのセットで扱われ、Map、シャッフル、Reduceという3つのステップにより行われます。Mapが個々のデータに対して分散して処理を行い、シャッフルが処理を終えたデータからKeyに応じてデータの並び替えを行い、ReduceがKeyごとにデータを集約し書きだすという仕組みのようです。

Sanzall
MapReduceの仕組みを使うためのとても簡単なスクリプト言語です。Map処理をスクリプト内に書き、Reduce処理はアグリゲータと呼ばれるパラメータ(Sum, Maxなど)を指定すると自動的に行われるようです。インプットとアウトプットのレコードを実行時に引数で指定すると自動的にGFS(BIG Table)からデータを読み込み、指定したMapReduceの処理を分散して行い、GFSへ結果を書き込みます。本書にいくつかプログラムの例があるのですが、使い方はとても簡単で、分散処理どころかプログラミングの経験すらない人でも簡単にデータ処理ができてしまうと思います。

MapReduceの分散処理のアイデア自体はとても単純なものだけれども、しっかりスケールアウトさせるためにどうデータやトランザクションを効率的に分散させるかであったり、エラー時や機器の故障時にも処理をとめることなくファイルオーバーさせる技術は、(本書ではコンセプトしか説明していませんが)とても複雑であることがよく分かります。その複雑な部分を隠蔽して、単純なスクリプトで扱えるようにしてしまう点には感心しますね。

本書はGoogleを支えているシステムの基本的な技術を知るにはとても良い本だと思います。完全に読み物的な本で、著者もGoogleのシステムに触れるわけではなく、コードの例が豊富にはなかったのでコードレベルでのイメージがしにくかったのがちょっと残念ですが、その辺りはHadoopをちょっと勉強してカバーしたほうがいいかもしれないですね。少なくともGFSやMapReduceに対応する仕組みがどのようなもので、どうやって使うかくらいは簡単に把握しておこうかな。

0 件のコメント: