4.2.3 NameNodeの役割
NameNodeはHDFS全体を管理する役割を担う。
1.メタデータの管理
どのブロックがどのおファイルのどの部分であるかという情報を記録している。
メタデータはメモリ上で管理しているので、瞬時に応答を返すことができる。
2.HDFSの使用状況の確認
各DataNodeにおけるHDFS用の領域の使用状況を管理、メンテナンスする。
ブロックのレプリカの数も管理している。
3.クライアントからのHDFSの操作を受け付け
クライアントからのリクエストがNameNodeに到着すると、保持しているメタデータを元に、対象となるブロックを持つDataNodeのリスト
をクライアントに伝える。クライアントはその情報を元に各DataNodeとやり取りをすることになる。
4.DataNodeの死活監視
DataNodeは、一定の時間間隔でNameNodeに対し、自身の生存を伝えるためにハートビートと呼ばれるパケットを送信する。NameNodeはハ
ートビートを受信できなくなったDataNodeを故障したノードとみなす。
4.3.1 HDFSにファイルを書きもむ
HDFSにデータを書き込む際、書き込みの最初と最後、およびエラー発生時にのみNameNodeと通信する。
また、書き込むにあたって、書き込む対象のデータをパケット単位で管理する「データ送信キュー」と書き込みの状態を管理する「ack待
ちキュー」という2本のキューを用意し、それぞれ別スレッドを立てて管理する。
1.Client ServerからNameNodeに要求し、書き込み用のストリームを受け取る。
2.受け取ったデータを「パケット」単位でデータ送信キューに挿入し、NameNodeに要求してパケットの書き込み先のデータノードのリス
トを受け取る。
※このリストから、レプリカ数と同数のDataNodeを数珠つなぎにした「パイプライン」を形成する。
3.パケットをDataNodeに書き込む。とともに、ack待ちキューにもパケット保存しておく。
4.DataNodeにパケットを転搬したら、DataNodeからack待ちキューに通信し、対応するパケットが「ack待ちキュー」から削除される。
※パイプラインに沿ったデータの書き込みはノード間で非同期に進むが、パイプラインをクローズする際には、そのブロックを書き込み
がすべて完了してackが帰ってくるまで待つ。
障害発生時の対応::二つキューとパイプラインの組み合わせて復旧し対応する。
4.3.2 HDFSからファイルを読み出す
1.Client ServerからNameNodeに要求し、読み出し対象ブロックとDataNodeのリストをもらう。
2.DataNodeからブロックを読み出す。
4.4.1 メタデータに含まれる情報
1.ファイルの属性情報やディレクトリ構造などのファイルシステムイメージ
2.DataNodeとブロックの対応情報
「ブロックレポート」仕組み:DataNodeは、デフォルト3秒おきにNameNodeにハードビート通信を行うタイミングに、自身が管理している
ブロックをNameNodeに申告する。
NameNodeはそれをもとにメタデータ内にDataNodeとブロックの対応情報を構築しレプリカ数が足りているかを判断する。
4.4.2 fsimageとedits
「fsimage」:メモリ上で管理しているメタデータ内のファイルシステムイメージは「チェックポイント」と呼ばれるタイミングで
NameNodeのローカルシステムに書き出される。出されたファイルシステムイメージはfsimageという。
※チェックポイントは、デフォルトで60分一回の頻度である。頻繁すぎると、大量なディスクI/Oが発生するので、パフォーマンスに影響
する可能性がある。
※ただ、DataNodeとブロックの対応情報は書き出されていない。
「edits」:ファイル操作の度に編集ログがNameNodeのメモリとローカルシステムに書き出される。このうち、ローカルファイルシステム
に書き出される編集ログは「edits」という。
※editsは一回操作するログのサイズが多くない、かつシーケンシャルに書き出すので、パフォーマンスに影響しない。
fsimageとeditsの組み合わせて、HDFSのファイルシステムイメージを最新の状態に維持できる。(メモリ上ではなく、ローカルシステム
上!)