Hadoop

Hadoop File System



を読んでみた雑感.Hadoopは,Google File SystemとGoogle Map ReduceをJavaで実装しましょうという試みですね.



で,ひとまず,上記のHPにHadoop Distributed File System(HDFS)があったので読んでみた.気になった点のみ.



・概要

登場コンポーネントは,DataNodeおよびNameNode,Clientになります.NameNodeは,FsImageと呼ばれるメモリ上のテーブルを持っています.FsImageには,HDFS上の仮想ファイルシステム(勝手に名づけた)の情報があります.具体的には,ディレクトリ構造やファイルのブロックマップなどです.ブロックマップというのは,格納の仕方を話さないとわからないですね.NameNodeは,どのデータがどのDataNodeに格納されているかだけしか知りません.NameNodeは,ただひとつのみ存在し,DataNodeはいくつもあります.何らかのファイルは,64MBのブロックに分割されて適当なDataNodeへ書き込まれます.このときの戦略は,例えば,レプリケーションが3であれば,オリジナル一つ,ラック内に1つ,ラックの外にひとつというように配置します.そうすることで,一度に3つのサーバが故障しない限りデータを再構築することが可能になります.



さて,NameNodeがDataNodeをどのように管理するかというと,DataNodeからはHeartBeatsとともに自分の管理しているデータをNameNodeに一定間隔(30秒とか)で送ります.NameNodeからRPCを呼び出したりすることは無いように作られています.このHeartBeatsが飛んでこなかった時点で,そのDataNodeは死亡したことにして,今後一切アクセスさせません(クライアントやmapreduceのオブジェクトが取りに来たとしても.).これは中々面白い割り切りだと思う.



あと,clientから書き込まれたデータは,64MBブロックを超えない限り,client側のバッファでキャッシュされます.64MBに満たないファイルが書き込まれるのは,ファイルがクローズしたときのみになっています.なので,実際に書き込む前にNameNodeがいなくなったら,データは消えてしまいます(と書いてあると思う).



で,FsImageは,DataNode上にあるブロックとHDFS間のマッピングを行い,EditLogは俗に言うジャーナルです(説明を見る限りはそう思う).なので,FsImageが実際にdisk書き込み完了した時点で,EditLogはtruncate(この場合,ファイルを0に縮めること)を行います.このようなトランザクションのタイミングをチェックポイントといいます.データベースと似たような感じです.



実際にデータブロックを受け取っているときに,DataNodeがクラッシュした場合に備えて,チェックサムを取っています.まぁ普通ね.



レプリケーション(データブロックの複製のこと)は,パイプライン的に行われます.



...面白い.