如何减少或是否有必要减少 Cassandra 中大量数据的分区数?
How can I reduce or is it necessary to reducing partition count for large amount of data in Cassandra?
我估计有大约 5 亿行数据和 500 万个唯一编号。我的查询必须通过 number
和 event_date
获取数据。 number
作为partition key,会有500万个分区。我认为存在很多小分区并且在查询期间发生超时是不好的。我在定义分区键时遇到了麻烦。我找到了一些 synthetic sharding strategies,但无法申请我的 model。我可以通过 mod 数字定义分区键,但是行在分区之间分布不均衡。
我如何 model 此以减少或是否有必要减少分区数?分区数有限制吗?
CREATE TABLE events_by_number_and_date (
number bigint,
event_date int, /*eg. 20200520*/
event text,
col1 int,
col2 decimal
PRIMARY KEY (number, event_date)
);
对于您的查询,更改数据模型无济于事,因为您使用的查询不适合 Cassandra。尽管 Cassandra 支持聚合,例如 max、count、avg、sum 等,但它们是为在单个分区内工作而设计的,而不是为在整个集群中工作而设计的。如果不限制partition key,协调节点发布,需要到达集群中的每一个节点,需要遍历集群中的所有数据。
您仍然可以执行此类查询,但最好使用 Spark 之类的工具来执行此操作,因为它针对并行数据处理进行了大量优化,并且 Spark Cassandra Connector is able to correctly perform querying of the data. If you can't use Spark, you can implement your own full token range scan, using code similar to this。但无论如何,不要指望会有 "real-time" 答案(< 1 秒)。
我估计有大约 5 亿行数据和 500 万个唯一编号。我的查询必须通过 number
和 event_date
获取数据。 number
作为partition key,会有500万个分区。我认为存在很多小分区并且在查询期间发生超时是不好的。我在定义分区键时遇到了麻烦。我找到了一些 synthetic sharding strategies,但无法申请我的 model。我可以通过 mod 数字定义分区键,但是行在分区之间分布不均衡。
我如何 model 此以减少或是否有必要减少分区数?分区数有限制吗?
CREATE TABLE events_by_number_and_date (
number bigint,
event_date int, /*eg. 20200520*/
event text,
col1 int,
col2 decimal
PRIMARY KEY (number, event_date)
);
对于您的查询,更改数据模型无济于事,因为您使用的查询不适合 Cassandra。尽管 Cassandra 支持聚合,例如 max、count、avg、sum 等,但它们是为在单个分区内工作而设计的,而不是为在整个集群中工作而设计的。如果不限制partition key,协调节点发布,需要到达集群中的每一个节点,需要遍历集群中的所有数据。
您仍然可以执行此类查询,但最好使用 Spark 之类的工具来执行此操作,因为它针对并行数据处理进行了大量优化,并且 Spark Cassandra Connector is able to correctly perform querying of the data. If you can't use Spark, you can implement your own full token range scan, using code similar to this。但无论如何,不要指望会有 "real-time" 答案(< 1 秒)。