Hypertableにおけるデータ行ストレージの理解

2230 ワード

一、背景
HypertableはHadoopのHBAseと同様に分散型No SQLライブラリであり,本稿では著者らのHypertableに対する理解と結びつけて,このkey−valueストレージ形式のテーブルの理解について述べる.Hypertableの基礎知識については、著者が翻訳したシリーズ記事を参照してください.
以下の例はmytableという表に基づいており、表の定義は以下の通りである.
CREATETABLE mytable(
name,
score,
desc,
ACCESS GROUP default (name,score),
ACCESS GROUP desc(desc)
);

二、Hypertableにおけるテーブルの記憶
Hypertableでは、テーブルがどのように表現され、格納されているかが、このタイプのテーブルを理解する鍵です.
Hypertype内部に格納データのフォーマットはCellStore形式であり、CellStoreはHypertable操作ディスクの最小単位であり、デフォルトは64 Kであり、Hypertableを通過することができる.RangeServer.CellStore.DefaultBlockSizeはサイズを設定し、複数のCellStoreに必要なインデックスなどを加えて1つのCellStoreファイルを構成し、RangeServerは複数のCellStoreファイルを操作してデータを格納、更新する機能である.
Access Groupは、ドキュメントの理解からいくつかの列を一緒に保存する単位ですが、実際のストレージ構造CellStoreにどのように対応するかについては、ドキュメントの説明が見つかりません.【以下は個人的な理解】CellStoreがディスクIO動作の基本単位である場合、1つのCellStoreは1つのAccessGroup、すなわち1つのCellStoreの列しか保存できず、そのAccess Groupは同じである.1つのテーブルに2つ以上のアクセスグループがある場合、これらのアクセスグループは異なるCellStoreに保存されます.
テーブルはAccess Groupによって格納されるため、1つのテーブルに複数のAccess Groupがある場合と、そのテーブルを複数のテーブルに分割する場合は、Hypertableから見ても区別はありません.Doug自身が言ったように
Aside from the difference in query support, there is no difference between 1 table-multiple access groups and two tables.(Doug Judd)
三、データの挿入
Hypertableでは、リレーショナル・ライブラリとは異なるテーブルにデータを挿入します.まずInsertの構文を見てみましょう.
INSERT INTO table_name VALUES value_list

value_list:
    value_spec [',' value_spec ...]

value_spec:
    '(' row ',' column ',' value ')'
    '(' timestamp ',' row ',' column ',' value ')'

column:
    family [ ':' qualifier ]

timestamp:
    YYYY-MM-DD HH:MM:SS[.nanoseconds]

上の定義から、insertには2つのフォーマットがあります.
(row, column, value) (timestamp, row, column, value)
つまり、一度に1つしか挿入できない(key,value)ということで、表を作るときに、複数のリストと複数の2列(key,value)を作成する表を作成し、読み取り効率を考慮しないと、実は違いはありません.
システムのインデックスはtable_id:end_row_keyは、table idはテーブルの作成時にシステムが付与した唯一のテーブル識別番号であり、0番号はmetadata tableに保持される.end_row_keyは、レコードが指すtabletの最後の行のrow keyを表す任意の文字列である.
Hypertableが本当に上記のようにインデックスレコードを作成する場合、システムの観点から、システム全体が大きなテーブルであり、各レコードがこのテーブルに保存されます.異なるテーブル作成方式は、あるレコードがこの大きなテーブルに格納されている場所が異なることを表すだけです.