Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/extjs/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Scala 数据帧写入速度比在spark中保存到cassandra的RDD慢10倍_Scala_Apache Spark_Spark Dataframe_Spark Cassandra Connector - Fatal编程技术网

Scala 数据帧写入速度比在spark中保存到cassandra的RDD慢10倍

Scala 数据帧写入速度比在spark中保存到cassandra的RDD慢10倍,scala,apache-spark,spark-dataframe,spark-cassandra-connector,Scala,Apache Spark,Spark Dataframe,Spark Cassandra Connector,我尝试将cassandra save表与RDD和DataSet的30000条记录进行比较。我发现数据集保存比RDD慢10倍。 该表有4个分区键 DSE Version :5.1.7 Spark version :2.0.1 Nodes:6( 20 cores each 6g) Using Spark Standalone 我们使用了以下spark配置: spark.scheduler.listenerbus.eventqueue.size=100000 spark.locality.w

我尝试将cassandra save表与RDD和DataSet的30000条记录进行比较。我发现数据集保存比RDD慢10倍。 该表有4个分区键

 DSE Version :5.1.7
 Spark version :2.0.1
 Nodes:6( 20 cores each 6g)
 Using Spark Standalone
我们使用了以下spark配置:

  • spark.scheduler.listenerbus.eventqueue.size=100000
  • spark.locality.wait=1
  • spark.dse.continuous\u paging\u enabled=false
  • spark.cassandra.input.fetch.size_在行=500
  • spark.cassandra.connection.keep_alive_ms=10000
  • spark.cassandra.output.concurrent.writes=2000
  • cpu核心数=48
  • 每个节点的内存=3g
  • spark.executor.cores=3
  • spark.cassandra.output.ignoreNulls=true
  • spark.cassandra.output.throughput\u mb\u per\u sec=10
  • spark.serializer=org.apache.spark.serializer.KryoSerializer
  • spark.cassandra.connection.local_dc=dc1
  • spark.cassandra.connection.compression=LZ4
  • spark.cassandra.connection.connections每个执行器的最大连接数=20
  • 以下是相同的示例代码:

    val sparkSession = SparkSession.builder().config(conf).getOrCreate()
    
    import sparkSession.implicits._
    
    val RDD1 = sc.cassandraTable[TableName]("keySpace1", "TableName")
               .where("id =?,id)
    
    RDD1.saveToCassandra("keySpace1", "TableName")
    
    var DS1 = sparkSession.read
               .format("org.apache.spark.sql.cassandra")
               .options(Map("table" -> "TableName", "keyspace" ->"keySpace1"))
               .load()
               .where("id ='"+ id +"'").as[CaseClassModel]
    
    DS1.write.format("org.apache.spark.sql.cassandra")          
      .mode(SaveMode.Append).option("table", "TableName1")                
      .option("keyspace", "KeySpace1")
      .save()
    

    由于Dataframe和RDD方法都使用相同的底层存储代码,因此不太可能看到如此巨大的差异,除非转换为DF类型的开销非常高。在我们自己对数十亿行的测试中,我们只看到速度上的几个百分点的差异


    虽然30k记录是一个非常小的数量,任何数量的开销都可能变得相关,但我认为最有可能的原因是where子句中的查找在RDD和DF代码中被不同的解释。我会检查以确保它被正确地推送到DF代码中(有关DF加载,请参见
    解释

    由于Dataframe和RDD方法都使用相同的底层保存代码,因此不太可能看到如此巨大的差异,除非转换为DF类型的开销非常高。在我们自己对数十亿行的测试中,我们只看到速度上的几个百分点的差异


    虽然30k记录是一个非常小的数量,任何数量的开销都可能变得相关,但我认为最有可能的原因是where子句中的查找在RDD和DF代码中被不同的解释。我会检查以确保它被正确地推送到DF代码中(有关DF加载,请参见
    解释

    我们实际上对Rdd和dataset使用了完全相同的where子句,即使这样,我们也会得到相同的差异。我试图让您知道,DF实现中的where子句实际上是不同的。即使它有字面上相同的文本。Dataframes将谓词转换为DF类,并检查类型是否正确匹配。如果他们不这样做,它可能会退回到执行完全扫描,而不是谓词下推。这就是为什么我说您应该运行explain命令来查看DF代码中到底发生了什么。实际上,我们对Rdd和dataset使用了完全相同的where子句,即使这样,我们也得到了相同的差异。我试图让您知道,DF实现中的where子句实际上是不同的。即使它有字面上相同的文本。Dataframes将谓词转换为DF类,并检查类型是否正确匹配。如果他们不这样做,它可能会退回到执行完全扫描,而不是谓词下推。这就是为什么我说您应该运行explain命令来查看DF代码中到底发生了什么。