2017-09-02 62 views
1

在我的Spark應用程序中,我有很多I/O操作,比如codis,hbase等。我想確保每個執行程序中都有一個連接池,我該如何執行此操作優雅? 現在,我分散執行一些靜態類,這對管理不好。如何將它們集中到一個像xxContext這樣的類,一些類似SparkContext的類中,並且需要我播放它?我知道廣播大型只讀數據集是很好的,但這些連接池如何? Java或scala都可以接受。每個JVM中的Spark Streaming連接池

回答

0

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 
} 

Another SO Answer for similar use case

檢查:Design Patterns for using foreachRDD

+0

DB連接不能與狀態(瞬態)序列。因此,建議在執行者級別創建/維護連接(或池)。通常每個執行器一個連接都不錯,其他數據庫需要並行執行** executor連接數**。所有的連接都是獨立的,因爲執行者是獨立的。所以,我不確定集中化的想法是非常好的。 – mrsrinivas

+0

但我想維護每個JVM的連接池以降低成本。我的困惑是如何集中它們。 – wttttt

+0

每個執行程序都是JVM進程。正如代碼中所提到的,您可以在每個JVM的示例代碼中的**第1點**處創建數據庫連接池。 – mrsrinivas