【问题标题】:Spark Streaming connection pool in each JVM每个 JVM 中的 Spark Streaming 连接池
【发布时间】:2018-02-11 01:56:39
【问题描述】:

在我的 Spark Streaming 应用中,我有很多 I/O 操作,例如 codis、hbase 等。我想确保每个 executor 中恰好有一个连接池,我该如何优雅地做到这一点? 现在,我分散实现了一些静态类,这不利于管理。如何将它们集中到一个类中,比如 xxContext,一些类似于 SparkContext,需要我广播吗?我知道广播大型只读数据集很好,但是这些连接池呢? Java 或 Scala 都可以接受。

【问题讨论】:

标签: apache-spark spark-streaming connection-pool


【解决方案1】:

foreachPartition 最合适

示例代码 sn-p 到它

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 
}

Another SO Answer for similar use case

检查这个:Design Patterns for using foreachRDD

【讨论】:

  • 数据库连接不能用状态(瞬态)序列化。因此,建议在执行程序级别创建/维护连接(或池)。通常每个执行器一个连接做得很好,另一端数据库需要并行服务执行器连接数。所有的连接都是独立的,因为执行者是独立的。所以,我不确定集中化的想法是否很棒。
  • 但是我想为每个JVM维护一个连接池以降低成本。我的困惑是如何集中它们。
  • 每个executor都是JVM进程。如代码中所述,您可以在每个 JVM 的示例代码中的 point 1 处创建 db 连接池。
  • 但是在spark streaming中,this(foreachRDD)会被多次调用吗?
  • 是的,foreachRDD 调用多次(如果 DStream 有多个 rdds)。每个 rdd 都会有那些存在于工作机器上的分区。检查这个:Design Patterns for using foreachRDD
猜你喜欢
  • 1970-01-01
  • 2023-02-01
  • 1970-01-01
  • 1970-01-01
  • 2015-11-18
  • 2017-08-15
  • 2020-12-07
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多