Apache spark 每个JVM中的Spark流连接池

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

在我的spark streaming应用程序中,我有许多I/O操作,如CODI、hbase等。我想确保每个executor中只有一个连接池,如何才能优雅地完成这项操作? 现在,我分散地实现了一些静态类,这不利于管理。把它们集中到一个类中,比如xxContext,或者SparkContext,我需要广播吗?我知道广播大型只读数据集很好,但是这些连接池怎么样? Java或scala都可以接受。

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都将具有在工作机上存在的分区。检查这个:我认为这个问题可以解决你的问题。[