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 两个数据中心:datacenter1
和 datacenter2
每个数据中心有 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 摄取的主要内容,如果未能解决你的问题,请参考以下文章