我无法理解如何使用设置池选项,并且无法从以下来源得知它们是否有效: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
}
}
答案 0 :(得分:4)
否,Spark Connector不会考虑您的池配置-它的工作方式不同,尤其是当您考虑在分布式环境中执行代码时-setConnectionsPerHost
仅在驱动程序中执行,并且不会影响执行者。
正确的方法是通过Spark配置参数指定必要的设置。文档中有separate section on connection parameters,而您可能需要connection.connections_per_executor_max
。您也可以编写自己的类来实现特征CassandraConnectionFactory
并提供createCluster
函数的实现。然后,您可以将该类名称指定为connection.factory
配置参数。
但是主要问题是-您是否真的需要调整这些选项?您认为处理速度很慢吗? Java驱动程序文档建议每个主机具有1个连接,以避免给Cassandra带来额外的负担。