HBase
HBaseは、データをHFilesと呼ばれる大きなファイルに永続化します。これらのファイルはサイズが大きくなります(数百MBのオーダー、または約GB)。
HBaseが読み取りを行う場合、最初にmemstoreで、最近の更新または挿入からのデータがメモリ内にあるかどうかをチェックします。そのデータがメモリ内にない場合は、必要なデータを含む可能性のあるキーの範囲を持つHFilesを見つけます(圧縮を実行した場合は1ファイルのみ)。
HFileには多くのデータブロック(デフォルトでは64kBのHBaseブロック)が含まれています。これらのブロックは小さいため、高速でランダムにアクセスできます。そして、ファイルの最後に、これらすべてのブロックを参照するインデックスがあります(ブロック内のキーの範囲とファイル内のブロックのオフセットを使用)。
最初にHFileを読み取るときに、インデックスがロードされ、将来のアクセスのためにメモリに保持されます。
- HBaseは、インデックス(メモリ内で高速)でバイナリ検索を実行して、要求したキーを含む可能性のあるブロックを見つけます
- ブロックが見つかると、HBaseはファイルシステムに、ファイル内のこの特定のオフセットでこの特定の64kブロックを読み取るように要求できます。その結果、単一のディスクがチェックするデータブロックをロードしようとします。
- ロードされた64kHBaseブロックは、要求されたキーを検索し、存在する場合はキー値が返されます
小さなHBaseブロックがある場合、ランダムアクセスを実行するときにディスクをより効率的に使用できますが、インデックスサイズとメモリの必要量が増加します。
HDFS
すべてのファイルシステムアクセスは、ブロック(デフォルトでは64MB)を持つHDFSによって実行されます。HDFSでは、ブロックは分散とデータの局所性に使用されます。つまり、1GBのファイルが64MBのチャンクに分割され、分散および複製されます。データはそのチャンクで連続しているため、バッチ処理時間がディスクシークに費やされるだけではないことを保証するため、これらのブロックは大きくなります。
結論
HBaseブロックとHDFSブロックは別のものです。
- HBaseブロックは、HBaseのインデックス作成(およびキャッシングと圧縮)の単位であり、高速ランダムアクセスを可能にします
- HDFSブロックは、ファイルシステムの分散とデータの局所性の単位です。
HBaseパラメーターおよびニーズと比較したHDFSブロックサイズの調整は、パフォーマンスに影響を与えますが、これはより微妙な問題です。