您知道,对于Cassandra,当节点过载时,根据所需的一致性,它可能会严重损害您的生产,因为节点可能会变得无响应,整个守护进程也可能崩溃,提示可能会填满您的数据挂载点,等等。
这里的关键字是back-pressure
用Spark on Cassandra
做合适的back-pressure
,特别要有以下性质:
--conf "spark.cassandra.output.throughputMBPerSec=2"
--total-executor-cores 24
(Datastax driver
或cqlsh
也有类似的back-pressure
选项。您基本上限制了每个核心的吞吐量,以应用一些back-pressure
)
假设我在Cassandra集群上找到了全局写吞吐量,并且我为application1
设置了适当的设置,它工作得很好。
但是,挑战是,在Cassandra集群上有很多开发人员。因此,在给定的时间,我可能有Sparkapplication1
,application2
,application3
,…
问题:我有什么选择来确保在给定时间的写吞吐量(无论并发运行多少应用程序)不会对Cassandra造成太大的压力,从而损害我的生产工作负载?
谢谢
我建议人们分离分析工作负载的方法是启动另一个(逻辑)数据中心。当然,它可以在同一个物理数据中心中。但是你想要的是单独的计算和存储,以保持分析负载不干扰生产流量。
首先,确保您正在使用GossipingPropertyFileSnitch
(cassandra.yaml
)运行,并且您的键空间正在使用NetworkTopologyStrategy
。同样,您需要确保您的keyspace定义包含一个已命名的数据中心,并且您的生产应用程序/服务配置为使用该数据中心(例如:如下所示的dc1
)作为其默认DC:
ALTER KEYSPACE product_data WITH
REPLICATION={'class':'NetworkTopologyStrategy',
'dc1':'3'};
一旦新的基础设施启动,安装Cassandra并通过在cassandra-rackdc.properties
文件中指定新名称将节点作为新DC加入集群。比如:
dc=dc1_analytics
接下来调整键空间以将数据复制到新的DC。
ALTER KEYSPACE product_data WITH
REPLICATION={'class':'NetworkTopologyStrategy',
'dc1':'3','dc1_analyitcs':'3'};
在新的DC上运行修复/重建,然后配置Spark作业只使用dc1_analytics
。