在我的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分区。任何帮助将不胜感激。
答案 0 :(得分:1)
好的,你这里有数据模型问题。 action
=分区键,因此所有类似的操作都存储在单个分区中=(一个节点+副本)。
您总共有多少不同的操作?你对拥有热点的直觉是合理的。
您可能需要一个不同的分区键 OR 需要在分区键中添加一个额外的列,以便让Cassandra在群集上均匀分配数据。