spark筆記

1、spark架構與作業執行流程簡介

運行spark最簡單的方法就是通過local模式(即僞分佈模式)

./bin/run-example org.apache.examples.SparkPi local

2、基於Standalone的spark架構與作業執行流程

Standalone模式下,集羣啓動時包括masterworker,其中master負責接受客戶端提交的作業,管理worker。提供了web站視集羣與作業信息。

名詞解釋:

  1. Stand alone模式下存在的角色
    • Client:客戶端進程,負責提交作業到master
    • Master:Standalone模式中主控節點,負責接受client提交的作業,管理worker,並命令worker啓動driver和executor。
    • Worker:Standalone模式中slave節點上的守護進程,負責管理本節點的資源,定期向master彙報心跳,接受master的命令,啓動driver和executor
    • Driver:一個spark作業運行時包括一個driver進程,也是作業的主進程,負責作業的解析、生成stage並調度Task到Executor上。包括DAGScheduler,Task Scheduler。
    • Executor:即真正執行作業的地方,一個級羣一般包含多個Executor,每個Executor接受Driver的命令Launch Task,一個Executor可以執行一到多個Task。
  2. 作業相關的名詞解釋
    • Stage :一個Spark作業一般包含一到多個Stage。
    • Task:一個stage包含一到多個task,通過多個task實現並行運行的功能。
    • DAGScheduler:實現將spark作業分解成一到多個stage,每個stage根據RDD的partition個數決定task的個數,然後生成相應的task set放到taskScheduler中。
    • TaskScheduler:實現task分配到executor上執行。

3、提交作業的兩種方式

  1. Driver運行在Worker上

通過org.apache.spark.deploy.Client類執行作業,作業運行命令如下:

./bin/spark-class org.apache.spark.deploy.Client launch spark://host:port file:///jar_url org.apache.spark.examples.SparkPi spark://host:port

作業執行流:

1546767567526

作業執行流程描述:

  1. 客戶端提交作業給Master
  2. master讓一個worker啓動driver,即schedulerbackend。worker創建一個driver runner線程,driver runner啓動schedulerbackend進程
  3. 另外master還會讓其餘worker啓動executor,即executorbackend。worker創建一個executor runner線程,executor runner會啓動executorbackend進程。
  4. executorbackend啓動後回想driver的schedulerbackend註冊。schedulerbackend進程中包含DAGScheduler,它會根據用戶程序,生成執行計劃,並調度執行。對於每個stage的task,都會被存放到task scheduler中,executorbackend向schedulerbackend彙報的時候把task scheduler中的task調度到executorbackend執行。
  5. 所有stage都完成後作業結束。
  1. Driver運行在客戶端

    直接執行Spark作業,作業運行命令如下:

    ./bin/run-example org.apache.spark.examples.SparkPi spark://host:port
    

    作業執行流如圖所示:

    1546769020634

作業執行流程描述:

  1. 客戶端啓動後直接運行用戶程序,啓動driver相關的工作:DAGScheduler和BlockManagerMaster等。
  2. 客戶端的Driver向Master註冊。
  3. Master還會讓Worker啓動Exeuctor。Worker創建一個ExecutorRunner線程,ExecutorRunner會啓動ExecutorBackend進程。
  4. ExecutorBackend啓動後會向Driver的SchedulerBackend註冊。Driver的DAGScheduler解析作業並生成相應的Stage,每個Stage包含的Task通過TaskScheduler分配給Executor執行。
  5. 所有stage都完成作業結束。

4、stage,task和job的區別與劃分方式

job:一個由多個任務組成的並行計算,當你需要執行一個rdd的action的時候,會生成一個job。

stage:每個 Job 被拆分成更小的被稱作 stage(階段) 的 task(任務) 組,stage 彼此之間是相互依賴的,各個 stage 會按照執行順序依次執行。

Task:一個將要被髮送到 Executor 中的工作單元。是stage的一個任務執行單元,一般來說,一個 rdd 有多少個 partition,就會有多少個 task,因爲每一個 task 只是處理一個 partition 上的數據。

5、flatmap和map的區別

map:對集合中每個元素進行操作。

flatMap:對集合中每個元素進行操作然後再扁平化。

6、dataframe和dataset區別?

其實dataset就是dataframe的升級版,相當於dataframe是dataset的子集,主要區別在於,在spark2.0以後的dataset添加的編碼器,在dataframe中他不是面向對象的編程思維,而在dataset中變成面向對象編程,同時dataset相當於dataframe和rdd的整合版,操作更加靈活

7、10.Spark爲什麼比mapreduce快?

  1. 基於內存計算,減少低效的磁盤交
  2. 高效的調度算法,基於DAG
  3. 容錯機制Linage,精華部分就是DAG和Lingae

8、.Spark技術棧有哪些組件,每個組件都有什麼功能,適合什麼應用場景?可以分別解釋下每個組件的功能和場景

  1. Spark core:是其它組件的基礎,spark的內核,主要包含:有向循環圖、RDD、Lingage、Cache、broadcast等,並封裝了底層通訊框架,是Spark的基礎。
  2. SparkStreaming是一個對實時數據流進行高通量、容錯處理的流式處理系統,可以對多種數據源(如Kdfka、Flume、Twitter、Zero和TCP
    套接字)進行類似Map、Reduce和Join等複雜操作,將流式計算分解成一系列短小的批處理作業。
  3. Spark sql:Shark是SparkSQL的前身,Spark SQL的一個重要特點是其能夠統一處理關係表和RDD,使得開發人員可以輕鬆地使用SQL命令進行外部查詢,同時進行更復雜的數據分析
  4. BlinkDB :是一個用於在海量數據上運行交互式 SQL 查詢的大規模並行查詢引擎,它允許用戶通過權衡數據精度來提升查詢響應時間,其數據的精度被控制在允許的誤差範圍內。
  5. MLBase是Spark生態圈的一部分專注於機器學習,讓機器學習的門檻更低,讓一些可能並不瞭解機器學習的用戶也能方便地使用MLbase。MLBase分爲四部分:MLlib、MLI、ML Optimizer和MLRuntime。
  6. GraphX是Spark中用於圖和圖並行計算

9、廣播變量

​ 廣播變量允許程序員將一個只讀的變量緩存在每臺機器上,而不用在任務之間傳遞變量。廣播變量可被用於有效地給每個節點一個大輸入數據集的副本。Spark還嘗試使用高效地廣播算法來分發變量,進而減少通信的開銷。 Spark的動作通過一系列的步驟執行,這些步驟由分佈式的洗牌操作分開。Spark自動地廣播每個步驟每個任務需要的通用數據。這些廣播數據被序列化地緩存,在運行任務之前被反序列化出來。這意味着當我們需要在多個階段的任務之間使用相同的數據,或者以反序列化形式緩存數據是十分重要的時候,顯式地創建廣播變量纔有用。

10、 累加器

​ 累加器是僅僅被相關操作累加的變量,因此可以在並行中被有效地支持。它可以被用來實現計數器和總和。Spark原生地只支持數字類型的累加器,編程者可以添加新類型的支持。如果創建累加器時指定了名字,可以在Spark的UI界面看到。這有利於理解每個執行階段的進程。(對於python還不支持) 累加器通過對一個初始化了的變量v調用SparkContext.accumulator(v)來創建。在集羣上運行的任務可以通過add或者”+=”方法在累加器上進行累加操作。但是,它們不能讀取它的值。只有驅動程序能夠讀取它的值,通過累加器的value方法。

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