0

Cassandra Hadoop 統合 (MapReduce) に取り組んでいます。RandomPartitionerより高速な書き込み速度を得るために、以前はデータを挿入していました。次に、MapReduce で Cassandra からそのデータを読み取り、計算を実行する必要があります。

cassandra にある大量のデータから、特定の行キーのデータのみを取得したいのですRandomPartitionerが、コードにアサーションがあるため、それを行うことができません。

Cassandraレベル自体の行キーに基づいてデータをフィルタリングする方法を教えてください(行キーのハッシュを使用してデータがリージョン全体に分散されていることを知っています)?

セカンダリ インデックスを使用すると (まだどのように機能するかを理解しようとしています)、私の問題は解決しますか、それとも別の方法がありますか?

Cassandra MR を使用して、cassandra に継続的に保存されているデータの KPI を計算したいと考えています。ここで、毎回cassandraからデータ全体を取得することは、私にとってオーバーヘッドのように思えますか? 私が使用している行キーは、「(timestamp/60000)_otherid」のようなものです。この CF には、他の CF に格納されている実際のデータの行キーの参照が含まれています。KPI を計算するには、特定の時間だけ作業し、他の CF からデータを取得して処理します。

4

3 に答える 3

2

RandomPartitioner を使用する場合、キーはソートされないため、キーに対して範囲クエリを実行してデータを制限することはできません。セカンダリ インデックスはキーではなく列で機能するため、どちらも役に立ちません。データをフィルタリングするには、次の 2 つのオプションがあります。

SlicePredicate次のように、キーに関係なく列の範囲を指定できる thrift を指定できるデータ モデルを選択します。

SlicePredicate predicate = new SlicePredicate().setSlice_range(new SliceRange(ByteBufferUtil.bytes(start), ByteBufferUtil.bytes(end), false, Integer.MAX_VALUE));
ConfigHelper.setInputSlicePredicate(conf, predicate);

または、マップ ステージを使用して、目的の範囲外の入力キーを無視するだけでこれを実行できます。

于 2012-12-11T20:51:46.330 に答える
0

基本的に、RandomPartitioner を引き続き使用し、範囲スライスを実行する機能が必要な場合は、逆インデックス (別名逆インデックス) を作成する必要があります。ここで、タイムスタンプに関する同様の質問に回答しました。

行キーをプログラムで生成できるため、行キーの範囲スライスをエミュレートできます。これを行うには、独自の InputFormat クラスを作成し、分割を手動で生成する必要があります。

于 2012-12-12T14:32:20.123 に答える
0

私は Cassandra Hadoop の統合に慣れていませんが、ハッシュ システムを使用して自分でデータをクエリする方法を理解しようとするのは、おそらく間違った方法です。

あなたが使用している Cassandra クライアント (Hector、Astynax など) を見て、そこから行キーでクエリを実行する方法を尋ねます。

行キーによるクエリは、Cassandra では非常に一般的な操作です。

于 2012-12-11T17:48:42.017 に答える