8

HBaseが列ベースのストレージを使用しているのか、行ベースのストレージを使用しているのか疑問に思っていますか?

  • 私はいくつかの技術文書を読み、HBaseの利点は、列ベースのストレージを使用して同様のデータを一緒に保存し、圧縮を促進することです。つまり、異なる行の同じ列が一緒に格納されることを意味します。
  • しかし、HBaseがソートされたKey-Valueマップであることも学びました。キーを使用してそのキー(行)に関連するすべての列をアドレス指定するので、行ベースのストレージのように見えますか?

誰かが私の混乱を明らかにすることができれば幸いです。

よろしくお願いします、ジョージ

4

2 に答える 2

21

ジョージ、HBaseCon2012のHBaseスキーマの理解について私が行ったプレゼンテーションは次のとおりです。

http://www.cloudera.com/content/cloudera/en/resources/library/hbasecon/video-hbasecon-2012-hbasecon-2012.html

つまり、HBaseの各行は実際にはキー/値マップであり、それぞれに値を持つ任意の数の列(キー)を持つことができます。(そして、技術的には、それぞれが異なるタイムスタンプを持つ複数の値を持つことができます)。

さらに、「列ファミリ」を使用すると、同じ行の異なる物理(ディスク上の)ファイルで複数のキー/値マップをホストできます。これは、通常は他のセットから切り離してアクセスされる値のセットがある状況で最適化するのに役立ちます(したがって、ディスクから読み取るものが少なくなります)。トレードオフは、もちろん、列を2つの列ファミリーに分割する場合、必要なディスクアクセスの数が2倍になるため、行のすべての値を読み取る方が手間がかかることです。

より標準的な「列指向」データベースとは異なり、すべての論理列に列ファミリーを持つHBaseテーブルを作成している人のことは聞いたことがありません。列ファミリーに関連するオーバーヘッドがあり、一般的なアドバイスは、通常、3つまたは4つ以下にすることです。列ファミリーは「設計時」の情報です。つまり、テーブルを作成(または変更)するときに列ファミリーを指定する必要があります。

一般に、列ファミリーは、HBaseのアーキテクチャーを深く理解し、それが正味のメリットになることを示すことができた場合にのみ使用する高度な設計オプションであると思います。

したがって、全体として、HBaseが「列指向」の方法で動作できることは事実ですが、これはHBaseのデフォルトでも最も一般的なデザインパターンでもありません。キー/値マップを備えた行ストアと考える方がよいでしょう。

于 2012-08-05T13:58:23.733 に答える
2

Ianの優れた回答に加えて、 HBaseは行ベースのKey-Valueであると同時に、列ベースのKey-Valueストア(行キーを知っている場合)でもあると思います。

データ構造の観点から考えると、単純なHBaseテーブルは次のようになります。

'rowkey1' => {
    'c:col1' => 'value1',
    'c:col2' => 'value2',
},
'rowkey2' => {
    'c:col1' => 'value10',
    'c:col3' => 'value3'
}

もちろん、Ianのプレゼンテーションからわかるように、さらに複雑なデータ構造を格納することもできます。

于 2012-08-06T20:38:54.693 に答える