淺談Scala在大數據處理方面的優點

隨着大數據應用得日益普遍,與大數據相關的話題也愈來愈被你們所熱議。在IT界,大數據一樣是熱門。做爲學生黨的我,最近也在研究關於大數據的內容。做爲一個技術迷,老是會想嘗試一些新鮮的東西。前一段時間學習了Hadoop以後,又想開始體驗Spark。那麼如今就討論一下關於Spark的話題。
Spark是發源於美國加州大學伯克利分校AMPLab的集羣計算平臺。它立足於內存計算,從多迭代批量處理出發,兼收幷蓄數據倉庫、流處理和圖計算等多種計算範式,是罕見的全能選手。就大數據集而言,對典型的迭代機器 學習、即席查詢(ad-hoc query)、圖計算等應用,Spark版本比基於MapReduce、Hive和Pregel的實現快上十倍到百倍。其中內存計算、數據本地性 (locality)和傳輸優化、調度優化等該居首功,也與設計伊始即秉持的輕量理念不無關係。
那麼,天下武功,惟快不破,看到這裏固然是以一種很激動的心情想要去學習它了。那麼問題也來了,經過百度等各類小道消息打聽到,Spark是採用Scala語言設計的,要想學好Spark,Scala這一關必須是要過的,而且像Twitter、Linkedin等這些公司都在用。因而,還能怎麼辦,學唄。。。 
因而,就愉快的開始了Scala之旅,嘿嘿,而後就沒有而後了。看了Scala前面的內容還好,看到後面真的是想吐血了,簡直是受不了這種編寫方式,不只編譯速度慢,並且編寫代碼過於隨意、靈活,徹底沒法駕馭。因而,進行了心裏的各類掙扎,而且還被實驗室的幾個研究生學長踏雪了一番,我也不能坐以待斃了,所以,我再一次選擇了強大的網絡,打開搜索引擎,而後查看各類八卦與新聞。如下是搜索到的各類觀點。
我想大部分應用開發程序員,最關鍵是看有什麼類庫合適的方便特定領域的應用開發。就像ruby有rails作web開發,你能夠去論證ruby優缺點,但實際上應用開發效率提高很大程度上依靠類庫。 
如今Spark是大數據領域的殺手級應用框架,BAT,咱們如今幾個領域巨頭的客戶(有保密協議不方便透露)都全面使用Spark了,這個時候再談Scala適不適合大數據開發其實意義不大。由於你們比的不僅是編程語言,而是構建在這個編程語言之上的類庫、社區和生態圈(包括文檔和數據、衍生類庫、商業技術支持、成熟產品等等)。 
那麼反過來問,爲何Spark會選擇Scala可能更有意義一點。Spark主創Matei在不一樣場合回答兩次這個問題,思考的點稍微不同,但重點是同樣的,很適合回答題主的問題。總結來講最主要有三點: 
1. API能作得優雅; 這是框架設計師第一個要考慮的問題,框架的用戶是應用開發程序員,API是否優雅直接影響用戶體驗。 
2. 能融合到Hadoop生態圈,要用JVM語言; Hadoop如今是大數據事實標準,Spark並非要取代Hadoop,而是要完善Hadoop生態。JVM語言大部分可能會想到Java,但Java作出來的API太醜,或者想實現一個優雅的API太費勁。 
3. 速度要快; Scala是靜態編譯的,因此和JRuby,Groovy比起來速度會快不少,很是接近Java。 
關於Scala性能的問題,主要分兩種狀況, 
1. Scala的基準性能很接近Java,但確實沒有Java好。但不少任務的單次執行的,性能損失在毫秒級不是什麼問題; 
2. 在大數據計算次數不少的狀況下,咱們所有寫成命令式,並且還要考慮GC,JIT等基於JVM特性的優化。 
Scala很難是個很含糊的問題,關鍵是要看你想達到什麼目的。 
咱們培訓客戶作Spark開發,基本上一兩個星期就能夠獨立工做了。 
固然師傅領進門,修行靠我的,一兩個星期能獨立工做不表明能立刻成爲Scala或Spark專家。 
這裏回答主要針對大數據產品應用開發,不是大數據分析。大數據分析是個更泛的話題,包括大數據分析實驗和大數據分析產品等。實驗關心建模和快速試不一樣方式,產品關心穩定、可拓展性。大數據分析實驗首選R(SAS),python和Matlab, 一般只拿真實數據的一小部分,在一個性能很好的單機上試各類想法。Scala目前在大數據分析實驗上沒有太多優點,不過如今有人在作R語言的Scala實現,能夠無縫和Spark等大數據平臺作銜接。固然如今也已經有SparkR了,可能用R和Spark作交互。
Scala是一門現代的多範式編程語言,設計初衷是要集成面向對象編程和函數式編程的各類特性。Scala容許用戶使用命令和函數範式編寫代碼。Scala運行在Java虛擬機之上,能夠直接調用Java類庫。對於新手來講,Scala相對比較複雜,其看起來靈活的語法並不容易掌握,可是對於熟悉Scala的用戶來講,Scala是一把利器,它提供了許多獨特的語言機制,能夠以庫的形式輕易無縫添加新的語言結構。
在大數據和機器學習領域,不少開發者都有Python/R/Matlab語言的背景,相比與Java或者C++,Scala的語法更容易掌握。從以往的經驗來看,只要掌握基本的集合API以及lambda,一個沒有經驗的新員工就能夠快速上手處理數據。像Breeze、ScalaLab和BIDMach這樣的類庫都經過操做符重寫模仿了一些流行工具的語法以及其它的一些語法糖,簡單而且容易使用。另外,Scala的性能比傳統的Python或者R語言更好。 
因爲Scala運行於Java平臺(Java虛擬機),併兼容現有的Java程序,因此Scala能夠和大數據相關的基於JVM的系統很好的集成,好比基於JVM類庫的框架Scalding(Cascading)、Summingbird(Scalding和Storm)、Scrunch(Crunch)、Flink(Java編寫並有Scala的API),自己使用Scale開發的系統Spark、Kafka。另外,不少數據存儲解決方案都支持JVM語言,好比Cassandra、HBase、Voldemort和Datomic。 
函數編程範式更適合用於Map/Reduce和大數據模型,它摒棄了數據與狀態的計算模型,着眼於函數自己,而非執行的過程的數據和狀態的處理。函數範式邏輯清晰、簡單,很是適合用於處理基於不變數據的批量處理工做,這些工做基本都是經過map和reduce操做轉換數據後,生成新的數據副本,而後再進行處理。而大多數的Scala數據框架都可以把Scala數據集合API和抽象數據類型相統一,好比Scalding中的TypedPipe與Spark中的RDD都有相同的方法,包括map、flatMap、filter、reduce、fold和groupBy,這樣使用Scala來處理就更爲方便。開發者只須要學習標準集合就能夠迅速上手其它工具包。另外,不少的類庫都參考了範疇論中的一些設計,它們經過使用semigroup、monoid、group標識來保證分佈式操做的正確性。
 python

相關文章
相關標籤/搜索