Apache spark 每个JVM中的Spark流连接池
在我的spark streaming应用程序中,我有许多I/O操作,如CODI、hbase等。我想确保每个executor中只有一个连接池,如何才能优雅地完成这项操作? 现在,我分散地实现了一些静态类,这不利于管理。把它们集中到一个类中,比如xxContext,或者SparkContext,我需要广播吗?我知道广播大型只读数据集很好,但是这些连接池怎么样? Java或scala都可以接受。Apache spark 每个JVM中的Spark流连接池,apache-spark,spark-streaming,connection-pool,Apache Spark,Spark Streaming,Connection Pool,在我的spark streaming应用程序中,我有许多I/O操作,如CODI、hbase等。我想确保每个executor中只有一个连接池,如何才能优雅地完成这项操作? 现在,我分散地实现了一些静态类,这不利于管理。把它们集中到一个类中,比如xxContext,或者SparkContext,我需要广播吗?我知道广播大型只读数据集很好,但是这些连接池怎么样? Java或scala都可以接受。foreachPartition最适合 它的示例代码段 val dstream = ... dstream
foreachPartition
最适合
它的示例代码段
val dstream = ...
dstream.foreachRDD { rdd =>
//loop through each parttion in rdd
rdd.foreachPartition { partitionOfRecords =>
//1. Create Connection object/pool for Codis, HBase
// Use it if you want record level control in rdd or partion
partitionOfRecords.foreach { record =>
// 2. Write each record to external client
}
// 3. Batch insert if connector supports from an RDD to external source
}
//Use 2 or 3 to write data as per your requirement
}
检查此项:DB连接无法使用状态(瞬态)序列化。因此,建议在执行器级别创建/维护连接(或池)。通常每个执行者一个连接都很好,另一方数据库需要并行地为执行者提供多个连接。所有连接都是独立的,因为执行者是独立的。因此,我不确定集中化的想法是否好,但我想为每个JVM维护一个连接池以降低成本。我的困惑是如何集中它们。每个执行者都是JVM进程。正如代码中提到的,您可以在每个JVM的示例代码中的点1处创建db连接池。但是在spark streaming中,会多次调用此(foreachRDD)吗?是的,foreachRDD会多次调用(如果DStream有多个RDD)。每个rdd都将具有在工作机上存在的分区。检查这个:我认为这个问题可以解决你的问题。[