在Cassandra中从具有大量数据的表创建物化视图

7
我们在Google Cloud Kubernetes上有一个由3个pod组成的Cassandra集群。 我们使用的是Cassandra版本3.9和Google镜像。
当我尝试从表中创建Materialized View时,遇到了问题。
表的模式如下:
CREATE TABLE environmental_data (
    block_id int,
    timestamp timestamp,
    device_id int,
    sensor_id int,
    .
    .
    .
    PRIMARY KEY (block_id, timestamp, device_id, sensor_id)

我想创建一个以设备 ID 作为群集键的视图,我尝试这样做:

CREATE MATERIALIZED VIEW environmental_data_by_device AS
       SELECT block_id, timestamp, device_id, sensor_id,... FROM environmental_data
       WHERE block_id is not null
       and timestamp is not null
       and device_id is not null
       and sensor_id is not null
       PRIMARY KEY ((device_id), timestamp, sensor_id, block_id)
       WITH CLUSTERING ORDER BY (timestamp DESC);

在本地环境下,数据量很小,一切都很顺利。但是在生产环境中,有 8000 万行数据,2 个 pod 崩溃了,并且 Cassandra 出现了以下错误:

Unknown exception caught while attempting to update MaterializedView! environmental_data

java.lang.IllegalArgumentException: Mutation of XXXX bytes is too large for the maximum size of XXXX

还出现了许多 java.lang.OutOfMemoryError: Java heap space

我该怎么做才能确保下一次尝试成功呢?不太可能再次关闭生产 Cassandra。

我已经成功创建了一个基于表的视图,但它并不是很大。


2
看起来你遇到了一个在3.10/3.0.10中已经解决的bug:https://issues.apache.org/jira/browse/CASSANDRA-11670 - Alex Ott
3
简而言之,不要相信或使用物化视图,它们是实验性的。https://mail-archives.apache.org/mod_mbox/cassandra-user/201710.mbox/%3CetPan.59f24f38.438f4e99.74dc%40apple.com%3E - dilsingi
2个回答

1
根据文档,Cassandra将同一分区内的更新视为单个变异。在您的情况下,我想这意味着每次使用相同设备ID进行新插入可能会导致传输先前写入该分区的所有数据。 为了避免这种情况,您应该考虑使用分区键将mat.视图中的数据拆分成较小的部分。例如,您可以根据测量频率引入以分钟或小时为单位的时间桶。

-1

从基础设施的角度来看,我可以给你一些提示,因为我不太了解Cassandra。如果我负责基础设施,我会检查您是否已经正确设置了部署,以确保您有很多java.lang.OutOfMemoryError

  1. Pods被安排在能够承受其工作负载的节点上,并且调度程序已经知道Pods所需的内存。在这种情况下,您必须设置内存请求

这通常没有得到突出显示,但可能是一个问题:如果您有3个拥有3GB RAM的节点2个消耗2GB的Pods而没有内存请求,它们可能会被安排在同一个节点上,在一段时间后被杀死。设置内存请求一切都会很好。

  1. Pods不会消耗比预期更多的内存,在内存泄漏的情况下,健康的Pods将被消耗过多内存的Pods杀死。在这种情况下,您应该设置内存限制
此外,您可以在这里找到一篇有趣的文章,也涉及Kubernetes中基于Java堆内存的自动缩放。 您可以通过以下命令检查Pod使用了多少内存和CPU:
$ kubectl top pods --namespace=xxxx

如果节点出现问题

$ kubectl top nodes 

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接