2012-03-16 6 views
8

Cassandraで非常に長い行(1行あたり数十万〜数百万の列)を持つCFを実装しようとしています。長い行のCassandraのパフォーマンス

完全にダミーのデータを使用して、私は200万の列を1行に均等に配置しました。私が20列を得るためにスライス操作を行うと、さらにスライス操作を行えば大きな性能低下に気づくでしょう。

ほとんどのカラムでは、10-40msでスライス結果を表示することができますが、行の最後に行くとパフォーマンスは壁に当たって、応答時間は43msから徐々に増加します1,800,000点から214,000点に1,900,000点、435msから1,999,900点に! (すべてのスライスの幅は同じです)。

私は、行の最後に到達するとパフォーマンスが大幅に低下する理由を説明することができません。誰かが、カサンドラが内部でやっているような遅れを取るためのガイダンスを提供してもらえますか?行のキャッシングはオフになっています。ほとんどすべてがデフォルトのCassandra 1.0インストールです。

これは、1行につき最大20億の列をサポートできると思われますが、このパフォーマンスの向上率では、実際の状況では非常に長い行には使用できません。

多くのありがとうございます。

私はとにかく期待していたよりも少し遅い理由で、同時に10件のリクエストでこれを打っていますが、すべてのリクエストで公正なテストを行い、 1,800,000と1,900,000の間にこの奇妙な劣化があります。

また、1行につきわずか200,000の列を持つ場合、1つのアイテムに対して逆方向スライスを実行すると、パフォーマンスが非常に悪いことに気付きました。 query.setRange(end、start、false、1);

答えて

4

psanfordのコメントは私に答えにつながった。 Cassandra < 1.1.0(現在ベータ版)はMemtables(ディスクにフラッシュされていない)の長い行のスライスでパフォーマンスは低下しますが、同じデータでディスクにフラッシュされるSSTablesのパフォーマンスは向上しています。

http://mail-archives.apache.org/mod_mbox/cassandra-user/201201.mbox/%[email protected].com%3Eおよびhttps://issues.apache.org/jira/browse/CASSANDRA-3545を参照してください。

私の例では、最初の1。8000万行がディスクにフラッシュされていたため、その範囲のスライスは高速でしたが、最後の200,000行はディスクにフラッシュされず、memtablesに残っていました。 memtablesのスライシングが長い行では遅いので、これが行の最後でパフォーマンスが悪いことがわかりました(データが列順に挿入されています)。

これは、手動でcassandraノードでフラッシュを呼び出すことで修正できます。これを修正するために1.1.0にパッチが適用されています。これにより、この問題が解決されたことが確認できます。

私は、これが同じ問題を抱えている他の誰にも役立つことを願っています。

9

これに関する良い資料は、CassandraのReversed Comparatorsに関するAaron Mortonのブログ記事です。行が特定のサイズに得れば、彼らは列のインデックスが含まれていることをCassandra Query Plans上の私のポストから

がリコール:記事から。また、インデックスの一部を使用する必要がある場合は常に、インデックス全体を読み取る必要があります。これは、開始または終了を指定するスライス範囲を使用する場合です。したがって、行に対して実行する最速スライスクエリは、列カウントを指定するだけで行の最初のX列を取得したものでした。

(あなたはタイムスタンプで物事を格納していて、主に最新のデータを見たい場合など)を使用すると、ほとんどの行の末尾から読んでいる場合は、降順であなたの列を格納Reversed Comparatorを使用することができます。これにより、より良い(より一貫した)クエリのパフォーマンスが得られます。

読み取りパターンがランダムな場合は、複数の行にまたがってデータを分割する方がよい場合があります。

+0

回答ありがとうpsanford!それが正しい方向に私を導いて、私は今問題の内容を見つけました(下記参照) – agentgonzo

+0

これは現行リリース1.1.7でもまだ当てはまるのですか? – Sisso

関連する問題