1. ホーム
  2. java

[解決済み] なぜHbaseにカラムファミリーが必要なのか?

2022-02-14 23:15:07

質問

コラムファミリーを持つ理由は何ですか?例

シナリオ1 :

Table Row-Key ColumnFamily1 ColumnFamily2 ColumnFamily3

シナリオ2 :

Table1 Row-Key Column1...ColumnN
Table2 Row-Key Column1...ColumnN
Table3 Row-Key Column1...ColumnN

シナリオ1では、1つのテーブルは多くの列ファミリーを持つことができますが、すべての列ファミリーは別々に保存されます。では、なぜカラムファミリという概念そのものがあるのでしょうか?なぜ、単純にシナリオ2だけではダメなのでしょうか?シナリオ2でも、HBaseが提供する機能をブロックしているわけではありません。動的なカラムを後から追加することも可能です(他の機能も)。

私の唯一の懸念は、カラムファミリーが別々に保存されている場合、なぜそれらが同じテーブルにあるのか、ということです。私は、カラムファミリーを持つ意図は何か(どんな問題を解決するのか)にしか興味がないのですが。

どのように解決するのですか?

テーブルの定義は、論理的に一緒に属しているデータのための組織の単位です。 列ファミリは、アクセスパターンに基づいてパフォーマンスを最適化するために、テーブル内に部分構造を作成する方法を提供します(これが解決する問題です)。

現実的には、テーブル内のカラムファミリーは別々のファイルに格納されますが、HBaseがある行のすべての値を同じリージョンに格納するという意味では、それらは「近接」して格納されることになります。これには、カラムファミリーの別ファイルも含まれる。 これらは別々のファイルに格納されていますが、同じリージョンサーバによって所有されています。

対照的に、データを異なるテーブルに分割した場合、同じ "行" の一部が異なる HBase リージョンに存在し、それらにアクセスする際にクラスタ内の異なる Region Server で検索するオーバーヘッドを支払うことになるのです。

そのため、データの一部をカラムファミリーではなく別のテーブルに置くと、データの管理が難しくなるだけでなく、HBaseが持つ多くのパフォーマンス上のメリットを失うことになります。