4

私は HFiles についてかなり基本的な疑問を持っていました。

put/insert リクエストが開始されると、値は最初に WAL に書き込まれ、次に memstore に書き込まれます。memstore の値は、HFile と同じソート方法で格納されます。memstore がいっぱいになると、新しい HFile にフラッシュされます。

ここで、HFile がデータをソートされた順序で格納することを読みました。つまり、連続した行キーは互いに隣り合っています。

これは 100% 本当ですか?

例: 最初に、行キー 500 を除いて、行キー 1 から 1000 までの行を書き込みます。memstore がいっぱいになったので、HFile1 という名前の新しい HFile を作成するとします。現在、このファイルは不変です。

ここで、行 1001 から 2000 を書き込み、次に行キー 500 を書き込みます。memstore がいっぱいで、HFile に書き込むとします。これを HFile2 と呼びます。

では、こうなってしまうのでしょうか。

はいの場合、行キー 500 は HFile1 にないため、HFiles の行キーはソートされていません。では、太字の元の文は正しいですか?

では、読み取りが発生した場合、読み取りはどのように行われるのでしょうか?

4

1 に答える 1

6

HFile は、データをソートされた順序で格納します。つまり、連続した行キーが互いに隣り合っています。

これは 100% 本当ですか?

はい、これは 100% 正確です。単一の HFile 内の RowKey は常にソートされます。

行 1001 から 2000 を書き込み、次に行キー 500 を書き込みます。memstore がいっぱいで、HFile に書き込むとします。これを HFile2 と呼びます。

では、こうなってしまうのでしょうか。

はい、これで 500 が 2 番目の HFile の先頭に到達しました。

はいの場合、行キー 500 は HFile1 にないため、HFiles の行キーはソートされていません。では、太字の元の文は正しいですか?

はい、単一の HFile 内の行キーは常にソートされます。HBase は、複数の HFile をマージして単一の HFile に書き換えるコンパクションを定期的に実行します。コンパクションの結果であるこの新しい HFile もソートされます。

では、読み取りが発生した場合、読み取りはどのように行われるのでしょうか?

読み取り時に、ストアに複数の HFile がある場合、HBase はすべての HFile からその行を読み取り (この行が存在するかどうかを確認し、存在する場合は読み取ります)、memstore からも読み取ります。そのため、最新のデータを取得できます。

HBase Definitive Guide には、HBase 読み取りパスがどのように機能するかについての非常に良い説明があります。

于 2014-11-02T21:44:55.950 に答える