繁体   English   中英

Cassandra使用spark-cassandra连接器插入性能

[英]Cassandra insert performance using spark-cassandra connector

我是火花和卡桑德拉的新手。 我正在尝试使用spark-cassandra连接器插入到cassandra表中,如下所示:

import java.util.UUID

import org.apache.spark.{SparkContext, SparkConf}
import org.joda.time.DateTime
import com.datastax.spark.connector._

case class TestEntity(id:UUID, category:String, name:String,value:Double, createDate:DateTime, tag:Long)

object SparkConnectorContext {
  val conf = new SparkConf(true).setMaster("local")
    .set("spark.cassandra.connection.host", "192.168.xxx.xxx")
  val sc = new SparkContext(conf)
}
object TestRepo {
  def insertList(list: List[TestEntity]) = {
    SparkConnectorContext.sc.parallelize(list).saveToCassandra("testKeySpace", "testColumnFamily")
  }
}
object TestApp extends App {
  val start = System.currentTimeMillis()
  TestRepo.insertList(Utility.generateRandomData())
  val end = System.currentTimeMillis()
  val timeDiff = end-start
  println("Difference (in millis)= "+timeDiff)
}

当我使用上述方法(具有100个实体的列表)插入时,需要300-1100 milliseconds 我尝试使用幻像库插入相同的数据。 它只需要不到20-40 milliseconds

任何人都可以告诉我为什么火花连接器花费这么多时间插入? 我在代码中做错了什么或者不建议使用spark-cassandra连接器进行插入操作?

看起来你在你的计时中包含并行化操作。 此外,由于您的spark工作程序在与Cassandra不同的计算机上运行,​​因此saveToCassandra操作将通过网络进行写入。

尝试配置系统以在Cassandra节点上运行spark worker。 然后在单独的步骤中创建RDD并在其上调用count()之类的操作以将数据加载到内存中。 此外,您可能希望持久化()或缓存()RDD以确保它保留在内存中以进行测试。

然后只计算缓存的RDD的saveToCassandra。

您可能还想查看Cassandra连接器提供的repartitionByCassandraReplica方法。 这将根据写入需要去的Cassandra节点对RDD中的数据进行分区。 通过这种方式,您可以利用数据局部性,并且通常避免在网络上进行写入和随机播放。

您的“基准”存在一些严重问题:

  1. 您的数据集非常小,以至于您只测量作业设置时间。 在单个节点上保存100个实体应该是单毫秒的顺序,而不是秒。 另外,保存100个实体使JVM无法编译您运行的代码以优化机器代码。
  2. 您在测量中包含了火花上下文初始化。 JVM懒惰地加载类,因此在测量开始后真正调用了spark初始化的代码。 这是一个非常昂贵的元素,通常每个整个火花应用只执行一次,甚至不是每个工作。
  3. 您每次启动时只执行一次测量。 这意味着您甚至会错误地测量spark ctx设置和作业设置时间,因为JVM必须首次加载所有类,而Hotspot可能没有机会启动。

总而言之,您很可能主要测量类加载时间,这取决于加载的类的大小和数量。 Spark是一个非常大的东西,加载几百毫秒并不奇怪。

要正确测量插入性能:

  • 使用更大的数据集
  • 从测量中排除一次性设置
  • 多次运行共享相同的火花上下文并丢弃一些初始上下文,直到达到稳态性能。

BTW如果启用调试日志记录级别,连接器将记录执行程序日志中每个分区的插入时间。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM