【问题标题】:Cassandra Cluster can not see nodes through SparkCassandra Cluster 无法通过 Spark 看到节点
【发布时间】:2016-12-24 06:30:27
【问题描述】:

我正在尝试通过 Spark 进行写入。 我的集群中有 6 个节点,我在其中创建了要写入数据的密钥空间:

CREATE KEYSPACE traffic WITH replication = {'class': 'SimpleStrategy',    'replication_factor': '2'}  AND durable_writes = true;

当我尝试从 Spark 写入时,我遇到了这种错误:

16/08/17 16:14:57 ERROR QueryExecutor: Failed to execute:  com.datastax.spark.connector.writer.RichBatchStatement@7409fd2d
com.datastax.driver.core.exceptions.UnavailableException: Not enough replicas available for query at consistency ONE (1 required but only 0 alive)

这是代码的 sn-p 我到底在做什么:

import org.apache.spark.sql.SQLContext
import org.apache.spark.{SparkConf, SparkContext}
import org.apache.spark
import org.apache.spark.storage.StorageLevel
import org.apache.spark.sql.types.{StructType, StructField, DateType,  IntegerType};




object ff {
def main(string: Array[String]) {

val conf = new SparkConf()
  .set("spark.cassandra.connection.host", "127.0.0.1")
  .set("spark.cassandra.connection.host","ONE")
  .setMaster("local[4]")
  .setAppName("ff")

val sc = new SparkContext(conf)
val sqlContext = new SQLContext(sc)

val df = sqlContext.read
  .format("com.databricks.spark.csv")
  .option("header", "true") // Use first line of all files as header
  .option("inferSchema", "true")
  .load("test.csv")

df.registerTempTable("ff_table")
//df.printSchema()

df.count
time {
  df.write
    .format("org.apache.spark.sql.cassandra")
    .options(Map("table" -> "ff_table", "keyspace" -> "traffic"))
    .save()
}
def time[A](f: => A) = {
  val s = System.nanoTime
  val ret = f
  println("time: " + (System.nanoTime - s) / 1e6 + "ms")
  ret
}



 }
}

另外,如果我运行nodetool describecluster,我会得到以下结果:

Cluster Information:
Name: Test Cluster
Snitch: org.apache.cassandra.locator.DynamicEndpointSnitch
Partitioner: org.apache.cassandra.dht.Murmur3Partitioner
Schema versions:
    bf6c3ae7-5c8b-3e5d-9794-8e34bee9278f: [127.0.0.1, 127.0.0.2, 127.0.0.3, 127.0.0.4, 127.0.0.5, 127.0.0.6]

我尝试在 CLI 的行中插入 replication_factor:2 并且它正在工作,因此每个节点都可以看到彼此。 为什么 Spark 不能插入任何东西,为什么节点在尝试从 Spark 插入数据时看不到彼此,有人知道吗?

【问题讨论】:

    标签: scala apache-spark cassandra apache-spark-sql spark-cassandra-connector


    【解决方案1】:

    看起来您正在一台机器上通过环回运行 6 个节点。这意味着这台机器的资源很可能被超额订阅。各种 Cassandra 实例很可能轮流或交换,这导致它们在负载过重时丢失。增加复制因子会增加有效目标启动的机会,但会进一步增加负载。

    C* 的核心需要您系统中的几种不同资源,如果其中任何一种成为瓶颈,任何一种都可能导致节点无法在足够的时间内响应八卦。

    这些资源是 RAM - JVM 能够获取多少内存,这也受操作系统交换的影响。这意味着如果您分配一个大型 JVM 但操作系统将其交换到磁盘,您可能会看到大量的性能问题。对于同一台机器上的多个节点,您需要确保您正在启动的每个节点的 JVM 都有足够的内存。此外,如果任何一个实例的 JVM 接近满载,您将进入 GC 并且可能会进入 GC Storm,它基本上会锁定该实例。其中许多细节将在 system.log 中一目了然。

    CPU - 如果没有对至少一个 cpu 的独占访问,您几乎可以保证在 C* 中安排一些重要的线程,它们之间有很长的延迟。这可能会导致八卦线程被忽略并且八卦失败。这将为某些节点提供包含故障机器的集群的视图,并导致不可用错误。

    磁盘 - 每个 Cassandra 实例都将维护它自己的 CommitLog 和 HD 文件。提交日志每 10 秒刷新一次,如果您有多个实例且只有 1 个硬盘驱动器,则提交日志和普通内存表之间的刷新很容易相互阻塞。压缩进一步加剧了这种情况,需要另外大量的 IO。

    网络 - 虽然这不是同一台机器上的多个节点的问题。

    总之, 确保分配给 C* 实例的资源足够小以使任何实例不会超出另一个实例的空间/ram/cpu 是很重要的。如果这样做,您最终会得到一个集群,该集群在负载下通信失败,因为上述资源之一出现瓶颈。这并不意味着不可能在同一台机器上运行多个节点,而是意味着您必须小心配置。您还可以尝试通过限制写入速度来减少负载,这将减少节点相互破坏的机会。

    【讨论】:

    • 嗯,所以你告诉我不可能在本地测试这么多节点?我试图保存到 Cassandra 中的 csv 大约有 3.2GB,在我的 SSD 上我有大约 30GB 的可用空间。如果您尝试数数,它不应该超过该数字,或者它甚至应该开始复制,然后出现错误run out of memory或类似的东西。我对吗?我也尝试了 4 个节点和replication_factor:2,但他正在断开连接:stackoverflow.com/questions/38978886/…
    • 后来我能够使用replication_factor:1 在 6 个节点中写入。然后我开始尝试写入的一致性级别,一切都崩溃了。由于这个错误,现在我根本无法写作。此外,每个节点都在 SSD 的一个分区上,但是如果我创建 HDD 的另一个分区并设置 6 个节点中的 3 个(SSD 上 3 个,HDD 上 3 个),你认为我能做些什么吗?我只是不明白为什么这会起作用,而当我回滚到默认值时突然不起作用。另外,你有没有看到我在上面的评论中给你的第二个线程?
    • 所有这些都是有道理的。复制因子 2 使每次写入的吞吐量翻倍。由于数据库是一个有状态的系统,以前的操作会影响当前的性能。我会首先尝试确定您是否遇到瓶颈,检查 dstat,检查 cassandra 日志,看看在崩溃之前允许发生多少写入。我的意思是,除非你有一个杀手级的 ssd 和 128 GB 的 RAM,否则你不能指望一个稳定的 6 个实例在一个处理重负载的机器集群上。除非您专门调整每个 JVM 的大小并确保您没有交换。
    • 经过一番研究,我终于明白你在说什么了。这就是为什么 Cassandra 被称为分布式数据库系统的原因。如果我想看到她最好的表现,同一台机器上的一个集群中的 3 个节点绝对不会显示任何东西。分布式系统的定义是节点在物理上是分开的,因此它们可以使用自己的 RAM、磁盘内存和 CPU。非常感谢您。你现在清除了我脑海中的很多东西。
    猜你喜欢
    • 2015-04-19
    • 2018-06-06
    • 2016-03-06
    • 2017-12-23
    • 1970-01-01
    • 2016-03-20
    • 1970-01-01
    • 2016-07-01
    • 1970-01-01
    相关资源
    最近更新 更多