Spark的深入淺出

Spark的簡介
維基百科:
Apache Spark是一個開源的集羣運算框架,最初是由加州大學柏克萊分校AMPLab所開發.相對於Hadoop的MapReduce會在運行完工作後將中介數據存放到磁盤中,Spark使用了內存運算技術,能在數據尚未寫入硬盤時在內存分析運算.Spark在內存內運算速度能做到比Hadoop MapReduce的運算速度快100倍,即便是運行程序於硬盤時,Spark也能快上10倍速度。[1]Spark允許用戶將數據加載至集羣內存,並多次對其進行查詢,非常適合用於機器學習算法。
使用Spark需要搭配集羣管理員和分佈式存儲系統。Spark支持獨立模式(本地Spark集羣)、Hadoop YARN或Apache Mesos的集羣管理。[3] 在分佈式存儲方面,Spark可以和HDFS[4]、 Cassandra[5] 、OpenStack Swift和Amazon S3等接口搭載。 Spark也支持僞分佈式(pseudo-distributed)本地模式,不過通常只用於開發或測試時以本機文件系統取代分佈式存儲系統。在這樣的情況下,Spark僅在一臺機器上使用每個CPU核心運行程序。

爲什麼使用Spark?
Hadoop的MapReduce計算模型存在問題:
Hadoop的MapReduce的核心是Shuffle(洗牌).在整個Shuffle的過程中,至少產生6次I/O流.基於MapReduce計算引擎通常會將結果輸出到次盤上,進行存儲和容錯.另外,當一些查詢(如:hive)翻譯到MapReduce任務是,往往會產生多個Stage,而這些Stage有依賴底層文件系統來存儲每一個Stage的輸出結果,而I/O的效率往往較低,從而影響MapReduce的運行速度.

Spark的特點: 快, 易用, 通用,兼容性
(1) 快:
與Hadoop的MapReduce相比,Spark基於內存的運算速度要快100倍上,即使基於硬盤的運算速度也快10倍.Spark實現了搞笑的DAG的執行引擎,從而可以通過內存來高效處理流數據.

(2)易用:
Spark 支持 Java、Python 和 Scala 的 API,還支持超過 80 種高級算法,使用戶可以
快速構建不同的應用。而且 Spark 支持交互式的 Python 和 Scala 的 shell,可以非常方
便地在這些 shell 中使用 Spark 集羣來驗證解決問題的方法

(3)通用:
Spark提供了統一的解決方案.Spark可以用於批處理,交互式查詢(Spark SQL).實時流處理(Spark Streaming),機器學習和圖計算(GraphX),這些不同類型的處理都可以在同一應用中無縫使用.Spark統一的解決方案非常具有吸引力,畢竟任何公司都想用統一的平臺去處理遇到的問題,減少開發和維護的人力成本和部署平臺的物力成本。
另外Spark還可以很好的融入Hadoop的體系結構中可以直接操作HDFS,提供Hive on Spark , Pig on Sparkde 框架集羣成Hadoop.

(4)兼容性:
Spark 可以非常方便地與其他的開源產品進行融合。比如,Spark 可以使用Hadoop 的 YARN 和 Apache Mesos 作爲它的資源管理和調度器.並且可以處理所有 Hadoop 支持的數據,包括 HDFS、HBase 和 Cassandra 等。這對於已經部署Hadoop 集羣的用戶特別重要,因爲不需要做任何數據遷移就可以使用 Spark 的強大處理能力。Spark 也可以不依賴於第三方的資源管理和調度器,它實現了Standalone 作爲其內置的資源管理和調度框架,這樣進一步降低了 Spark 的使用門檻,使得所有人都可以非常容易地部署和使用 Spark。此外,Spark 還提供了在EC2 上部Standalone 的 Spark 集羣的工具。

Spark的生態系統
1.Spark Streaming:
Spark Streaming基於微批量方式的計算和處理,可以用於處理實時的流數據.它使用DStream,簡單來說是一個彈性分佈式數據集(RDD)系列,處理實時數據.數據可以從Kafka,Flume,Kinesis或TCP套接字等衆多來源獲取,並且可以使用由高級函數(如 map,reduce,join 和 window)開發的複雜算法進行流數據處理。最後,處理後的數據可以被推送到文件系統,數據庫和實時儀表板。

Spark SQL
SPark SQL可以通過JDBC API將Spark數據集暴露出去,而且還可以用傳統的BI和可視化工具在Spark數據上執行類似SQL的查詢,用戶哈可以用Spark SQL對不同格式的數據(如Json, Parque以及數據庫等)執行ETl,將其轉化,然後暴露特定的查詢.

Spark MLlib
MLlib是一個可擴展的Spark機器學習庫,由通用的學習算法和工具組成,包括二元分類、線性迴歸、聚類、協同過濾、梯度下降以及底層優化原語。

Spark Graphx:
GraphX是用於圖計算和並行圖計算的新的(alpha)Spark API。通過引入彈性分佈式屬性圖(Resilient Distributed Property Graph),一種頂點和邊都帶有屬性的有向多重圖,擴展了Spark RDD。爲了支持圖計算,GraphX暴露了一個基礎操作符集合(如subgraph,joinVertices和aggregateMessages)和一個經過優化的Pregel API變體。此外,GraphX還包括一個持續增長的用於簡化圖分析任務的圖算法和構建器集合。

除了這些庫意外,還有一些其他的庫,如Blink和Tachyon.
BlinkDB是一個近似查詢 引擎,用於海量數據執行交互式SQL查詢.BlinkDB可以通過犧牲數據精度來提升查詢響應時間.通過在數據樣本上執行查詢並展示包含有意義的錯誤線註解的結果,操作大數據集合.

Tachyon是一個以內存爲中心的分佈式文件系統,能夠提供內存級別速度的跨集羣框架(如Spark和mapReduce)的可信文件共享.它將工作集文件緩存在內存中,從而避免到磁盤中加載需要經常讀取的數據集,通過這一機制,不同的作業/查詢和框架可以內存級的速度訪問緩存文件.
此外,還有一些用於與其他產品集成的適配器,如Cassandra(Spark Cassandra 連接器)和R(SparkR)。Cassandra Connector可用於訪問存儲在Cassandra數據庫中的數據並在這些數據上執行數據分析。

下圖爲Spark的生態系統,各庫的相互關聯:
這裏寫圖片描述

Spark的體系架構

這裏寫圖片描述
Spark架構採用了分佈式計算中的Master-Slave模型。Master是對應集羣中的含有Master進程的節點,Slave是集羣中含有Worker進程的節點。Master作爲整個集羣的控制器,負責整個集羣的正常運行;Worker相當於是計算節點,接收主節點命令與進行狀態彙報;Executor負責任務的執行;Client作爲用戶的客戶端負責提交應用,Driver負責控制一個應用的執行.
Spark集羣部署後,需要在主節點和從節點分別啓動master進程和Worker進程,對整個集羣進行控制.在一個Spark應用的執行程序中.Driver和Worker是兩個重要的角色.Driver程序是應用邏輯執行的起點,負責作業的調度,即Task任務的發佈,而多個Worker用來管理計算節點和創建Executor並行處理任務.在執行階段,Driver會將Task和Task所依賴的file和jar序列化後傳遞給對應的Worker機器.同時Executor對相應數據分區的任務進行處理.

Sparkde架構中的基本組件:

  1. ClusterManager:在standlone模式中即爲Master(主節點),控制整個集羣.監控Worker.在Yarn模式中爲資源管理器.
  2. Worker:從節點,負責控制計算節點,啓動Ex而粗投入或Driver
  3. NodeManager:負責計算節點的控制。
  4. Driver:運行Application的main() 函數並創建SparkContext
  5. Executor: 執行器,在worker node上執行任務組件,用於啓動線程執行任務.每個Application擁有獨立的一組Executors
  6. SparkContext: 整個應用的上下文,監控應用的生命週期
  7. RDD:彈性分佈式集合,spark的基本計算單元,一組RDD可形成執行的有向無環圖RDD Graph
  8. DAG Scheduler: 根據作業(Job)構建基於Stage的DAG,並交給Stage給TaskScheduler
  9. TaskScheduler:將任務(Task)分發給Executor執行
    1. SparkEnv:線程級別的上下文,存儲運行時的重要組件的引用。SparkEnv內創建幷包含如下一些重要組件的引用。
    2. MapOutPutTracker:負責Shuffle元信息的存儲。
    3. BroadcastManager:負責廣播變量的控制與元信息的存儲。
    4. BlockManager:負責存儲管理、創建和查找塊。
    5. MetricsSystem:監控運行時性能指標信息。
    6. SparkConf:負責存儲配置信息。

Spark的整體流程:client提交應用,Master找到一個Worker啓動Driver,Driver向Master或者向資源管理器申請資源,之後將應用轉化爲RDD Graph,再由DAGScheduler將RDD Graph轉化爲Stage的有向無環圖提交給TaskScheduler,由TaskScheduler提交任務給Executor執行。在任務執行的過程中,其他組件協同工作,確保整個應用順利執行。

spark的基本工作原理
這裏寫圖片描述

1.Client客戶端:我們在本地編寫了spark程序,打成jar包,或python腳本,通過spark submit命令提交到Spark集羣;
2.只有Spark程序在Spark集羣上運行才能拿到Spark資源,來讀取數據源的數據進入到內存裏;
3.客戶端就在Spark分佈式內存中並行迭代地處理數據,注意每個處理過程都是在內存中並行迭代完成;注意:每一批節點上的每一批數據,實際上就是一個RDD!!!一個RDD是分佈式的,所以數據都散落在一批節點上了,每個節點都存儲了RDD的部分partition。
4.Spark與MapReduce最大的不同在於,迭代式計算模型:MapReduce,分爲兩個階段,map和reduce,兩個階段完了,就結束了,所以我們在一個job裏能做的處理很有限; Spark,計算模型,可以分爲n個階段,因爲它是內存迭代式的。我們在處理完一個階段以後,可以繼續往下處理很多個階段,而不只是兩個階段。所以,Spark相較於MapReduce來說,計算模型可以提供更強大的功能。

RDD以及一些特性
1. RDD是Spark提供的核心抽象,全稱爲Resillient Distributed Dataset,即彈性分佈式數據集;
2. RDD在抽象上來說是一種元素結合,包含看數據.它是被分區的,分爲多個分區,每個分區分佈在集羣中的不同節點上,從而讓RDD中的數據可以被並行操作。(分佈式數據集)
3. RDD通常通過Hadoop上的文件,即HDFS文件或者Hive表,來進行創建;有時也可以通過應用程序中的集合來創建;
4. RDD最重要的特性就是,提供了容錯性,可以自動從節點失敗中恢復過來。即如果某個節點上的RDD partition,因爲節點故障,導致數據丟了,那麼RDD會自動通過自己的數據來源重新計算該partition。這一切對使用者是透明的;
5. RDD的數據默認情況下存放在內存中的,但是在內存資源不足時,Spark會自動將RDD數據寫入磁盤

問題:RDD分佈式是什麼意思?
一個RDD,在邏輯上,抽象地代表了一個HDFS文件;但是,它實際上是被分爲多個分區;多個分區散落在Spark集羣中,不同的節點上。比如說,RDD有900萬數據。分爲9個partition,9個分區。

問題:RDD彈性是什麼意思,體現在哪一方面?
RDD的每個partition,在spark節點上存儲時,默認都是放在內存中的。但是如果說內存放不下這麼多數據時,比如每個節點最多放50萬數據,結果你每個partition是100萬數據。那麼就會把partition中的部分數據寫入磁盤上,進行保存。
而上述這一切,對於用戶來說,都是完全透明的。也就是說,你不用去管RDD的數據存儲在哪裏,內存,還是磁盤。只要關注,你針對RDD來進行計算,和處理,等等操作即可。所以說,RDD的這種自動進行內存和磁盤之間權衡和切換的機制,就是RDD的彈性的特點所在。

問題:RDD容錯性體現在哪方面?
比如:節點9出了些故障,導致partition9的數據丟失了。那麼此時Spark會脆弱到直接報錯,直接掛掉嗎?不可能!!
RDD是有很強的容錯性的,當它發現自己的數據丟失了以後,會自動從自己來源的數據進行重計算,重新獲取自己這份數據,這一切對用戶,都是完全透明的。

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