Apache頂級項目介紹6 - Spark

火花四溢,熱情洋溢。極客朋友麼知道,我們翹首以盼的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):

我們首先介紹其最核心的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 MLib提供的高質量算法,性能100+倍於Hadoop MapReduce. 就不能給老大哥點面子啊?當然,這在此說明了基礎架構的重要性,完全得益於核心之核心RDD.

Spark Graph X


Spark Graph X是一個分佈式圖處理框架,提供了對圖計算和圖挖掘的各種接口。有什麼用?舉例來說,我們常用的社交網絡微信,微博等,都需要圖計算處理很多人與人之間的關係鏈,又如著名的PageRank; 類似Pregel(Google的三架馬車之一)在Spark(Scala)上的實現優化。



Spark 2.0

最後,令人期待的Spark 2.0版本也即將發佈。主要核心功能如下:


好了,我們先介紹到這裏了。Spark博大精深,我們拋磚引玉,大家共同分享吧。

最後,看到Spark SUMMIT 2016會在6月初在舊金山舉辦,聲勢浩大,關鍵演講人除了Spark創始人兼CTO, 還包括了Google, Microsoft, 還有我們百度的科學家,Andrew Ng可是業界的頂尖大牛啊!


公衆號: 技術極客TechBooster

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章