Apache Spark是一個分布式計算框架势似,可以簡化和加速數(shù)據(jù)處理和分析工作流程,適用于處理大型數(shù)據(jù)集的數(shù)據(jù)科學(xué)家和工程師。它為原型設(shè)計提供統(tǒng)一的界面,并構(gòu)建生產(chǎn)質(zhì)量應(yīng)用程序永品,使其特別適合敏捷方法。我個人認(rèn)為Spark將不可避免地成為機(jī)器學(xué)習(xí)和數(shù)據(jù)科學(xué)事實上的大數(shù)據(jù)框架击纬。
盡管對Spark有不同看法鼎姐,但我們假設(shè)數(shù)據(jù)科學(xué)團(tuán)隊希望開始將其作為主要技術(shù)。編程語言的選擇通常是一個兩難選擇。我們應(yīng)該在Python或Scala中構(gòu)建我們的模型嗎炕桨?我們應(yīng)該使用Python筆記本或Scala進(jìn)行探索性分析嗎饭尝?
一個共同的理解是Python是科學(xué)語言,Scala是一種工程語言献宫,被視為Java的更好替代品钥平。雖然事實確實如此,但并非總是如此姊途。
由于這兩種語言的比較已經(jīng)在其他地方進(jìn)行了詳細(xì)的評估涉瘾,我想將這種比較限制在敏捷工作流中利用Apache Spark構(gòu)建數(shù)據(jù)產(chǎn)品的特定用例。
特別是捷兰,我可以確定此上下文中的數(shù)據(jù)科學(xué)編程語言應(yīng)提供的6個重要方面:
生產(chǎn)率
安全重構(gòu)
Spark整合
開箱即用的機(jī)器學(xué)習(xí)/統(tǒng)計軟件包
文檔/社區(qū)
交互式探索性分析和內(nèi)置可視化工具
為什么只有Scala和Python立叛?
Apache Spark附帶了4個API:Scala,Java贡茅,Python和最近的R.我之所以只考慮“PyScala”秘蛇,是因為它們主要提供與其他2種語言相似的功能(Scala over Java和Python over R),在我看來友扰,整體得分更高彤叉。此外,R不是通用語言村怪,其API仍處于試驗階段秽浇。
1.生產(chǎn)力
盡管靠近底層的編碼總能產(chǎn)生最優(yōu)化的結(jié)果,但已知成熟優(yōu)化是所有邪惡的根源甚负。特別是在最初的MVP階段柬焕,我們希望用盡可能少的代碼行來實現(xiàn)高生產(chǎn)率,并且可能由智能IDE引導(dǎo)梭域。
Python是一種非常易于學(xué)習(xí)且高效的語言斑举,可以從第1天開始快速完成工作。由于Scala具有高級功能病涨,因此需要更多的思考和抽象富玷,但只要您熟悉它,您的工作效率就會提高將大大提升既穆。代碼簡潔性非呈昱常可比,兩者都可以非常簡潔幻工,具體取決于您在編碼方面的表現(xiàn)励两。閱讀Python更加明確,它逐步向您顯示代碼執(zhí)行的內(nèi)容以及每個變量的狀態(tài)囊颅。另一方面当悔,Scala將更多地關(guān)注描述您要實現(xiàn)的目標(biāo)傅瞻,最終結(jié)果隱藏了大部分實現(xiàn)細(xì)節(jié)和執(zhí)行順序。但要記住盲憎,強(qiáng)大的力量會帶來很大的責(zé)任 雖然模式匹配是提取變量的一種非承峤荆酷的方式,
在IDE方面焙畔,IntelliJ和PyCharm都是智能且高效的環(huán)境掸读。盡管如此,與腳本語言不同宏多,Scala可以利用類型和編譯時交叉引用儿惫,它們可以更自然地提供一些額外的功能,而且不會產(chǎn)生歧義伸但。僅舉幾例:在項目中按名稱查找類/方法并鏈接依賴項肾请,查找用法,基于類型兼容性的自動完成更胖,開發(fā)時錯誤或警告铛铁。
另一方面,所有這些編譯時功能都帶來了成本:IntelliJ却妨,sbt和所有相關(guān)工具都很慢并且內(nèi)存/ CPU消耗很大饵逐。如果為了在Scala中打開多個并行項目,分配了2GB的RAM彪标,那么您不應(yīng)該感到驚訝倍权。在這方面,Python更輕量級捞烟。
結(jié)論:這兩個得分都非常好薄声,我的建議是如果你正在開發(fā)簡單的直觀邏輯,那么Python可以大大地完成工作题画,如果你想做一些比在Scala中學(xué)習(xí)和編寫功能代碼更值得投資的事情默辨。
2.安全重構(gòu)
此要求主要是敏捷方法,我們希望在執(zhí)行數(shù)據(jù)探索時安全地更改代碼的要求苍息,并在每次迭代時對其進(jìn)行調(diào)整缩幸。通常,您首先使用相關(guān)測試編寫一些代碼竞思,并在測試之后立即執(zhí)行和API桌粉。每次我們執(zhí)行重構(gòu)時,我們都會面臨引入錯誤并默默打破先前邏輯的風(fēng)險衙四。
這兩種語言都必須要求測試(單元測試,集成測試患亿,基于屬性的測試等......)才能安全地重構(gòu)传蹈。Scala作為一種編譯語言具有更好的優(yōu)勢押逼,但我不打算論證編譯與腳本語言的優(yōu)缺點。所以惦界,我會跳過這個挑格,但至少對我來說,我可以從鍵入的代碼中看到一些有用的好處沾歪。
結(jié)論:Scala非常好漂彤,Python平均。
3. Spark集成
大部分時間和資源通常用于加載灾搏,清理挫望,轉(zhuǎn)換數(shù)據(jù)以及從中提取最豐富的信息。對于那個任務(wù)狂窑,什么比將域特定邏輯表達(dá)為函數(shù)組合更好媳板,而不是懶得執(zhí)行它?難怪大數(shù)據(jù)正在變得越來越有用泉哈。
你現(xiàn)在希望我說Scala做得更好蛉幸,因為它具有原生功能。實際上在這種情況下丛晦,Spark之間的差異很大奕纫,而不是編程語言。盡管Python不是100%全功能(你可以通過外部庫來實現(xiàn))烫沙,但它包含了確實具有功能性的Spark API匹层。
然后,單個映射或簡化函數(shù)的實現(xiàn)可以是有效的斧吐,但至少主要邏輯表示為對原始數(shù)據(jù)的轉(zhuǎn)換和操作的管道又固,并且執(zhí)行計劃由計算框架定義。
您仍然必須巧妙地使用不同的Spark API以使您的代碼可擴(kuò)展和優(yōu)化煤率,但這兩個案例的任務(wù)是相同的仰冠。如果我們考慮代碼執(zhí)行性能,那么我們都知道JVM編譯的代碼運(yùn)行速度比Python代碼快蝶糯,但Spark正在轉(zhuǎn)向與DataFrame類似的語言抽象洋只,這將優(yōu)化大部分工作,從而產(chǎn)生可比較的性能結(jié)果昼捍。
因此识虚,解決方案是“使用Spark”。由于這一點(并且獨立于功能性質(zhì))妒茬,Scala本身支持它担锤,特別是在執(zhí)行低級調(diào)優(yōu),優(yōu)化和調(diào)試時特別方便乍钻。如果您使用過Spark框架肛循,那么您很熟悉它的序列化異常铭腕。由于Python代碼在JVM中被包裝和執(zhí)行,因此您無法控制函數(shù)中包含的內(nèi)容多糠。此外累舷,最新的Spark版本中的一些新功能可能僅在Scala中可用,然后才能在Python中移植夹孔。
結(jié)論:Scala在工程方面更好被盈,相當(dāng)于Spark集成和功能。
4.開箱即用的機(jī)器學(xué)習(xí)/統(tǒng)計軟件包
當(dāng)你嫁給一種語言時搭伤,你就嫁給了整個家庭只怎。對于實現(xiàn)大多數(shù)標(biāo)準(zhǔn)程序和模型的開箱即用軟件包而言,Python還有更多的東西可以實現(xiàn)闷畸,這些程序和模型通吵⑴危可以在文獻(xiàn)中找到和/或在行業(yè)中廣泛采用。Scala仍然落伍佑菩,但可以從Java庫兼容性和社區(qū)直接在Spark上開發(fā)一些流行的機(jī)器學(xué)習(xí)算法(參見MLlib盾沫,H20 Sparkling Water,DeepLearning4j ......)中受益殿漠。關(guān)于MLlib的一點注意事項赴精,根據(jù)我的經(jīng)驗,它的實現(xiàn)有點hacky绞幌,并且由于私有字段和類的平庸設(shè)計和無意義限制而經(jīng)常難以修改或擴(kuò)展蕾哟。
誠然,關(guān)于Java兼容性莲蜘,我沒有看到任何Java框架與其今天提供的Python有著驚人的scikit-learn和相關(guān)庫谭确。另一方面,許多Python實現(xiàn)僅在本地工作(除非使用一些bootstrapping / bagging +模型集成技術(shù)票渠,請參閱 https://cornercases.wordpress.com/2013/10/23/example-python-machine-learning-algorithm -on-spark /)但是他們開箱即用的實現(xiàn)在分布式算法方面缺乏強(qiáng)大的可擴(kuò)展性逐哈。另一方面,Scala只提供了一些實現(xiàn)问顷,但已經(jīng)可擴(kuò)展且可以生產(chǎn)昂秃。
不過,不要忘記在小數(shù)據(jù)問題中可以減少許多大數(shù)據(jù)問題杜窄,特別是在精確的特征選擇肠骆,過濾和聚合之后。在某些情況下塞耕,將大型數(shù)據(jù)集壓縮到矢量空間可能是有意義的蚀腿,該空間可以完美地適應(yīng)內(nèi)存并利用Python中提供的豐富性和高級算法。
結(jié)論:這實際上取決于數(shù)據(jù)的大小扫外。每次它都適合內(nèi)存時首選Python唯咬,但請記住項目的要求是什么:它只是一個原型還是你想在生產(chǎn)系統(tǒng)中部署/維護(hù)的東西纱注?Python提供了一系列已經(jīng)實現(xiàn)的軟件包,可以滿足任何需求胆胰。Scala只提供基礎(chǔ)知識,但在“生產(chǎn)”的情況下刻获,這是一個更好的工程選擇蜀涨。
5.文件/社區(qū)
如果我們在社區(qū)大小方面比較兩種簡單語言(沒有它們的外部庫),那么Python屬于tier1而Scala就在tier2之后蝎毡,請參閱 http://readwrite.com/2010/12/10/ranking-programming-語言厚柳。實際上,這意味著他們在StackOverflow中都有足夠的教程和答案沐兵,涵蓋了大多數(shù)用例和操作方法别垮。
如果我們考慮機(jī)器學(xué)習(xí)和統(tǒng)計框架的文檔,Python數(shù)據(jù)科學(xué)社區(qū)就會更加成熟扎谎,事實上你可以找到很多關(guān)于如何使用大多數(shù)Python庫解決很多問題和冷卻分析的教程和示例碳想。
不幸的是,我們不能對Scala說同樣的話毁靶。ML和MLlib庫非常差胧奔,真正理解它們?nèi)绾喂ぷ鞯奈ㄒ环椒ㄊ情喿x代碼≡み海可能與我在GitHub上找到的其他一些開源庫有關(guān)龙填。
結(jié)論:
在軟件開發(fā)方面,它們都具有良好的可比性社區(qū)拐叉。當(dāng)我們考慮數(shù)據(jù)科學(xué)社區(qū)和酷數(shù)據(jù)科學(xué)項目時岩遗,Python很難被擊敗。
6.交互式探索性分析和內(nèi)置可視化工具
iPython是科學(xué)界發(fā)明的最偉大的工具之一凤瘦,一年前它對奧斯卡獲勝者毫無疑問宿礁。今天我們可以找到許多受iPython筆記本啟發(fā)的筆記本電腦實現(xiàn),適用于任何語言廷粒。iPython進(jìn)化的Jupyter支持不同的內(nèi)核窘拯,而iScala實際上是基于akka播放的寧靜服務(wù)重新實現(xiàn)它。如果您只考慮打開基于Web的筆記本并開始編寫代碼并與其進(jìn)行交互坝茎,我認(rèn)為它們非常相似涤姊。
如果我們考慮使用筆記本與Spark進(jìn)行交互,那么使用Spark Notebook(在Scala中)可能會更有用嗤放,因為它是專門為此目的而設(shè)計的思喊,它提供了一些工具來生成自定義火花上下文或停止當(dāng)前正在進(jìn)行的作業(yè),無需訪問Spark UI或從命令行運(yùn)行命令次酌。雖然有一個很好的功能恨课,但我認(rèn)為不會有很大的不同舆乔。
當(dāng)我們接受依賴注入時,痛苦就來了剂公,在這方面Scala是一個真正的噩夢希俩!作為一個已編譯的JVM語言,所有依賴項必須在類路徑中可用纲辽,并且每次jar更改或新路徑進(jìn)入路徑時都需要重新啟動內(nèi)核颜武。此外,由于某種原因使用依賴管理工具(如sbt)會產(chǎn)生大量流量拖吼,然后將所有依賴項打包到一個大小為數(shù)百MB的胖jar中鳞上,然后必須由執(zhí)行后端代碼的JVM加載。Python在這里做得更好吊档,因為所有內(nèi)容都是在運(yùn)行時指定的篙议,您可以簡單地導(dǎo)入代碼或庫,解釋器將自動為您解決它怠硼,而無需重新啟動內(nèi)核鬼贱。這一方面非常重要,尤其是在將IDE中的開發(fā)與筆記本中的探索分離時拒名,從源文件夾中調(diào)用已實現(xiàn)邏輯的API吩愧。我用TypeSafe和SparkNotebook的人提出了這個問題,希望能以更有效的方式以某種方式解決它增显。
內(nèi)置可視化:Spark Notebook包含一個非逞慵眩基本的內(nèi)置viz庫,一個簡單但可接受的WISP庫同云,以及很少有關(guān)于javascript技術(shù)的包裝糖权,如D3,Rickshaw炸站。一般來說星澳,它可以渲染和包裝任何JavaScript庫,但非常友好也不直觀旱易。毫無疑問禁偎,Python在提供和選擇繪制和構(gòu)建交互式儀表板的酷炫和高級方法方面具有優(yōu)勢。
結(jié)論:Python獲勝阀坏,即使SparkNotebook做得很好如暖,Scala還不夠成熟。我們還沒有考慮最近的Apache Zeppelin忌堂,它提供了一些奇特的可視化功能盒至,并支持語言無關(guān)的筆記本概念,其中每個單元可以代表任何類型的代碼:Scala,Python枷遂,SQL ......并且專門設(shè)計用于與Spark集成樱衷。
最終判斷
我應(yīng)該使用Scala還是Python?答案是:兩者都是的酒唉!
嘗試兩者并嘗試測試自己哪種更適合您的特定用例矩桂。根據(jù)經(jīng)驗:Python更加面向分析,而Scala更加面向工程黔州,但它們都是構(gòu)建數(shù)據(jù)科學(xué)應(yīng)用程序的優(yōu)秀語言耍鬓。理想的情況是讓數(shù)據(jù)科學(xué)團(tuán)隊能夠?qū)@兩者充滿信心并在需要時進(jìn)行交換。