LoginSignup
4
0

More than 3 years have passed since last update.

Prestoにとって最適なCassandraテーブル設計

Posted at

必要な前提知識

  • Cassandra のアーキテクチャ
  • Prestoの簡単な動作の流れ

目的

  • Cassandraの新テーブルを作成するにあたって、PrestoのSQL的に効率良いテーブルとは何か? を探る。

以下に今回作成したテーブル毎のprestoの挙動をまとめる。

test.test (keyspace.table)

※(p= Partition Key, c=Clustering Key)

p=0,1 に10万件ずつデータを書き込み, c=0~10万
p=2~10万 に1件ずつデータを書き込み, c=0

テーブル全体にSQL

SELECT * FROM cassandra.test."test"

スクリーンショット 2020-04-20 13.25.10.png

  • taskが綺麗に分解され(✔️マークがその数)処理が走っている。

特定の1つのPartitionにSQL

SELECT * FROM cassandra.test."test" WHERE p=0

スクリーンショット 2020-04-20 13.19.37.png

  • Partitionを1つに特定すると、Prestoのtaskは分解されない。 -> 一つのサーバー(worker)のみが動く。

特定の1つのPartitionで、ClusteringKey を選択。

SELECT * FROM cassandra.test.test WHERE p=0 AND t=120

スクリーンショット 2020-04-20 13.29.19.png

  • このPartition には10万件あるが、1行しか読まれていない。(効率良い。)

特定の1つのPartitionで、ClusteringKey を選択。(ver2)

SELECT * FROM cassandra.test."test" WHERE p=0 AND t>0 AND t<100

スクリーンショット 2020-04-20 13.32.39.png

  • このPartition には10万件あるが、(><)でClusteringKey を選択してもそれしか読まない(効率良い!)

Partitionを範囲選択してSQL


SELECT * FROM cassandra.test."test" WHERE p>10 AND p<100

スクリーンショット 2020-04-20 13.35.02.png

  • P=10~100 はデータが一件しかないPartition
  • 一つ上のSQL と比べると、ある程度は1つのPartitionにデータをまとめるとSQL効率が良い。 →公式では1Partitionに10万件程度のitemを推奨。(itemとはrowではなく各値。)

結論

  • Cassnadra のテーブル設計のトレードオフ。
    Partition にデータをある程度溜める <---> 適度に分散させる。
    →1Partitionに10万件のitemを溜める程度、それ以上は分散した方が良い。

  • ClusteringKey にはSQLでよく範囲選択に使う値を設定するのが良い。
    (例:timestamp)

所感

  • やっぱり早い。
  • Cassandra & Prestoでなんでもできる気がしてきた...
  • Cassandra は超柔軟で、カラム追加等も簡単にできるが、最初のテーブル設計は肝 (PrimaryKey の変更はできないので。)
4
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
0