運算元優化 foreachPartition

2021-07-28 02:51:36 字數 1106 閱讀 5808

運算元優化 foreachpartition

foreach的寫庫原理

預設的foreach的效能缺陷在**?

首先,對於每條資料,都要單獨去呼叫一次function,task為每個資料,都要去執行一次function函式。

如果100萬條資料,(乙個partition),呼叫100萬次。效能比較差。

另外乙個非常非常重要的一點

如果每個資料,你都去建立乙個資料庫連線的話,那麼你就得建立100萬次資料庫連線。

但是要注意的是,資料庫連線的建立和銷毀,都是非常非常消耗效能的。雖然我們之前已經用了

資料庫連線池,只是建立了固定數量的資料庫連線。

你還是得多次通過資料庫連線,往資料庫(mysql)傳送一條sql語句,然後mysql需要去執行這條sql語句。

如果有100萬條資料,那麼就是100萬次傳送sql語句。

以上兩點(資料庫連線,多次傳送sql語句),都是非常消耗效能的。

foreachpartition,在生產環境中,通常來說,都使用foreachpartition來寫資料庫的

使用批處理操作(一條sql和多組引數)

傳送一條sql語句,傳送一次

一下子就批量插入100萬條資料。

用了foreachpartition運算元之後,好處在**?

1、對於我們寫的function函式,就呼叫一次,一次傳入乙個partition所有的資料

2、主要建立或者獲取乙個資料庫連線就可以

3、只要向資料庫傳送一次sql語句和多組引數即可

如果乙個partition的數量真的特別特別大,比如真的是100萬,那基本上就不太靠譜了。

一下子進來,很有可能會發生oom,記憶體溢位的問題。

一組資料的對比:生產環境

乙個partition大概是1千條左右

用foreach,跟用foreachpartition,效能的提公升達到了2~3分鐘。

實際專案操作:

首先jdbchelper裡面已經封裝好了一次批量插入操作!

1343行

批量插入session detail

唯一不一樣的是我們需要isessiondetaildao裡面去實現乙個批量插入

listsessiondetails

運算元優化 repartiton

運算元優化 repartiton 運算元調優之使用repartition解決spark sql低並行度的效能問題 spark.sql.shuffle.partitions 調整dataframe的shuffle並行度 spark.default.parallelism 調整rdd的shuffle並行...

優化資料結構運算元組 指標

開始操作 原始資料結構 define receive max 2048 typedef struct lbdatatype 計畫 1改為指標 2放棄巨集 先1 define receive max 2048 typedef struct lbdatatype 編譯發現 沒有問題 其實是有問題的 你看...

Spark效能優化 2 運算元調優

本片博文為大家帶來的是運算元調優。二.foreachpartition 優化資料庫操作 三.filter 與 coalesce 的配合使用 四.repartition解決 sparksql 低並行度問題 五.reducebykey 預聚合 在生產環境中,通常使用foreachpartition運算元...