Spark正在數據處理領域卷起一場風暴。讓我們通過本篇文章,看看為Spark的大數據平臺起到推波助瀾的幾個重要工具。
Spark生態系統眾生相
Apache Spark不僅僅讓大數據處理起來更快,還讓大數據處理起來更簡單、功能更強大、更方便。Spark并非只是一項技術,它結合了諸多部分,新的功能和性能改進不斷添加進來,每個部分都在不斷完善之中。
本文介紹了Spark生態系統的每個主要部分:每個部分的功能,為什么很重要,是如何發展的,在哪方面不盡如人意,以及可能會往哪個方向發展。
Spark Core
Spark的核心是恰如其名的Spark Core。除了協調和調度作業外,Spark Core還為Spark中的數據處理提供了基本的抽象機制,名為彈性分布式數據集(RDD)。
RDD對數據執行兩個動作:轉換和操作。前者轉換數據,并將它們作為剛創新的RDD來提供;后者根據現有的RDD(比如對象數量)來計算結果。
Spark的速度很快,原因是轉換和操作都保存在內存中。操作慢騰騰地評估,這意味著只有需要相關的數據時,才執行操作;然而,很難搞清楚什么在緩慢運行。
Spark的速度在不斷提高。Java的內存管理往往給Spark帶來問題,于是Project Tungsten計劃避開JVM的內存和垃圾收集子系統,以此提高內存效率。
Spark API
Spark主要是用Scala編寫的,所以Spark的主要API長期以來也支持Scala。不過另外三種使用廣泛得多的語言同樣得到支持:Java(Spark也依賴它)、Python和R.
總的來說,你最好選擇自己最擅長的那種語言,因為你需要的功能特性很可能在該語言中直接得到支持。只有一個例外:相比之下,SparkR中對機器學習的支持不大給力,目前只有一小批算法可供使用。不過將來這種情況勢必會發生變化。
Spark SQL
千萬不要低估了能夠對批量數據執行SQL查詢的能力或便利。Spark SQL提供了對Spark提供的數據執行SQL查詢(并且請求列式DataFrame)的一種通用機制,包括通過ODBC/JDBC連接件進行管道處理的查詢。你甚至不需要正規的數據源。Spark 1.6中添加了這一功能:支持以一種得到支持的格式查詢扁平文件,就像Apache Drill那樣。
Spark SQL其實并不用于更新數據,因為那與Spark的整個意義相悖。可以將因而生成的數據寫回成新的Spark數據源(比如新的Parquet表),但是UPDATE查詢并不得到支持。別指望諸如此類的功能特性很快就會推出;著眼于Spark SQL的改進大多數用于提升其性能,因為它也成了Spark Streaming的基礎。
Spark Streaming
Spark的設計讓它得以支持許多處理方法,包括流處理――Spark Streaming因此得名。關于Spark Steaming的傳統觀點是,它還半生不熟,這意味著只有你不需要瞬間延遲,或者如果你還沒有投入到另一種流數據處理解決方案(比如說Apache Storm),你才會使用它。
但是Storm在逐漸失去人氣;長期使用Storm的推特此后已改用了自己的項目Heron。此外,Spark 2.0承諾會推出一種新的“結構化數據流”模式,以便對實時數據進行交互式Spark SQL查詢,包括使用Spark 的機器學習庫。至于其性能是否高得足以擊敗競爭對手仍需拭目以待,不過它值得認真考慮。
MLlib(機器學習)
機器學習技術素有既神奇,又困難之稱。Spark讓你可以對Spark中的數據運行許多常見的機器學習算法,從而使這些類型的分析容易得多,也更容易被Spark用戶所使用。
MLlib中的可用算法數量眾多,該框架每推出一個修訂版,就會隨之增多。話雖如此,一些類型的算法還是沒有――比如說,涉及深度學習的任何算法。第三方正在利用Spark的人氣來填補這一空白;比如說,雅虎可以借助CaffeOnSpark執行深度學習,它通過Spark充分利用了Caffe深度學習系統。
GraphX (圖形計算)
描繪數百萬實體之間的關系通常需要圖形,這種數據構件描述了那些實體之間的相互關系。Spark的GraphX API讓你可以使用Spark的一套方法,對數據執行圖形操作,于是構建和轉換這類圖形的繁重任務卸載到了Spark。GraphX 還包括用于處理數據的幾種常見算法,比如PageRank或標簽傳播(label propagation)。
從目前來看,GraphX的 一個主要限制是,它最適合靜態圖形。處理添加了新頂點的圖形會嚴重影響性能。此外,如果你已經在使用一種成熟的圖形數據庫解決方案,GraphX還 不太可能取代它。
SparkR(Spark上的R)
R語言為進行統計數值分析和機器學習工作提供了一種環境。Spark在2015年6月添加了支持R的功能,以匹配其支持Python和Scala的功能。
除了為潛在的Spark開發人員多提供一種語言外,SparkR還讓R程序員們可以做之前做不了的許多事情,比如訪問超過單一機器的內存容量的數據集,或者同時輕松地使用多個進程或在多個機器上運行分析。
SparkR還讓R程序員可以充分利用Spark中的MLlib機器學習模塊,創建一般的線性模型。遺憾的是,并非所有的MLlib功能在SparkR中得到支持,不過Spark每推出一個后續的修訂版,都在填補R支持方面的差距。