6

userIdで識別されるユーザーによって生成されたイベントを保存する必要があります。各ユーザーは、companyIdで識別される会社に属しています。次のように、HBase のテーブルのデザインを考え出しました。

rowkey : < companyId >< userId ><タイムスタンプ>

column-family : info (以下に示すイベント属性のセットをカプセル化)

: <属性1 >、<属性2 >....<属性>

このキーの設計により、部分的なキー スキャンを使用して、 companyIduserIdで後でデータのクエリを実行しやすくなることがわかっています。そうは言っても、いくつかの質問と懸念があり、いくつかのアイデアを得たいと思っていました。

1- 時間範囲を指定してすべてのデータを読み取る読み取りユース ケースがある場合、この現在の設計では、rowKey を使用できません。代わりに、フル スキャンを実行し、タイムスタンプ フィールドの行をフィルター処理する必要があります ( attr列の 1 つとして個別に保持されます)。

2-重複を処理する方法は? その場合、HBase が行の新しいバージョンを作成することはわかっていますが、1 で述べた読み取りユースケースに従って、後で読み取ることができますか? クエリを実行するときにバージョンを制御できることはわかっていますが、それは良い設計になるのでしょうか、それともネイティブ機能を誤ってオーバーロードするのでしょうか?

3- これは地域サーバーのホットスポットに関するものです。モノリシック キーはありませんが、特定の企業またはユーザーが非常にアクティブである場合、この問題に遭遇する可能性があります。この場合、サーバーの数に基づくハッシュとバケット化は機能しませんか? タイムスタンプ フィールドをハッシュして、それを元の値ではなく、rowKey に追加するとしたらどうでしょうか。しかし、問題は、キーのタイムスタンプ コンポーネントをスキャンできないことです。それをキャプチャするには、列に別の列 (attr) が必要です。助言がありますか?

提供できる情報 (コメント、リンク、本、アイデア) に感謝します。

4

1 に答える 1

3

1: ユースケースを読む

ユースケースによって異なります。

  • 特定の時間範囲で組織のすべてのユーザー データを取得したい場合、私には正しいと思われるので、すべての組織データに対してスキャンを実行する必要があります。

  • 特定のキーのすべてのデータを読み取りたい場合は、現在のキー デザインは問題ないようです。組織とユーザー ID の位置を反転して、新しいキーを作成します ( rowkey : userId-companyId-timestamp )。これは、独立したユーザーからのデータがバラバラであるため、これらを結合する必要がなくなります。

  • 上部にタイムスタンプをプッシュすると ( rowkey : timestamp-companyId-userId )、時間範囲で定義された場所で終了するすべての組織/すべてのユーザー情報に対してスキャンを実行できる場合があります (完全なテーブル スキャンをスキップします)。

2: 複製

注意: Hbase はデフォルトでセルの最大 3 つのバージョンを記録します (また、これらのバージョンのタイムスタンプを行キーのタイムスタンプと混同しないでください)。この制限を増やして、別のバージョンから結果をフェッチすることもできますが、このバージョン数を多くすることはお勧めしません。

以前に保存した値を上書きする場合は、保存した以前のバージョンの検索に頼らないことをお勧めします (ただし、これを実現する方法はあります)。以前に記録されたすべてのデータを保存/取得できる必要がある場合は、代わりに新しい列を使用して新しい値を保存することもできます。

3: 暑い地域

  • 会社が非常に活発な場合は、companyId-userId のハッシュを行キーに追加できます。これにより、任意の組織に書き込みが分散されます。

  • ユーザーが非常にアクティブで、すべてのデータを最適な方法で取得するユースケースがある場合、キーまたはタイムスタンプをハッシュすることが適切な解決策であるかどうかはわかりません。ユーザーのデータを一緒に保持したいのは間違いありませんが、ここでのより良い解決策が何であるかはわかりません。

あなたの問題をどのように理解しているかに基づいて、おそらくROWKEYHASH(companyId-UserId)-companyId-UserId-Timestampとして設計します

于 2013-04-12T21:36:33.703 に答える