1

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

4

1 回答 1

1

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 
}

类似用例的另一个 SO 答案

检查这个:使用foreachRDD的设计模式

于 2017-09-02T01:53:16.287 回答