1

私は SQL Server のバックグラウンドを持っているため、HBase に関しては初心者ですが、このテクノロジは私たちが行っていることにうまく適合しているように見え、コストも間違いなく適切です!

通常は RDBS で次のように作成するログ エントリのリストを維持する必要があります。

create table Log ( UserID int, SiteID int, Page varchar(50), Date smalldatetime )

この単純なテーブルでは、1 人のユーザーが 0 行または 1000 行を持つことができます。典型的なクエリは、1 人のユーザーのすべての行、または 1 つのサイトの 1 人のユーザーのすべての行を検索することです。

これは、「行キー」がなく、同じ (SiteID,Page) が何度も表示される可能性がある HBase の「マップ」にどのように変換されますか。私が最初に考えたのは、UserID は行キーであるということですが、1 つの UserID が複数の (SiteID,Page ,Date) 「行」。

どんな方向でも大歓迎です!

4

3 に答える 3

1

私の提案は、UserIdを Rowkey として指定することです。複数の列ファミリーを不必要に指定すると、シークにかかる時間が長くなるだけなので、任意の単一の列ファミリーを指定し、列修飾子としてsiteId|dateを指定して、常に一意で値が常になるようにすることをお勧めします。その修飾子があなたのページになります。

RowKey Qualifier                       Value

001    C:site001|25/01/2013:6:17:17    www.example123.com/home
001    C:site001|25/01/2013:6:17:18    www.example123.com/about
001    C:site002|25/01/2013:6:30:17    www.example1123.com/
001    C:site003|25/01/2013:6:32:18    www.example1123.com/contact
002    C:site001|25/01/2013:2:22:17    www.example123.com/home
003    C:site001|25/01/2013:3:12:18    www.example123.com/about
003    C:site003|25/01/2013:5:30:17    www.example1223.com/
003    C:site004|25/01/2013:6:32:18    www.exampleABC.com/contact

`

それがうまくいくことを願っています!

于 2013-01-25T12:45:14.450 に答える
0

1 つのアプローチは、ユーザー ID + サイト ID から複合行キーを作成することです。

特定のページに必要な数のログ エントリを維持するようにテーブルを設定し、データを毎回新しいバージョンとして保存します (必要に応じてタイムスタンプを手動で設定します)。

HBase は各セルのタイムスタンプを維持するため、アクセス時間用に個別の列は必要ありません。

したがって、次のような内容のテーブルがあります

Row             Page

user1:site1     www.example.com/index.html@1234567890
                www.example.com/somepage.html@123456800
                www.example.com/someotherpage.html@123456900
                www.example.com/index.html@123457123

user1:site2     blahblah

user2:site1     etc...

2 つのサンプル リクエストに対処するには:

すべてのユーザー行を見つけるには、userx:0 から userx+1:0 までスキャンを実行し (必ず maxVersion を設定してください)、各結果行からサイト ID を解析します。

特定のユーザー/サイトのすべてのページを取得するには、userx:sitex から userx:sitex+1 までスキャンします。最後に、get で maxVersions を設定できないことを確認したので、それはオプションではありません。

簡単に言えば、列ファミリーは一緒に保存したいデータのグループを表します...おそらく、それらからデータを同時に読み取ることがかなり頻繁にあるでしょう。列を別々のファミリに配置すると、データが別々に保存されるため、1 つの列のみが必要な場合は読み取りが速くなりますが、両方の列を取得するには 2 つの異なる場所を読み取る必要があります。

もちろん、他のニーズによっては、別のアプローチを取りたいと思うかもしれません。HBase の構造をよりよく理解するために、big table paper を読むことを強くお勧めします (bigtable に強く基づいているため)。

HBase の内部をよりよく理解するには、Lars George のブログも役立ちます。

于 2010-05-15T10:40:34.540 に答える