データノードはデータを保存します。リージョン サーバーは基本的に I/O 操作をバッファリングします。データは HDFS (つまり、データ ノード) に永続的に保存されます。「マスター」ノードにリージョン サーバーを配置することは良い考えではないと思います。
以下は、リージョンの管理方法を簡略化した図です。
レプリケーション係数 3 で HDFS (NameNode + DataNodes) を実行しているクラスターがあります (各 HDFS ブロックは 3 つの異なる DataNodes にコピーされます)。
RegionServer は、DataNode と同じサーバーで実行します。書き込み要求が RegionServer に来ると、最初に変更がメモリに書き込まれ、ログがコミットされます。その後、ある時点で、HDFS 上の永続ストレージに変更を書き込むときが来たと判断します。ここで、データの局所性が問題になります。RegionServer と DataNode を同じサーバーで実行するため、ファイルの最初の HDFS ブロック レプリカが同じサーバーに書き込まれます。他の 2 つのレプリカは、他の DataNode に書き込まれます。その結果、リージョンにサービスを提供する RegionServer は、ほとんどの場合、データのローカル コピーにアクセスできます。
RegionServer がクラッシュした場合、または RegionMaster がリージョンを別の RegionServer に再割り当てすることを決定した場合 (クラスターのバランスを維持するため) はどうなりますか? 新しい RegionServer は最初にリモート読み取りを実行するように強制されますが、圧縮が実行されるとすぐに (変更ログがデータにマージされます)、新しいファイルが新しい RegionServer によって HDFS に書き込まれ、ローカル コピーが RegionServer に作成されます (繰り返しますが、DataNode と RegionServer は同じサーバーで実行されるためです)。
注: RegionServer がクラッシュした場合、以前に割り当てられていたリージョンが複数の RegionServer に再割り当てされます。
良い読み:
Tom White の「Hadoop, The Definitive Guide」には、HDFS アーキテクチャの適切な説明があります。残念ながら、私は元の Google GFS 論文を読んでいないので、簡単に理解できるかどうかはわかりません。
Google BigTableの記事。HBase は Google BigTable の実装であり、この記事のアーキテクチャーの説明が最も理解しやすいことがわかりました。
Google Bigtable と HBase 実装の用語の違いを次に示します (Lars George の「HBase, The Definitive Guide」から)。
- HBase-ビッグテーブル
- 地域 - タブレット
- RegionServer - タブレット サーバー
- フラッシュ - マイナー圧縮
- マイナー圧縮 - マージ圧縮
- メジャーコンパクション - メジャーコンパクション
- 先行書き込みログ - コミット ログ
- HDFS-GFS
- Hadoop MapReduce - MapReduce
- MemStore - memtable
- HFile - SSTable
- 飼育係 - ぽっちゃり