1、spark架構與作業執行流程簡介
運行spark最簡單的方法就是通過local模式(即僞分佈模式)
./bin/run-example org.apache.examples.SparkPi local
2、基於Standalone的spark架構與作業執行流程
Standalone模式下,集羣啓動時包括master與worker,其中master負責接受客戶端提交的作業,管理worker。提供了web站視集羣與作業信息。
名詞解釋:
- 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。
- 作業相關的名詞解釋
- Stage :一個Spark作業一般包含一到多個Stage。
- Task:一個stage包含一到多個task,通過多個task實現並行運行的功能。
- DAGScheduler:實現將spark作業分解成一到多個stage,每個stage根據RDD的partition個數決定task的個數,然後生成相應的task set放到taskScheduler中。
- TaskScheduler:實現task分配到executor上執行。
3、提交作業的兩種方式
- 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
作業執行流:
作業執行流程描述:
- 客戶端提交作業給Master
- master讓一個worker啓動driver,即schedulerbackend。worker創建一個driver runner線程,driver runner啓動schedulerbackend進程
- 另外master還會讓其餘worker啓動executor,即executorbackend。worker創建一個executor runner線程,executor runner會啓動executorbackend進程。
- executorbackend啓動後回想driver的schedulerbackend註冊。schedulerbackend進程中包含DAGScheduler,它會根據用戶程序,生成執行計劃,並調度執行。對於每個stage的task,都會被存放到task scheduler中,executorbackend向schedulerbackend彙報的時候把task scheduler中的task調度到executorbackend執行。
- 所有stage都完成後作業結束。
-
Driver運行在客戶端
直接執行Spark作業,作業運行命令如下:
./bin/run-example org.apache.spark.examples.SparkPi spark://host:port
作業執行流如圖所示:
作業執行流程描述:
- 客戶端啓動後直接運行用戶程序,啓動driver相關的工作:DAGScheduler和BlockManagerMaster等。
- 客戶端的Driver向Master註冊。
- Master還會讓Worker啓動Exeuctor。Worker創建一個ExecutorRunner線程,ExecutorRunner會啓動ExecutorBackend進程。
- ExecutorBackend啓動後會向Driver的SchedulerBackend註冊。Driver的DAGScheduler解析作業並生成相應的Stage,每個Stage包含的Task通過TaskScheduler分配給Executor執行。
- 所有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快?
- 基於內存計算,減少低效的磁盤交
- 高效的調度算法,基於DAG
- 容錯機制Linage,精華部分就是DAG和Lingae
8、.Spark技術棧有哪些組件,每個組件都有什麼功能,適合什麼應用場景?可以分別解釋下每個組件的功能和場景
- Spark core:是其它組件的基礎,spark的內核,主要包含:有向循環圖、RDD、Lingage、Cache、broadcast等,並封裝了底層通訊框架,是Spark的基礎。
- SparkStreaming是一個對實時數據流進行高通量、容錯處理的流式處理系統,可以對多種數據源(如Kdfka、Flume、Twitter、Zero和TCP
套接字)進行類似Map、Reduce和Join等複雜操作,將流式計算分解成一系列短小的批處理作業。 - Spark sql:Shark是SparkSQL的前身,Spark SQL的一個重要特點是其能夠統一處理關係表和RDD,使得開發人員可以輕鬆地使用SQL命令進行外部查詢,同時進行更復雜的數據分析
- BlinkDB :是一個用於在海量數據上運行交互式 SQL 查詢的大規模並行查詢引擎,它允許用戶通過權衡數據精度來提升查詢響應時間,其數據的精度被控制在允許的誤差範圍內。
- MLBase是Spark生態圈的一部分專注於機器學習,讓機器學習的門檻更低,讓一些可能並不瞭解機器學習的用戶也能方便地使用MLbase。MLBase分爲四部分:MLlib、MLI、ML Optimizer和MLRuntime。
- GraphX是Spark中用於圖和圖並行計算
9、廣播變量
廣播變量允許程序員將一個只讀的變量緩存在每臺機器上,而不用在任務之間傳遞變量。廣播變量可被用於有效地給每個節點一個大輸入數據集的副本。Spark還嘗試使用高效地廣播算法來分發變量,進而減少通信的開銷。 Spark的動作通過一系列的步驟執行,這些步驟由分佈式的洗牌操作分開。Spark自動地廣播每個步驟每個任務需要的通用數據。這些廣播數據被序列化地緩存,在運行任務之前被反序列化出來。這意味着當我們需要在多個階段的任務之間使用相同的數據,或者以反序列化形式緩存數據是十分重要的時候,顯式地創建廣播變量纔有用。
10、 累加器
累加器是僅僅被相關操作累加的變量,因此可以在並行中被有效地支持。它可以被用來實現計數器和總和。Spark原生地只支持數字類型的累加器,編程者可以添加新類型的支持。如果創建累加器時指定了名字,可以在Spark的UI界面看到。這有利於理解每個執行階段的進程。(對於python還不支持) 累加器通過對一個初始化了的變量v調用SparkContext.accumulator(v)來創建。在集羣上運行的任務可以通過add或者”+=”方法在累加器上進行累加操作。但是,它們不能讀取它的值。只有驅動程序能夠讀取它的值,通過累加器的value方法。