天天看點

Apache Spark---學習總結一

Apache Spark是一個圍繞速度、易用性和複雜分析建構的大資料處理架構,最初在2009年由加州大學伯克利分校的AMPLab開發,并于2010年成為Apache的開源項目之一,與Hadoop和Storm等其他大資料和MapReduce技術相比,Spark有如下優勢:

  • Spark提供了一個全面、統一的架構用于管理各種有着不同性質(文本資料、圖表資料等)的資料集和資料源(批量資料或實時的流資料)的大資料處理的需求
  • 官方資料介紹Spark可以将Hadoop叢集中的應用在記憶體中的運作速度提升100倍,甚至能夠将應用在磁盤上的運作速度提升10倍

 目标:

  • 架構及生态
  • spark 與 hadoop
  • 運作流程及特點
  • 常用術語
  • standalone模式
  • yarn叢集
  • RDD運作流程

架構及生态:

  • 通常當需要處理的資料量超過了單機尺度(比如我們的計算機有4GB的記憶體,而我們需要處理100GB以上的資料)這時我們可以選擇spark叢集進行計算,有時我們可能需要處理的資料量并不大,但是計算很複雜,需要大量的時間,這時我們也可以選擇利用spark叢集強大的計算資源,并行化地計算,其架構示意圖如下:
  • Apache Spark---學習總結一
  • Spark Core:包含Spark的基本功能;尤其是定義RDD的API、操作以及這兩者上的動作。其他Spark的庫都是建構在RDD和Spark Core之上的
  • Spark SQL:提供通過Apache Hive的SQL變體Hive查詢語言(HiveQL)與Spark進行互動的API。每個資料庫表被當做一個RDD,Spark SQL查詢被轉換為Spark操作。
  • Spark Streaming:對實時資料流進行處理和控制。Spark Streaming允許程式能夠像普通RDD一樣處理實時資料
  • MLlib:一個常用機器學習算法庫,算法被實作為對RDD的Spark操作。這個庫包含可擴充的學習算法,比如分類、回歸等需要對大量資料集進行疊代的操作。
  • GraphX:控制圖、并行圖操作和計算的一組算法和工具的集合。GraphX擴充了RDD API,包含控制圖、建立子圖、通路路徑上所有頂點的操作
  • Spark架構的組成圖如下:
  • Apache Spark---學習總結一
  • Cluster Manager:在standalone模式中即為Master主節點,控制整個叢集,監控worker。在YARN模式中為資料總管
  • Worker節點:從節點,負責控制計算節點,啟動Executor或者Driver。
  • Driver: 運作Application 的main()函數
  • Executor:執行器,是為某個Application運作在worker node上的一個程序

Spark與hadoop:

  • Hadoop有兩個核心子產品,分布式存儲子產品HDFS和分布式計算子產品Mapreduce
  • spark本身并沒有提供分布式檔案系統,是以spark的分析大多依賴于Hadoop的分布式檔案系統HDFS
  • Hadoop的Mapreduce與spark都可以進行資料計算,而相比于Mapreduce,spark的速度更快并且提供的功能更加豐富
  • 關系圖如下:
  • Apache Spark---學習總結一

 運作流程及特點:

  • spark運作流程圖如下:
  • Apache Spark---學習總結一
  1. 建構Spark Application的運作環境,啟動SparkContext
  2. SparkContext向資料總管(可以是Standalone,Mesos,Yarn)申請運作Executor資源,并啟動StandaloneExecutorbackend,
  3. Executor向SparkContext申請Task
  4. SparkContext将應用程式分發給Executor
  5. SparkContext建構成DAG圖,将DAG圖分解成Stage、将Taskset發送給Task Scheduler,最後由Task Scheduler将Task發送給Executor運作
  6. Task在Executor上運作,運作完釋放所有資源

     Spark運作特點:

  1. 每個Application擷取專屬的executor程序,該程序在Application期間一直駐留,并以多線程方式運作Task。這種Application隔離機制是有優勢的,無論是從排程角度看(每個Driver排程他自己的任務),還是從運作角度看(來自不同Application的Task運作在不同JVM中),當然這樣意味着Spark Application不能跨應用程式共享資料,除非将資料寫入外部存儲系統
  2. Spark與資料總管無關,隻要能夠擷取executor程序,并能保持互相通信就可以了
  3. 送出SparkContext的Client應該靠近Worker節點(運作Executor的節點),最好是在同一個Rack裡,因為Spark Application運作過程中SparkContext和Executor之間有大量的資訊交換
  4. Task采用了資料本地性和推測執行的優化機制

常用術語:

  • Application: Appliction都是指使用者編寫的Spark應用程式,其中包括一個Driver功能的代碼和分布在叢集中多個節點上運作的Executor代碼
  • Driver:  Spark中的Driver即運作上述Application的main函數并建立SparkContext,建立SparkContext的目的是為了準備Spark應用程式的運作環境,在Spark中有SparkContext負責與ClusterManager通信,進行資源申請、任務的配置設定和監控等,當Executor部分運作完畢後,Driver同時負責将SparkContext關閉,通常用SparkContext代表Driver
  • Executor:  某個Application運作在worker節點上的一個程序,  該程序負責運作某些Task, 并且負責将資料存到記憶體或磁盤上,每個Application都有各自獨立的一批Executor, 在Spark on Yarn模式下,其程序名稱為CoarseGrainedExecutor Backend。一個CoarseGrainedExecutor Backend有且僅有一個Executor對象, 負責将Task包裝成taskRunner,并從線程池中抽取一個空閑線程運作Task, 這個每一個oarseGrainedExecutor Backend能并行運作Task的數量取決與配置設定給它的cpu個數
  • Cluter Manager:指的是在叢集上擷取資源的外部服務。目前有三種類型
    1. Standalon : spark原生的資源管理,由Master負責資源的配置設定
    2. Apache Mesos:與hadoop MR相容性良好的一種資源排程架構
    3. Hadoop Yarn: 主要是指Yarn中的ResourceManager
  • Worker: 叢集中任何可以運作Application代碼的節點,在Standalone模式中指的是通過slave檔案配置的Worker節點,在Spark on Yarn模式下就是NoteManager節點
  • Task: 被送到某個Executor上的工作單元,但hadoopMR中的MapTask和ReduceTask概念一樣,是運作Application的基本機關,多個Task組成一個Stage,而Task的排程和管理等是由TaskScheduler負責
  • Job: 包含多個Task組成的并行計算,往往由Spark Action觸發生成, 一個Application中往往會産生多個Job
  • Stage: 每個Job會被拆分成多組Task, 作為一個TaskSet, 其名稱為Stage,Stage的劃分和排程是有DAGScheduler來負責的,Stage有非最終的Stage(Shuffle Map Stage)和最終的Stage(Result Stage)兩種,Stage的邊界就是發生shuffle的地方
  • DAGScheduler: 根據Job建構基于Stage的DAG(Directed Acyclic Graph有向無環圖),并送出Stage給TASkScheduler。 其劃分Stage的依據是RDD之間的依賴的關系找出開銷最小的排程方法,如下圖
  • Apache Spark---學習總結一
  • TASKSedulter: 将TaskSET送出給worker運作,每個Executor運作什麼Task就是在此處配置設定的. TaskScheduler維護所有TaskSet,當Executor向Driver發生心跳時,TaskScheduler會根據資源剩餘情況配置設定相應的Task。另外TaskScheduler還維護着所有Task的運作标簽,重試失敗的Task。下圖展示了TaskScheduler的作用
  • Apache Spark---學習總結一
  • 在不同運作模式中任務排程器具體為:
    1. Spark on Standalone模式為TaskScheduler
    2. YARN-Client模式為YarnClientClusterScheduler
    3. YARN-Cluster模式為YarnClusterScheduler
  • 将這些術語串起來的運作層次圖如下:
  • Apache Spark---學習總結一
  • Job=多個stage,Stage=多個同種task, Task分為ShuffleMapTask和ResultTask,Dependency分為ShuffleDependency和NarrowDependency

Spark運作模式:

  • Spark的運作模式多種多樣,靈活多變,部署在單機上時,既可以用本地模式運作,也可以用僞分布模式運作,而當以分布式叢集的方式部署時,也有衆多的運作模式可供選擇,這取決于叢集的實際情況,底層的資源排程即可以依賴外部資源排程架構,也可以使用Spark内建的Standalone模式。
  • 對于外部資源排程架構的支援,目前的實作包括相對穩定的Mesos模式,以及hadoop YARN模式
  • 本地模式:常用于本地開發測試,本地還分别 local 和 local cluster

standalone: 獨立叢集運作模式

  • Standalone模式使用Spark自帶的資源排程架構
  • 采用Master/Slaves的典型架構,選用ZooKeeper來實作Master的HA
  • 架構結構圖如下:
  • Apache Spark---學習總結一
  • 該模式主要的節點有Client節點、Master節點和Worker節點。其中Driver既可以運作在Master節點上中,也可以運作在本地Client端。當用spark-shell互動式工具送出Spark的Job時,Driver在Master節點上運作;當使用spark-submit工具送出Job或者在Eclips、IDEA等開發平台上使用”new SparkConf.setManager(“spark://master:7077”)”方式運作Spark任務時,Driver是運作在本地Client端上的
  • 運作過程如下圖:(參考至:http://blog.csdn.net/gamer_gyt/article/details/51833681)
  • Apache Spark---學習總結一
  1. SparkContext連接配接到Master,向Master注冊并申請資源(CPU Core 和Memory)
  2. Master根據SparkContext的資源申請要求和Worker心跳周期内報告的資訊決定在哪個Worker上配置設定資源,然後在該Worker上擷取資源,然後啟動StandaloneExecutorBackend;
  3. StandaloneExecutorBackend向SparkContext注冊;
  4. SparkContext将Applicaiton代碼發送給StandaloneExecutorBackend;并且SparkContext解析Applicaiton代碼,建構DAG圖,并送出給DAG Scheduler分解成Stage(當碰到Action操作時,就會催生Job;每個Job中含有1個或多個Stage,Stage一般在擷取外部資料和shuffle之前産生),然後以Stage(或者稱為TaskSet)送出給Task Scheduler,Task Scheduler負責将Task配置設定到相應的Worker,最後送出給StandaloneExecutorBackend執行;
  5. StandaloneExecutorBackend會建立Executor線程池,開始執行Task,并向SparkContext報告,直至Task完成
  6. 所有Task完成後,SparkContext向Master登出,釋放資源

yarn:  (參考:http://blog.csdn.net/gamer_gyt/article/details/51833681)

  • Spark on YARN模式根據Driver在叢集中的位置分為兩種模式:一種是YARN-Client模式,另一種是YARN-Cluster(或稱為YARN-Standalone模式)
  • Yarn-Client模式中,Driver在用戶端本地運作,這種模式可以使得Spark Application和用戶端進行互動,因為Driver在用戶端,是以可以通過webUI通路Driver的狀态,預設是http://hadoop1:4040通路,而YARN通過http:// hadoop1:8088通路
  • YARN-client的工作流程步驟為:
  • Apache Spark---學習總結一
  • Spark Yarn Client向YARN的ResourceManager申請啟動Application Master。同時在SparkContent初始化中将建立DAGScheduler和TASKScheduler等,由于我們選擇的是Yarn-Client模式,程式會選擇YarnClientClusterScheduler和YarnClientSchedulerBackend
  • ResourceManager收到請求後,在叢集中選擇一個NodeManager,為該應用程式配置設定第一個Container,要求它在這個Container中啟動應用程式的ApplicationMaster,與YARN-Cluster差別的是在該ApplicationMaster不運作SparkContext,隻與SparkContext進行聯系進行資源的分派
  • Client中的SparkContext初始化完畢後,與ApplicationMaster建立通訊,向ResourceManager注冊,根據任務資訊向ResourceManager申請資源(Container)
  • 一旦ApplicationMaster申請到資源(也就是Container)後,便與對應的NodeManager通信,要求它在獲得的Container中啟動CoarseGrainedExecutorBackend,CoarseGrainedExecutorBackend啟動後會向Client中的SparkContext注冊并申請Task
  • client中的SparkContext配置設定Task給CoarseGrainedExecutorBackend執行,CoarseGrainedExecutorBackend運作Task并向Driver彙報運作的狀态和進度,以讓Client随時掌握各個任務的運作狀态,進而可以在任務失敗時重新啟動任務
  • 應用程式運作完成後,Client的SparkContext向ResourceManager申請登出并關閉自己

Spark Cluster模式:

  • 在YARN-Cluster模式中,當使用者向YARN中送出一個應用程式後,YARN将分兩個階段運作該應用程式:
    1. 第一個階段是把Spark的Driver作為一個ApplicationMaster在YARN叢集中先啟動;
    2. 第二個階段是由ApplicationMaster建立應用程式,然後為它向ResourceManager申請資源,并啟動Executor來運作Task,同時監控它的整個運作過程,直到運作完成
  • YARN-cluster的工作流程分為以下幾個步驟
  • Apache Spark---學習總結一
  • Spark Yarn Client向YARN中送出應用程式,包括ApplicationMaster程式、啟動ApplicationMaster的指令、需要在Executor中運作的程式等
  • ResourceManager收到請求後,在叢集中選擇一個NodeManager,為該應用程式配置設定第一個Container,要求它在這個Container中啟動應用程式的ApplicationMaster,其中ApplicationMaster進行SparkContext等的初始化
  • ApplicationMaster向ResourceManager注冊,這樣使用者可以直接通過ResourceManage檢視應用程式的運作狀态,然後它将采用輪詢的方式通過RPC協定為各個任務申請資源,并監控它們的運作狀态直到運作結束
  • 一旦ApplicationMaster申請到資源(也就是Container)後,便與對應的NodeManager通信,要求它在獲得的Container中啟動CoarseGrainedExecutorBackend,CoarseGrainedExecutorBackend啟動後會向ApplicationMaster中的SparkContext注冊并申請Task。這一點和Standalone模式一樣,隻不過SparkContext在Spark Application中初始化時,使用CoarseGrainedSchedulerBackend配合YarnClusterScheduler進行任務的排程,其中YarnClusterScheduler隻是對TaskSchedulerImpl的一個簡單包裝,增加了對Executor的等待邏輯等
  • ApplicationMaster中的SparkContext配置設定Task給CoarseGrainedExecutorBackend執行,CoarseGrainedExecutorBackend運作Task并向ApplicationMaster彙報運作的狀态和進度,以讓ApplicationMaster随時掌握各個任務的運作狀态,進而可以在任務失敗時重新啟動任務
  • 應用程式運作完成後,ApplicationMaster向ResourceManager申請登出并關閉自己

Spark Client 和 Spark Cluster的差別:

  • 了解YARN-Client和YARN-Cluster深層次的差別之前先清楚一個概念:Application Master。在YARN中,每個Application執行個體都有一個ApplicationMaster程序,它是Application啟動的第一個容器。它負責和ResourceManager打交道并請求資源,擷取資源之後告訴NodeManager為其啟動Container。從深層次的含義講YARN-Cluster和YARN-Client模式的差別其實就是ApplicationMaster程序的差別
  • YARN-Cluster模式下,Driver運作在AM(Application Master)中,它負責向YARN申請資源,并監督作業的運作狀況。當使用者送出了作業之後,就可以關掉Client,作業會繼續在YARN上運作,因而YARN-Cluster模式不适合運作互動類型的作業
  • YARN-Client模式下,Application Master僅僅向YARN請求Executor,Client會和請求的Container通信來排程他們工作,也就是說Client不能離開

思考: 我們在使用Spark送出job時使用的哪種模式?

RDD運作流程:

  • RDD在Spark中運作大概分為以下三步:
    1. 建立RDD對象
    2. DAGScheduler子產品介入運算,計算RDD之間的依賴關系,RDD之間的依賴關系就形成了DAG
    3. 每一個Job被分為多個Stage。劃分Stage的一個主要依據是目前計算因子的輸入是否是确定的,如果是則将其分在同一個Stage,避免多個Stage之間的消息傳遞開銷
  • 示例圖如下:
  • Apache Spark---學習總結一
  • 以下面一個按 A-Z 首字母分類,查找相同首字母下不同姓名總個數的例子來看一下 RDD 是如何運作起來的
  • Apache Spark---學習總結一
  • 建立 RDD  上面的例子除去最後一個 collect 是個動作,不會建立 RDD 之外,前面四個轉換都會建立出新的 RDD 。是以第一步就是建立好所有 RDD( 内部的五項資訊 )?
  • 建立執行計劃 Spark 會盡可能地管道化,并基于是否要重新組織資料來劃分 階段 (stage) ,例如本例中的 groupBy() 轉換就會将整個執行計劃劃分成兩階段執行。最終會産生一個 DAG(directed acyclic graph ,有向無環圖 ) 作為邏輯執行計劃
  • Apache Spark---學習總結一
  • 排程任務  将各階段劃分成不同的 任務 (task) ,每個任務都是資料和計算的合體。在進行下一階段前,目前階段的所有任務都要執行完成。因為下一階段的第一個轉換一定是重新組織資料的,是以必須等目前階段所有結果資料都計算出來了才能繼續

繼續閱讀