2017-04-03 77 views
1

forEachAsync vs forEachPartitionAsync有什麼區別?Apache Spark中的forEachAsync vs forEachPartitionAsync有什麼區別?

如果我在這裏猜測是我下面會說,但請糾正我,如果我wrong.forEachAsync剛剛經歷值由一個在一個異步精氣神遍歷所有分區的一個

forEachPartitionAsync:扇出每個分區並在不同的工作人員中並行運行每個分區的lambda。這裏的lambda將以異步的方式逐個遍歷該分區中的值。

但是等待,rdd操作應該事實上並行執行嗎?所以如果我調用應該並行執行的rdd.forEachAsync不是嗎?我想我有點困惑,現在forEachAsync和forEachPartitionAsync之間究竟有什麼不同?除了分別將Tuple與Tuple的迭代器傳遞給lambda。

回答

1

我相信你已經知道的異步的事實,並請求的forEach和forEachPartition之間的區別,

不同的是,ForEachPartition將讓你每個分區的自定義代碼運行,你不能用ForEach做。

例如,您想要將結果保存到數據庫。現在,您知道打開關閉DB連接的代價很高,因此每個執行器的連接(或池)最好。所以你的代碼將是

rdd.forEachPartition(part => { 
    db= mysql..blablabla 
    part.forEach(record=> { 
    db.save(record) 
    }) 
    db.close() 
}) 

你不能在ForEach中做到這一點,在foreach它會迭代每個記錄。

記住,一個分區將總是在一個執行器上運行。因此,如果您在開始處理數據使用forEachPition之前有任何昂貴的前期工作要做。如果不只是使用forEach。兩者都是平行的。一個給你靈活性,另一個給予簡單。

+0

非常感謝!我現在明白了。當從數據庫中檢索記錄時(例如表掃描),你會用什麼?你得到一個Iterable,當你做'iterable.iterator.next()'我不確定它是打開一個新的連接還是使用現有的連接?但我可以說的是,沒有給用戶的連接啓動或關閉過程,因爲它是由spark- - 連接器保管的。 – user1870400

+0

從數據庫中檢索數據時,如果您使用Spark JDBC,則Spark將在內部爲您管理連接。但讓我們說,在DB中有一些小的參考數據的情況下,您可以使用forEachPartition來創建「par分區」連接,然後將數據拉出並最終關閉它完成。如果接受答案,如果它回答你的問題。謝謝 ! – RBanerjee

相關問題