就我短短工作經驗來看,Spark 在台灣比較有熱度的時間是 2017 年 ~ 2018 年,我也是在這段時間開始從 backend engineer 轉成 data engineer,那時候用的版本是 Spark 2,當時在學的時候一直看到 Spark 比 Hadoop 的 MapReduce 快 n 倍好厲害好棒棒,
雖然最近一年工作中沒在用 Spark 了,但這套老牌的分散式計算框架還是有重新熟悉的價值,如今 Spark 版本到 3.5.4 了,就一起在這一系列的文章中來學習一下吧!
首先先來看一下現在的官網是怎麼介紹 Spark 的:
What is Apache Spark™?
Apache Spark™ is a multi-language engine for executing data engineering, data science, and machine learning on single-node machines or clusters.
嗯… 真是簡單有力的一句話,簡單可以很簡單,但複雜起來要把你的 Spark 程式 run 在 10 幾台機器上然後同時平衡效能和成本就是工夫了,
那來看看下一張圖:
看起來 Spark 的核心價值是 Simple、Fast、Scalable 和 Unified,第 4 項 Unified 我想是之後才加進來的,的確 Spark 很強的是你在 local 端執行的程式,你可以在不做任何調整的情況下,把程式 submit 到任一套版本兼容的 Spark 集群中,但效能好不好就再說,
然後關鍵功能有 Batch/Streaming data、SQL analytics、Data science at scale 和 Machine learning,
看起來 Spark 官方把數據分析這件事歸類到 Data science at scale 這個項目裡了,
然後 SQL analytics 這端也是好用的功能,先前的公司就有建了一個 DMP,寫在裡面的 SQL 都是直接 run 在 Spark 上面,沒做任何修改,
最後 Machine learning 這塊現在不曉得是否有跟 LLM 模型做整合,但能確定的是 Spark 的 Machine Learning Library (MLlib) 就支持了常用的許多 ML 模型。
看起來 Spark 也沒變動太多嘛 !?但我們還是來看一下 Spark 3 之後的主要 release note 好了。
Spark 3 的大變革
Spark 2 -> Spark 3.0.0, 3.1.1
加了超多新東西,如下圖
這邊想特別提及的就是 Adaptive Query Exceution。
Adaptive Query Exceution
AQE (Adaptive Query Exceution) 就是在查詢執行時的重新最佳化。
重新最佳化的執行點是 shuffle 和 broadcast 交換的最終階段,Spark 會有最新的統計數據,此時 AQE 就能幫助我們選擇更好的物理策略,例如重新選擇最佳的分區數和分區大小,或者在查詢中加入 hint 來優化。
AQE 有 3 個主要功能:
- 動態地將 sort merge join 轉成 broadcast hash join 或 shuffled hash join。
- 在 shuffle 交換後,基於 map 的統計數據,AQE 會動態地聯合很多小的分區成為一個比較合理的分區。因為太小的分區會有糟糕的 I/O 吞吐效能,所以你不用針對你的 dataset 配置一個合適的分區數。
- 優化 skew join,把 data skew task 拆成平均大小後,轉成 sort merge join 和 shuffle hash join
AQE 預設應該都是啟用的,所以在 Spark UI 上,你會看到執行計畫中會有這樣一個 AdaptiveSparkPlan node 代表 AQE。
小小結
Spark 是個非常強大的分散式計算框架,我相信所有的 Data Engineer 都應該要熟悉一下,且什麼時候開始用都不嫌晚,有空再來把 3.2, 3.3, 3.4, 3.5 的 release note 來翻看看吧,