Cassandra:节点变得不可用,同时使用 Spark 摄取

Posted

技术标签:

【中文标题】Cassandra:节点变得不可用,同时使用 Spark 摄取【英文标题】:Cassandra : node become unavailable, while ingesting with Spark 【发布时间】:2021-11-15 05:20:17 【问题描述】:

在使用 Spark 成功地将数据摄取到 Cassandra 之后,

现在每次我尝试使用 Spark 提取数据时都会返回一个错误(几分钟后或立即):

Caused by: com.datastax.oss.driver.api.core.AllNodesFailedException: Could not reach any contact point, make sure you've provided valid addresses

我用简单的 CQLSH(不是 Spark)检查过,确实也返回了类似的错误(2 个节点,共 4 个):

Connection error: ('Unable to connect to any servers', '1.2.3.4': error(111, "Tried connecting to [('1.2.3.4', 9042)]. Last error: Connection refused"))

所以基本上,当我使用 Spark 摄取 Cassandra 时,某些节点会在某个时候出现故障。而且我必须重新启动节点,才能通过 cqlsh(和 spark)再次访问它。

奇怪的是,当我运行nodetool status 时,给定节点仍然写为“UP”,而cqlsh 告诉该节点的connection refused

我尝试调查日志,但我遇到了一个大问题:日志中没有任何内容,服务器端没有触发单个异常

在我的情况下该怎么办?在这种情况下,为什么节点会关闭或变得无响应?如何预防?

谢谢


!!!编辑!!!


要求的一些细节,如下:

Cassandra 基础架构:

网络:10 gbps 两个数据中心:datacenter1datacenter2 每个数据中心有 4 个节点 每个数据中心 2 个副本:CREATE KEYSPACE my_keyspace WITH replication = 'class': 'NetworkTopologyStrategy', 'datacenter1': '2', 'datacenter2': '2' AND durable_writes = true; 用于输入和输出的一致性:LOCAL_QUORUM 每个节点的总物理内存:128GB。 每个节点的内存重新分区:每个 Cassandra 实例专用 64GB,每个 Spark 工作器专用 64GB(位于每个 Cassandra 节点上) 存储:每个节点 4 TB NVME

Spark 应用配置:

执行器核心总数:24 个核心(4 个实例 * 每个实例 6 个核心) 执行程序内存总数:48 GB(4 个实例 * 每个 8 GB) spark 上的 cassandra 配置:
spark.sql.catalog.cassandra.spark.cassandra.output.batch.size.rows 1
spark.sql.catalog.cassandra.spark.cassandra.output.concurrent.writes 100
spark.sql.catalog.cassandra.spark.cassandra.output.batch.grouping.key none
spark.sql.catalog.cassandra.spark.cassandra.output.throughputMBPerSec 80
spark.sql.catalog.cassandra.spark.cassandra.output.consistency.level LOCAL_QUORUM
spark.sql.catalog.cassandra.spark.cassandra.output.metrics false
spark.sql.catalog.cassandra.spark.cassandra.connection.timeoutMS 90000
spark.sql.catalog.cassandra.spark.cassandra.query.retry.count 10
spark.sql.catalog.cassandra com.datastax.spark.connector.datasource.CassandraCatalog
spark.sql.extensions com.datastax.spark.connector.CassandraSparkExtensions

【问题讨论】:

为 Cassandra 分配了多少资源。 Spark 试图写入多少行? Spark 基本上是重载了 Cassandra 嗨,亚历克斯。感谢你的回复。我已经编辑了我的帖子,询问了全部细节。任何额外的指针?如何确定我的 Cassandra 集群的最大吞吐量(以便正确配置 spark)?我需要关心哪些 JMX 指标才能知道集群是否过载? (例如,因为 CPU 在摄取时仅停留在 5% ..) 【参考方案1】:

(2 个节点,共 4 个)

只是好奇,但是密钥空间的复制因子 (RF) 是什么,写入操作使用什么一致性级别?

我会附和 Alex,并说这通常是因为 Spark 的写入速度超过了 Cassandra 的处理速度。这让您有两个选择:

增加集群的大小以处理写入负载。 限制 Spark 作业的写入吞吐量。

值得一提的事情:

每个数据中心 2 个副本

用于输入和输出的一致性:LOCAL_QUORUM

因此,通过将写入一致性降低到 LOCAL_ONE,您可能会获得更多吞吐量。

记住,quorum == RF / 2 + 1,这意味着LOCAL_QUORUM of 2 2。

所以我建议放弃LOCAL_ONE,因为现在 Spark 正在有效地运行@ALL 一致性。

我需要关注哪些 JMX 指标?

不记得它的确切名称,但如果您能找到磁盘 IOP 或吞吐量的指标,我想知道它是否达到了阈值并趋于稳定。

【讨论】:

谢谢亚伦。我在原始帖子中添加了您要求的所有详细信息。任何额外的指针?如何确定我的 Cassandra 集群的最大吞吐量以限制我的 spark 作业?我需要关注哪些 JMX 指标?正如 Alex 所说,例如,我的 CPU 处于空闲状态,即使在摄取时也是如此。因此,仅凭此指标很难说集群过载 @Klun 编辑完成!

以上是关于Cassandra:节点变得不可用,同时使用 Spark 摄取的主要内容,如果未能解决你的问题,请参考以下文章

向cassandra添加节点时,请等待压缩?

为啥 Spark Standalone 集群不使用所有可用的内核?

在进行节点工具修复时向 cassandra 发送数据

cassandra 集群名称不匹配的异常

CMS 后的 Cassandra OOM 使新世代为空

使用哪个 Cassandra 节点?