[Cassandra]在spark job中cassandra sql中的行键级别过滤导致cpu利用率过高

时间:2016-04-08 11:08:13

标签: apache-spark cassandra spark-cassandra-connector

在我的spark工作中,我正在使用java cassandra util从cassandra读取数据。我的查询类似于 -

JavaRDD<CassandraRow> cassandraRDD = functions.cassandraTable("keyspace","column_family").
select("timeline_id","shopper_id","product_id").where("action=?", "Viewed")

我的行键级别设置在操作列上。当我运行我的火花作业时,它会导致cpu的过度使用,但是当我删除动作列上的过滤器时它工作正常。

请在下面找到列系列的创建表脚本 -

CREATE TABLE keyspace.column_family (
    action text,
    timeline_id timeuuid,
    shopper_id text,
    product_id text,
    publisher_id text,
    referer text,
    remote_ip text,
    seed_product text,
    strategy text,
    user_agent text,
    PRIMARY KEY (action, timeline_id, shopper_id)
) WITH CLUSTERING ORDER BY (timeline_id DESC, shopper_id ASC)
    AND bloom_filter_fp_chance = 0.01
    AND caching = '{"keys":"ALL", "rows_per_partition":"NONE"}'
    AND comment = ''
    AND compaction = {'class': 'org.apache.cassandra.db.compaction.SizeTieredCompactionStrategy'}
    AND compression = {'sstable_compression': 'org.apache.cassandra.io.compress.LZ4Compressor'}
    AND dclocal_read_repair_chance = 0.1
    AND default_time_to_live = 0
    AND gc_grace_seconds = 864000
    AND max_index_interval = 2048
    AND memtable_flush_period_in_ms = 0
    AND min_index_interval = 128
    AND read_repair_chance = 0.0
    AND speculative_retry = '99.0PERCENTILE';

我怀疑的是,action_item是行键,所有数据都是从单个节点(热点)获取服务,这就是为什么节点CPU可能正在拍摄。此外,在阅读时,在Spark作业中只创建了一个RDD分区。任何帮助将不胜感激。

1 个答案:

答案 0 :(得分:1)

好的,你这里有数据模型问题。 action =分区键,因此所有类似的操作都存储在单个分区中=(一个节点+副本)。

您总共有多少不同的操作?你对拥有热点的直觉是合理的。

您可能需要一个不同的分区键 OR 需要在分区键中添加一个额外的列,以便让Cassandra在群集上均匀分配数据。

阅读此博文:http://www.planetcassandra.org/blog/the-most-important-thing-to-know-in-cassandra-data-modeling-the-primary-key/