火花池选项

时间:2018-07-26 03:25:17

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

我无法理解如何使用设置池选项,并且无法从以下来源得知它们是否有效:https://docs.datastax.com/en/developer/java-driver/3.4/manual/pooling/

SparkSession val是否考虑群集中的池选项?

我的Scala代码:

package com.zeropoints.processing

import org.apache.spark.SparkContext
import org.apache.spark.SparkConf
import org.apache.spark.sql.SparkSession
import com.datastax.spark.connector._
import com.datastax.driver.core.Cluster
import com.datastax.driver.core.PoolingOptions
import com.datastax.driver.core.HostDistance

//This object provides the main entry point into spark processing
object main {

  var appName = "Processing" 

  lazy val sparkconf:SparkConf = new SparkConf(true).setAppName(appName)

  lazy val poolingOptions:PoolingOptions = new PoolingOptions()

  lazy val cluster:Cluster = Cluster.builder().withPoolingOptions(poolingOptions).build()

  lazy val spark:SparkSession = SparkSession.builder().config(sparkconf).getOrCreate

  lazy val sc:SparkContext = spark.sparkContext

  def main(args: Array[String]) {
    //Set pooling stuff
    poolingOptions.setConnectionsPerHost(HostDistance.LOCAL, 6, 60)

    //DF and RDDs tasks...
    spark.sql("select * from data.raw").groupBy("key1,key2").agg(sum("views")).
        write.format("org.apache.spark.sql.cassandra").options(Map( "table" -> "summary", "keyspace" -> "data")).
        mode(org.apache.spark.sql.SaveMode.Append).save()

    //..more stuff
  }

}

1 个答案:

答案 0 :(得分:4)

否,Spark Connector不会考虑您的池配置-它的工作方式不同,尤其是当您考虑在分布式环境中执行代码时-setConnectionsPerHost仅在驱动程序中执行,并且不会影响执行者。

正确的方法是通过Spark配置参数指定必要的设置。文档中有separate section on connection parameters,而您可能需要connection.connections_per_executor_max。您也可以编写自己的类来实现特征CassandraConnectionFactory并提供createCluster函数的实现。然后,您可以将该类名称指定为connection.factory配置参数。

但是主要问题是-您是否真的需要调整这些选项?您认为处理速度很慢吗? Java驱动程序文档建议每个主机具有1个连接,以避免给Cassandra带来额外的负担。