火花四溢,熱情洋溢。極客朋友麼知道,我們翹首以盼的Spark來了。
提及Spark, 這幾年如日中天,談到大數據如果不提及Spark, Hadoop,就好比這年代帶耳機不是2B的,你都不好意思帶。Spark最初由加州大學伯克利分校(太屌的大學,出了多少名人,名作啊)的AMPLab Matei爲主的小團隊使用Scala開發,其核心代碼只有63個Scala文件(早期版本,這裏提及一下Scala語言又是一個創時代的大作,有人說它太鋒利,有人說它太妖魔)。
Spark作者Matei:
Spark於2010年才成爲Apache開源項目之一。經過短短几年的發展,尤其是在2014年很多知名重量級公司如IBM, Cloudera等大力支持,到如今已經是登峯造極,在大數據並行計算,MapReduce領域,完全無人能及其只右,甚至已然代替了Hadoop的MapReduce模塊,以及到後來Hadoop也只好把Spark作爲其生態重要的一部分作爲介紹。
老樣子,看看Spark官方如何介紹吧:
Spark官網是作者比較喜歡的風格,雖說沒有後來Docker那麼cool,但簡單,清新,美觀,有圖有真相,顯然看起來是一個產品,不像Hadoop的官網,這個...
Spark是一個高速,通用大數據計算處理引擎。簡單明瞭,低調中包涵了野心。
官網繼續介紹亮點:
1. 速度快,Spark直接上數據,超過Hadoop內存MapReduce速度100+以上,又或者磁盤MapReduce速度10+以上。why?Spark擁有高級DAG(有向無環圖)引擎支持數據循環利用,多步數據管道以及in-memory computing。
其實Spark用到了減少IO以及其精華RDD。其實我們在上一篇介紹Hadoop的時候提到了雖然MR v2解決了MR v1的一些問題,但是由於其對HDFS的頻繁操作(包涵了計算臨時結果持久化,數據備份以及shuffle等)導致了磁盤I/O成爲系統瓶頸,因而只適用於離線數據處理,無法支持大規模實時數據處理能力,從而也爲其埋下了重大隱患,被Spark乘勝追擊。
2.易用性,支持Java, Scala, Python, R. 簡單,高效。還記得我們介紹
hadoop的時候提到案例word count,spark只用下面2行甚至可以簡化到1行代碼就實現hadoop幾十,上百行的功能,不得感慨其之強大,這裏提一下之所以着麼簡單是得益於函數式編程以及RDD.
3.功能強大,涵蓋數據各個領域: SQL, Streaming, Analytics, Machine
Learning, Graph X, 野心勃勃,一統大數據江山。
4.兼容各大生態圈,可以運行在Hadoop,
Mesos單機或者雲端。同時支持訪問多種多樣的數據源:HDFS, Cassandra, HBase, S3.
可以看出,Spark的團隊除了包涵技術大拿,還有頂級的宣傳廣告達人,看完了這些介紹,你想不用Spark都難。換句話說,Spark提供了一站式大數據解決方案:
Spark目前官方穩定版本爲1.6於2016年3月9日發佈,當然激動人心的大版本2.x正在緊鑼密鼓中,我們下面也會提到其新特性。
下面開始介紹一些核心模塊。
架構圖如下:
如果我們在縮放一下的化看spark的設計架構:
我們首先介紹其最核心的RDD(Resilient Distributed Dataset), 中文翻譯叫彈性分佈式數據集,Spark將數據存儲在不同分區上的RDD之中。RDD最初思想源於Matei Zaharia自己發表的研究論文。
官方抽象介紹,RDD是一個支持容錯,可以用於並行計算的數據集。夠抽象!
其核心是對分佈式內存的抽象使用,實現了以操作本地集合的方式來操作分佈式數據集,並且已經被Partition。不同的數據集格式對應不同的RDD實現。RDD要支持分佈式必然要可序列化,並默認緩存到內存中(如果內存不足,也可以存儲於磁盤)。每次RDD數據集的操作後的結果,都存放到內存中,並且可以作爲下一個操作的源。這樣省去了MR的大量磁盤讀寫,效率提升至祕籍。說起來容易,這可是Spark最核心之一啊。 另外,其主要特點包括,RDD可以重新安排計算並優化數據處理過程;具有重建RDD和重新計算的容錯性;RDD是不可變的,我們可以修改RDD,但修改後的Transformation是一個新的RDD, 原有的
RDD保持不變。這麼設計顯然是爲了支持高併發。
值得一提的是,RDD的存儲級別還包涵,useDisk, useMemory, deserialized, replication, useOfHeap等等12種,其中OFF_HEAP被保存在Tachyon(一個基於內存的分佈式文件系統,潛力巨大)。
Spark提供兩種主要方法創建一個RDD: Parallelizing an existing collection OR External Dataset, i.e. HDFS, HBase etc.
1> Parallelizing an existing collection.
2> External Dataset, i.e. from HDFS File (這個路徑必須可以被所有工作節點訪問)
以上兩種方法看起來都很簡單直接。一旦你有了RDD, 接下來空間無限, 如:
distFile.map( s => s.length ).reduce( (a,b) => a + b)
RDD支持兩種類型操作,Transformation與Action:
Transformation從現有數據集中創建返回一個全新的RDD,如map, filter, flatMap, groupByKey etc.;RDD1 => RDD2, 實際操作是lazy模式。
Action是基於當前數據集計算後返回的一個值,如reduce, collect, count, first, countByKey,save etc. Action主要用來啓動Spark計算。
如簡單sample:
上邊第二句map是一個transformation;第三句reduce是一個action。注意,因爲是lazy模式,所有的第二,第三句都是action後啓動。Spark在action啓動後, 內核會繪製一張關於計算路徑的有向無環圖DAG, 之後把計算分解成stage運行於獨立機器,並提交每一個機器會運行M/R,並返回結果。
有向無環圖DAG:
有了計算的DAG, Spark內核下一步就是根據DAG圖在劃分stage時充分考慮分佈式計算中的流水線pipeline部分來提高效率,這個過程中RDD引入了Lineage在數據集轉換過程中紀錄了操作數據集的關係,每個操作只關心其父操作,出現錯誤時恢復單個部分,保證了其卓越的性能,其他大多數系統採用類似LOG或備份機制。根據不同transformation操作,RDD在Lineage依賴分爲窄依賴Narrow Dependencies和寬依賴Wide Dependencies。窄依賴指生成的RDD的每一個partition都依賴父RDD(s)的固定的partition,如map,filter,union等;對應的寬依賴則生成RDD的每一個partition都依賴於父RDD(s)的所有partition,如groupby,sort等,其往往對應shuffle。所以,對於窄依賴,Spark會盡量把其劃分在同一個stage中,以爲他們可以進行並行,流水線計算。
上圖:
整體內核計算DAG與Stage劃分如下:
上面我們花了很大的篇幅介紹RDD,這個是Spark的核心之核心,這個不理解的話後續會吃力。
時間篇幅問題,下面簡要介紹Spark大數據一站式服務的其他功能。
Spark Streaming
Spark Streaming提供了高吞吐,高容錯的實時流處理機制。這裏數據來源可以是多種多樣,如Kafka, Flume, Twitter, ZeroMQ, Kinesis, TCP. Spark會將流式計算分解成一系例短小的批處理作業Discretized Stream, 每一段數據都轉換成
RDD,然後將DStream的transformation操作轉變爲針對RDD的transformation。
具體處理流程:
Spark SQL
顯然,Spark SQL使得運行SQL和HiveQL查詢非常簡單,並提供了定位相應表與原數據。查詢時候既可以使用SQL, 也同時支持DataFrame API(RDD)。
SQL使用起來很直接:
DataFrame是一種以RDD爲基礎,類似與傳統數據table的抽象,含帶了schema元信息。可以從sqlContext(已存在RDD, Hive table,或者上圖數據源)。
DataFrame其實從另一個層面是面向對象的數據訪問查詢, 並提供DSL.
不知大家有沒有看出,Spark SQL爲所有的數據源Hive, Avro, Parquet, ORC,
JSON, JDBC提供了統一的訪問接口模型,甚至跨數據源訪問,這個非常棒。
Machine Learning
機器學習,屬於高大上AI範疇了。主要理念是算法通過經驗自動改進算法的研究,如著名的AlphaGo. Spark MLib是Spark對常用的機器學習算法的實現庫,包括了相關的測試和數據生成器。四種常見機器學習問(shu)題(xue):二元分類,迴歸,聚類以及協同過濾。抱歉,太深了,雖然學數學出身,但你懂的。
總體來說, MLib支持在大數據中進行機器學習,如數據源HDFS, HBase;
Spark Graph X是一個分佈式圖處理框架,提供了對圖計算和圖挖掘的各種接口。有什麼用?舉例來說,我們常用的社交網絡微信,微博等,都需要圖計算處理很多人與人之間的關係鏈,又如著名的PageRank; 類似Pregel(Google的三架馬車之一)在Spark(Scala)上的實現優化。
最後,令人期待的Spark 2.0版本也即將發佈。主要核心功能如下:
好了,我們先介紹到這裏了。Spark博大精深,我們拋磚引玉,大家共同分享吧。
最後,看到Spark SUMMIT 2016會在6月初在舊金山舉辦,聲勢浩大,關鍵演講人除了Spark創始人兼CTO, 還包括了Google, Microsoft, 還有我們百度的科學家,Andrew Ng可是業界的頂尖大牛啊!
公衆號: 技術極客TechBooster