Spark 語言選擇: Scala vs. python
Spark 撰寫語言的選擇
Last updated
Spark 撰寫語言的選擇
Last updated
Spark 一共支援四種不同的程式語言: Java、Scala、Python 以及 R。然而,考慮到 Java 語言並不直觀,R 語言的支援過少,通常,對於 Spark 的使用者而言,主要考慮的程式語言就是 Scala 和 Python。
然而,考慮到 Spark 擁有需多種 API,像是: Spark SQL、MLlib、GraphX (圖運算)、Spark Streaming,以及不同的資料接口,像是: RDD、DataFrame、DataSet,要選擇一個適合的程式語言並不是一件簡單的事。
此篇文章主要參考的論點來自:
Spark 的核心基本上是基於 Scala,Scala 擁有最完整的 API 支援。因此,當使用 Spark 平台運算時,應該要基本了解 Scala 語言,並可以了解 Spark 的運算特性。同時,如果需要去修改 Spark 的原始碼,一定要了解 Scala 語言。
在 Spark 中,有三種不同的資料型態: RDD、DataSet、DataFrame。其中,RDD 基本上支援了 Python 以及 Scala 兩種語言,然而,考慮到 RDD-based API 將在 Spark 3.0 中停止開發,我們應該更重視 DataSet 和 DataFrame 的部分。
DataSet 因為是 statically typed 的資料型態,因此 Python 語言的特性無法支援 DataSet 的型態。DataFrame 的格式 Python 可以支援,且不論 Scala 和 Python 兩種語言都是由於 Catalyst 進行 RDD 的最佳化,因此,兩種程式語言之間不應存在有巨大的效能差異。
對於 RDD 的資料型態而言,Python 存在以下的問題: 第一、Python 本身不支援完整的平行化 (heavy-weight process fork),且 multi-thread 計算時有一些 overhear 的問題,在平行化的效率來說,比起 Scala 來得差。另一方面,由於 Scala 是編譯後執行的語言,Python 則是交互式編譯語言,因此,Scala 比起 Pyhton 更加安全且有效率。針對 RDD 的比較可以顯示如下表:
雖然,以效能而言,Python 比起 Scala 而言好像不是一個好的選擇,但是若考慮到程式語言的簡便性 (Python 比起 Scala 容易學習,且學習的資源也較多),社群的支援 (Python 的使用者基底是 Scala 的數倍),以及跨計算平台的資源 (許多 Machine Learning 的工具都是以 Python 完成),Python 在 Spark 平台上仍有許多的擁護者。
主要討論 Spark SQL、MLlib 以及 Spark Streaming。GraphX 沒有提供Python API (Scala 2.1),因此不討論。
由於 Spark SQL 的核心為 DataFrame 與 DataSet 資料型態,而 MLlib 未來將轉移到 DataFrame-based API,因此,我們放在一起討論。首先,對於 RDD-based API 的 MLlib 比較而言,可以參考上一個小節中的表格比較。對於 DataFrame-based API 而言,兩種語言的效能應該要一致,換句話說,當使用 Python 來進行 MLlib 操作時,要盡量減少 RDD 和 DataFrame 兩種型態的轉換。
另一方面,Python 有許多額外的 Machine Learning 的資源,例如,像是 deep learning 或是其他的計算架構。若是要結合 Spark 的計算結果以及其他計算平台,Python 可以提供較好的跨平台支援。
雖然 Python 支援 Spark Streaming,不過,Python 版本的 Spark Streaming 不支援格式化的 DStream,因此,在效能上,比起 Scala 版本的 Spark Streaming 效率低上不少。
考慮到 Spark Streaming 相對其他應用而言,仍在早期的階段,因此,基於其原生語言 (Scala) 的支援較多,也較穩定。但是以程式的架構來說,Python 在 Spark Streaming 中並沒有太多先天上的劣勢,或許在未來開發完整後會有不同的結果。
在目前版本 (2.4.3) 中,Spark Streaming 已經對 python 友善許多,但是可以看到許多 API 仍然是無法兼容,而標記為 python API。相較 Scala 版本的 Spark Streaming 而言,兩者最大的差別應該是在對自有 receiver 的支援 (應該就是上述所說的格式化的 DStream)。
Scala
Python
Performance
10X faster than Python
Slower
Learning Curve
Not easy for Java people;
Less programmer;
Easier than Scala;
More examples;
More popular;
Concurrency
Based on JVM (better)
Does not support heavy-weight process fork
Type Safety
Statically typed
Dynamically typed
Advanced Features
Spark Streaming
Machine Learning