1

Stackoverflow コミュニティが、私の問題を解決するテクノロジ (つまり、HBase、Raiku、Cassandra など) を提案してくれるのではないかと思います。リアルタイムで更新してクエリしたい大規模なデータセットがあります。これは数十テラバイトのオーダーです。データセットは、ユーザー ID と 1 つ以上の機能 (通常は約 10) を含むピクセル ストリームです。可能な機能の総数は数百万です。

データモデルは次のようになると想像しています。

FEATUREID_TO_USER_TABLE : 機能 ID -> {UserID ハッシュ、UserID ハッシュ、...}

FEATUREID_TO_COUNTER_TABLE : 機能 ID -> { エピック以降の時間 -> HyperLogLog バイト blob }

ユーザー ID のハッシュによってソートされたユーザー ID のセットを保持したいと考えています。また、新しい ID のハッシュ値が低い場合に古い ID を削除する FEATUREID_TO_USER_TABLE エントリごとに最大で 200k を保持することも好みます。

ストアで次の操作をサポートする必要があります (必ずしも SQL で表現されているわけではありません)。

select FeatureID, count(FeatureID) from FEATUREID_TO_USER_TABLE where UserID in 
(select UserID from FEATUREID_TO_USER_TABLE where FeatureID = 1234)
    group by FeatureID;

update FEATUREID_TO_COUNTER_TABLE set HyperLogLog = NewBinaryValue where FEATUREID_TO_COUNTER_TABLE.id = 567

このデータをマシン間でシャーディングする最も簡単な方法は、ユーザー ID によるものだと考えています。

アイデアをありがとう、マーク

4

2 に答える 2

0

Cassandra はデータを永続化するための優れた選択肢ですが、リアルタイムで処理するには別の方法が必要になります。Stormをチェックすることをお勧めします。比較的簡単にリアルタイムのストリーミング データ処理ができるからです。これは、同時実行と並列化を処理するオープン ソース フレームワークです。これは JVM で書かれていますが、JVM 以外のさまざまな言語の言語バインディングも備えています。

于 2012-10-10T14:09:14.697 に答える
0

私はあなたの説明全体を理解しているかどうか確信が持てないので、状況に応じて少し暗い場所で撮影しています.

パーティションにクエリできるようにデータをパーティション分割する方法はありますか? これは、スケーリングに伴うスケーラビリティとクエリに大いに役立ちます。通常、大きすぎるテーブルにクエリを実行したくないため、代わりにパーティションにクエリを実行します。

すなわち。PlayOrm には cassandra のパーティショニング機能があるため、1 つのパーティションにクエリを実行できます。

PlayOrm には結合クエリもありますが、現時点ではサブセレクトは行いませんが、通常、クライアントは nosql ストアへの最初の呼び出しを行い、結果を集計して 2 番目のクエリを実行しますが、それでも非常に高速です (おそらくいずれにせよ、cassandra でさえ他のサーバーに対して内部的に 2 つの呼び出しを行う必要があるため、1 つの呼び出しを行いました)。

うーん、あなたの投稿を読めば読むほど、主キーですべてを実行できる可能性があるため、そこに SQL を記述すべきかどうかわかりませんが、100% 確実ではありません。その SQL は、行内のすべてのユーザー ID を取得し、それらをカウントするだけなので、混乱を招きますか???? 選択と副選択の両方で同じテーブルなので?

データのシャーディングに関しては、cassandra が自動的に行うため、何もする必要はありません。

于 2012-10-10T14:15:47.947 に答える