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

Mat*_*ieu 7 cassandra google-cloud-platform kubernetes google-kubernetes-engine cassandra-3.0

我们在Google Cloud Kubernetes中有一个带有3个pod的Cassandra集群.我们的Cassandra版本是3.9,我们正在使用Google图像.

当我尝试从表格创建物化视图时出现问题.

表的架构如下:

CREATE TABLE environmental_data (
    block_id int,
    timestamp timestamp,
    device_id int,
    sensor_id int,
    .
    .
    .
    PRIMARY KEY (block_id, timestamp, device_id, sensor_id)
Run Code Online (Sandbox Code Playgroud)

我想用device_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);
Run Code Online (Sandbox Code Playgroud)

在本地只有非常少量的数据,一切都很顺利.但是在拥有8000万行的生产中,有2个播放器崩溃,而Cassandra则在这个错误上出现了问题:

尝试更新MaterializedView时捕获到未知异常!environmental_data

java.lang.IllegalArgumentException:对于XXXX的最大大小,XXXX字节的突变太大

还有很多 java.lang.OutOfMemoryError: Java heap space

我该怎么做才能确保下一次尝试成功?决定放弃生产Cassandra第二次是不可想象的.

我已经成功创建了一个基于表的视图库,但它并没有那么大.

Gal*_*one -1

由于我对 Cassandra 的了解并不深入,因此我可以从基础设施的角度给您一些提示。如果我负责基础设施,我会检查您是否以正确的方式设置了部署,以确保您有很多java.lang.OutOfMemoryError部署:

  1. Pod 被调度在能够或维持其工作负载的节点上,并且调度程序会获知 Pod 所需的内存。在这种情况下,您必须设置内存请求

这通常不会突出显示,但可能是一个问题:如果您有内存请求3 nodes having 3 GB of RAM并且2 pods consuming 2 GB没有内存请求,则可能会发生它们被安排在同一节点上,在一段时间后被杀死。设置内存请求一切顺利。

  1. Pod 不会消耗比预期更多的内存,如果出现内存泄漏,健康的 Pod 会被消耗过多内存的 Pod 杀死。在这种情况下,您应该设置内存限制

此外,您可以在这里找到一篇有趣的文章,其中还涉及Kubernetes 中基于 Java 堆内存的自动缩放

您可以通过以下命令检查 pod 消耗了多少内存和 CPU:

$ kubectl top pods --namespace=xxxx
Run Code Online (Sandbox Code Playgroud)

如果节点受到影响

$ kubectl top nodes 
Run Code Online (Sandbox Code Playgroud)