回顧:spark編程模型幾個要素:driver program,輸入,transformation,action,緩存,共享變量
RDD :特性:分區,依賴,函數,分區策略(K,V),本地性策略
spark運行架構:
Job:包含多個Task組成的並行計算,由Spark action催生
Stage:Job的調動單位,對應於TaskSet
TaskSet:
Task:被送到某個executor的工作單元
DAGScheduler構建Stage
紀錄哪個RDD或者Stage輸出被物化--物化,計算結果複雜
重新提交shuffle輸出丟失的stage
將Taskset 傳給底層調度器
-spark-cluster taskcheduler
-yarn-cluster yarnclusetcheduler
-yarn-client yarnclientclustercheduler
taskScheduler:
爲每個taskset構建一個tasksetmanager實例管理這個taskset的生命週期
數據本地性決定每個task最佳位置(process-local,node-local,rock-local and then any)
提交taskset(一組task)到集羣運行並監控
推測執行,碰到straggle任務(卡住的任務)需要放到別的節點上重試
出現shuffle輸出lost要報告fetch failed錯誤
driver->executerbackend:
driver -> (觸發action runjob)sparkcontext->(提交job runjob)DAGScheduler ->(把stage劃分成task submittasks)
taskscheduler->(把task添加到隊列reviveOffers)schedulerBackend ->(調度task給指定的executer launchtask)executerbackend
executerbackend->driver:
1,任務執行成功status update -> schedulerBackend -(2,,任務執行成功status update ) ->taskScheduler
-(3,刪除task removeRunningTask)->TaskSet Manager...
兩種task:shuffleMaptask和resultTask,被執行的task多數都是shuffleMaptask
resultTask --finalStage 所對應任務,返回給driver的是運算結果本身
結果足夠小,則直接放在directorTaskResult對象內
超過特定尺寸(默認10MB)則在executor端會將directTaskResult先序列化,再把序列化結果作爲一個block存放在blockManager裏,
而後將blockManager返回的blockID放在indirectaskresult對象中返回給driver
shuffleMaptask,返回給DAGScheduler的是一個MapStatus對象,MapStatus對象管理了shuffleMapTask的運算輸出結果在shuffleblockManager
裏的相關存儲信息,而非結果本身,這些存儲位置信息將作爲下一個Stage的任務的獲取輸入數據的依據
shuffle的結果patition數目有shuffleDependcy 中的partitioner對象來決定
spark內核將提供一個可拔插的shuffle接口
更多細節:blockManager,AKKA(消息傳遞組件),NETTY(網絡IO組件)。。。
例子:
val lines=ssc.textfile(args(1))
val words=lines.flatMap(x=>[x.split("")])
wordCounts=words....
(多組)
hadoopRDD->MapperRDD(String)->FlatMapperRDD(String)->PairRDD->MapPartitionRDD-(一對多)-->ShuffleRDD->MapPartitionsRDD->PairRDDFunction
storm 流數據處理
解決方案:進程常駐運行,數據在內存中
常用流處理系統:storm,trlent,s4,spark streaming
storm 簡介
nimbus 資源分配和任務調度,把任務相關信息寫進zookeeper相應目錄
supervlsor 接受nimbus分配任務,啓動和停止屬於自己管理的worker進程
worker 運行具體處理組件邏輯的進程
executer 運行spout/bolt線程
task work中每個spout/bolt線程稱爲task
topology storm中運行的實時應用呈現,消息在各個組件間流動形成邏輯上拓撲結構
spout 在一個topology中產生源數據流的組件,主動
bolt 在以topology中接受數據然後執行處理的組件,被動
tuple 消息傳遞的單元
stream 源源不斷傳遞的tuple
stream grouping 消息的partition。。。shuffle,fields,hash
多語言編程:java,ruby,python,增加其他語言支持,增加一個簡單storm通信協議計科
容錯性,確保一個計算一直運行下棋
水平拓展:計算是在多個線程,進程和服務器之間並行進行的
快速
系統可靠性:建立在zookeeper上大量系統運行狀態的元信息都序列化在zk上