首頁>技術>

本文重點參考文章《Scala vs. Python for Apache Spark》,

連結傳送門:https://www.dezyre.com/article/scala-vs-python-for-apache-/213,

在部分內容翻譯的基礎上融入了筆者的些許理解,有興趣的同學也可以看看原文。

2015年前後,網際網路行業中的“大資料”概念掀起一股熱潮。

而Apache Spark作為類Hadoop MapReduce的通用並行框架,一款專為大規模資料處理而設計的分散式計算引擎,以其優越的效能,較為完善的生態,受到了大資料從業人員的青睞。

Spark的框架使用Scala編寫(注:Scala是一種執行在Java虛擬機器上,實現和Java類庫互聯互通的面向物件及函數語言程式設計語言),而Spark的開發目前主要使用三種語言:Scala、Python、Java。

相比於Java,Spark中用Scala開發語法簡潔許多,且支援型別推斷,可大大提升開發效率。更為重要的是,Java不支援REPL(Read-Evaluate-Print-Loop互動式程式設計環境),而REPL又對資料處理十分關鍵(很多時候需要即時檢視結果)。

可以說Spark中的開發工作,Scala相對Java勝出了。

那麼,一向以簡潔易上手,“可讀性爆表”著稱,且擁有互動式程式設計環境的Python,在Spark環境下與Scala相比又如何呢?

本文將從以下幾個方面來談。

效能

Python作為一門解釋型語言,效能可以說是從業人員詬病最多的一環。

Scala基於Java Virtual Machine,在資料分析處理過程中比Python快上近10倍,另外Scala可以無縫呼叫Java API,所以它同Hadoop框架(由Java開發)的互動、相容非常好;Python在這方面就相形見絀了,在Spark環境下想實現同HDFS的互動,開發人員甚至需要使用第三方外掛,如hadopy。

同時,用Python程式碼去調Spark庫效能平庸,且在多程序並行之下比等效的Scala程式碼慢許多。

不過,速度不夠,硬體(核數)來湊,Python這種由於語言特性導致的效能弱勢,會隨著核數的增加而被填補。而當核數充足的情況下,效能也通常不會是我們在Spark開發中決定選擇Scala/Python的最主要因素。

上手難度/語法

在Python Console中輸入importthis顯示出的“Python之禪”,是對Python使用的一篇指導規則,“人生苦短,我用Python”更是業內無數Python程式設計師奉為圭臬的信條。

(Python之禪)

閱讀一個命名規範良好的Python程式就像閱讀英文一樣流暢。這種接近虛擬碼的程式碼,能夠使你高效的解決問題,無論是在Spark中還是其他環境。

此外,Python的中括號(切片操作)真是誰用誰知道,用過都說好。相比之下,Spark程式設計時用到Scala的take/takeRight方法,以及substring配以indexOf,打包編譯幾分鐘,剛跑起來報個下標越界:-1的異常,著實令人抓狂。

編寫Scala程式碼,通常需要新增並不是很有意義但又不得不加的“val”或“var”關鍵字,而Python“生死看淡,上來就幹”,想一個漂亮的變數名,後面即取即用。

不過,筆者真的為Scala的API鏈式呼叫感到暢快,能一段搞定的話還是比絞盡腦汁去想花裡胡哨的變數名來得實在。

此外Scala有些獨特的語法規則,像通常不用“return”關鍵字,將函式體的最後一行作為返回值,可能會讓其他語言的程式設計師上手初期感到些許不適,但Spark中有些Scala語法糖特特特別甜(像RDD入HBase庫經過包裝之後的API十分簡潔明瞭)。

總得來說,Python語法簡單,有著更加標準的程式庫,適合簡單的邏輯處理,而Scala更適合複雜的工作流。

併發性

CPython直譯器中,由於GIL(全域性直譯器鎖)的存在,使用Python寫Spark程式時,不管程序有多少執行緒,每次只有一個CPU在程序中處於活動狀態。

GIL雖然保證了記憶體管理的執行緒安全,但每當需要部署新的程式碼/程式時,就得新啟動更多的程序,需要額外的記憶體開銷。在此場景下,Scala就顯得更為高效和好用了。

型別安全

產品需求是不斷變化的,程式碼重構是時刻準備的。

Scala具有優雅的型別推斷機制,使得它看上去像是一門動態型別語言,不過,作為一門嚴格意義的靜態型別語言,它令你在省去明確指定型別的同時保證型別安全。

Scala寫Spark程式,可以在編譯時就捕獲到型別不匹配的錯誤。用靜態型別語言重構Spark程式比動態語言容易許多,有時你可能會發覺,更改Python程式碼後新產生的bug比修復的原有程式的bug還多(如遇此情形,送上一首《易燃易爆炸》,望笑納)。Python中有種哲學叫“duck typing”,型別檢查的微妙程度可見一斑。

Spark整合

Spark框架的原生語言是Scala,當企業級應用需實現某些特定功能,要修改底層原始碼時,或功能呈現不及預期,需要排查原因時,使用Scala會更加得心應手;在執行調優、最佳化時,Scala也會更加方便。

Python程式碼在JVM中會被包裝,因此無法控制函式中包含的內容。此外,最新的Spark版本中的一些新功能可能僅在Scala中可用,然後才能在Python中移植。Scala在工程方面相對更有優勢。

高階特性/應用

想來,Python當前被看作人工智慧領域的首選語言,多少有scikit-learn的功勞,其中集成了各種特徵工程API和常用演算法。

相比之下,Scala沒有足夠的資料科學工具和庫,Spark-mllib中只集成了部分常用的機器學習方法,但優勢是實現了分散式,可用於大規模資料處理。

關於互動式分析工具,Scala有Zeppelin,Python有Jupyter,也都可以很好地實現資料分析和視覺化,算是平分秋色。流式計算方面,Scala是最佳選擇,因為Python透過PySpark調SparkStreaming不及Scala高效和成熟。

結語

本文針對Apache Spark環境下的兩種主流語言Scala和Python,從幾個維度切入做了分析和對比。

總得來說,Python更加面向分析,而Scala更加面向工程,但它們都是構建資料科學應用程式的優秀語言。

最後提一句,即便一上來就限定了Spark開發程式設計的大環境,筆者也只是粗略的對兩種語言做了比對,絲毫沒有也不敢妄言定論孰優孰劣。

若你要強行分出高下,硬是問我哪種更勝一籌,我只能告訴你:

4
最新評論
  • BSA-TRITC(10mg/ml) TRITC-BSA 牛血清白蛋白改性標記羅丹明
  • 深複製與淺複製有什麼不同