可以認為應用是多次批量計算組合起來的過程,在物理上可以表現為你寫的程式包+部署配置。應用的概念類似於計算機中的程式,它只是乙個藍本,尚沒有執行起來。——spark學習筆記三:spark原理介紹sparkcontext
spark最重要的api,使用者邏輯與spark集群主要的互動介面,它會和cluster master互動,包括向它申請計算資源等。
執行在worker上的executor程序負責執行task,並將結果返回給driver,同時為需要快取的rdd提供儲存功能。
彈性分布式資料集,唯讀分割槽記錄的集合,spark對所處理資料的基本抽象。spark中的計算可以簡單抽象為對rdd的建立、轉換和返回操作結果的過程:
轉換(transformation)
對已有的rdd中的資料執行計算進行轉換,而產生新的rdd,在這個過程中有時會產生中間rdd。spark對於transformation採用惰性計算機制,遇到transformation時並不會立即計算結果,而是要等遇到action時一起執行。
行動(action)
對已有的rdd中的資料執行計算產生結果,將結果返回driver程式或寫入到外部物理儲存。在action過程中同樣有可能生成中間rdd。
partition(分割槽)
乙個rdd在物理上被切分為多個partition,即資料分割槽,這些partition可以分布在不同的節點上。partition是spark計算任務的基本處理單位,決定了平行計算的粒度,而partition中的每一條record為基本處理物件。例如對某個rdd進行map操作,在具體執行時是由多個並行的task對各自分割槽的每一條記錄進行map對映。
dependency(依賴)
對rdd的transformation或action操作,讓rdd產生了父子依賴關係(事實上,transformation或action操作生成的中間rdd也存在依賴關係),這種依賴分為寬依賴和窄依賴兩種:
rdd的每次轉換都會生成乙個新的rdd,所以rdd之間就會形成類似於流水線一樣的前後依賴關係。在部分分割槽資料丟失時,spark可以通過這個依賴關係重新計算丟失的分割槽資料,而不是對rdd的所有分割槽進行重新計算。有一部分transformation或action會讓rdd產生寬依賴,這樣過程就像是將父rdd中所有分割槽的record進行了「洗牌」(shuffle),資料被打散重組,如屬於transformation操作的join,以及屬於action操作的reduce等,都會產生shuffle。——《spark技術內幕》-第3章-rdd實現詳解
乙個job中,以shuffle為邊界劃分出的不同階段。每個階段包含一組可以被序列執行的窄依賴或寬依賴操作:
使用者提交的計算任務是乙個由rdd構成的dag,如果rdd在轉換的時候需要做shuffle,那麼這個shuffle的過程就將這個dag分為了不同的階段(即stage)。由於shuffle的存在,不同的stage是不能平行計算的,因為後面stage的計算需要前面stage的shuffle的結果。在對job中的所有操作劃分stage時,一般會按照倒序進行,即從action開始,遇到窄依賴操作,則劃分到同乙個執行階段,遇到寬依賴操作,則劃分乙個新的執行階段,且新的階段為之前階段的parent,然後依次類推遞迴執行。child stage需要等待所有的parent stage執行完之後才可以執行,這時stage之間根據依賴關係構成了乙個大粒度的dag。——《spark技術內幕》-第4章-scheduler模組詳解
在乙個stage內,所有的操作以序列的pipeline的方式,由一組task完成計算。
對乙個stage之內的rdd進行序列操作的計算任務。每個stage由一組併發的task組成(即taskset),這些task的執行邏輯完全相同,只是作用於不同的partition。乙個stage的總task的個數由stage中最後的乙個rdd的partition的個數決定。
spark driver會根據資料所在的位置分配計算任務,即把所有task根據其partition所在的位置分配給相應的executor,以儘量減少資料的網路傳輸(這也就是所謂的移動資料不如移動計算)。乙個executor內同一時刻可以並行執行的task數由總cpu數/每個task占用的cpu數
決定,即spark.executor.cores / spark.task.cpus
。
task分為shufflemaptask和resulttask兩種,位於最後乙個stage的task為resulttask,其他階段的屬於shufflemaptask。
persist
checkpoint
呼叫rdd的checkpoint
方法,可以將rdd儲存到外部儲存中,如硬碟或hdfs。spark引入checkpoint機制,是因為持久化的rdd的資料有可能丟失或被替換,checkpoint可以在這時候發揮作用,避免重新計算。
建立checkpoint是在當前job完成後,由另外乙個專門的job完成:
也就是說需要checkpoint的rdd會被計算兩次。因此,在使用rdd.checkpoint()的時候,建議加上rdd.cache(),這樣第二次執行的job久不用再去計算該rdd了。乙個job在開始處理rdd的partition時,或者更準確點說,在executor中執行的任務在獲取partition資料時,會先判斷是否被持久化,在沒有命中時再判斷是否儲存了checkpoint,如果沒有讀取到則會重新計算該partition。——apache spark的設計與實現- cache和checkpoint功能
這裡借用@jerrylead的complexjob案例做一下分析:
object
complexjob
}
作者在這個例子中主要定義了乙個對rdd的union和join操作,主要的rdd之間的關係如下圖所示:
job的物理執行圖:
** - job 物理執行圖
參考作者畫的物理執行圖,我們可以觀察到:
這個job中有三個stage,partitionby操作對rdd重新分割槽產生了shuffle,是劃分stage0和stage1的邊界。join操作則是stage2和stage0的邊界。
每個stage的task總數等於該階段的最後乙個rdd的partition個數。
每個task都是序列執行乙個stage內的所有操作。
transformation操作的過程中會產生中間rdd。
《spark技術內幕:深入解析spark核心架構於實現原理》,張安站
apache spark的設計與實現 (強烈推薦)
spark學習筆記三:spark原理介紹
閱讀原文
spark 基本概念與入門
可以認為應用是多次批量計算組合起來的過程,在物理上可以表現為你寫的程式包 部署配置。應用的概念類似於計算機中的程式,它只是乙個藍本,尚沒有執行起來。spark學習筆記三 spark原理介紹 sparkcontext spark最重要的api,使用者邏輯與spark集群主要的互動介面,它會和clust...
Spark基本概念
下面是spark的乙個日誌計數示例,該程式演示了spark的計算模型 下面是spark執行時涉及的各元件的概況圖 從rdd轉換和儲存角度,使用者程式對rdd通過多個函式進行操作,將rdd進行轉換。block manager管理rdd的物理分割槽,每個block就是節點上對應的乙個資料塊,可以儲存在記...
Spark基本概念
a.driver programs通過sparkcontent物件訪問spark b.sparkcontent代表和乙個集群的鏈結 c.在shell中sparkcontent物件自動建立好了,就是sc 主要分為兩種 python shell和 scala shell 現在主要介紹scala shel...