Spark書籍筆記

2022-09-14 03:51:11 字數 3440 閱讀 7222

1)mapreduce

程式設計模型表達能力弱,只有map和reduce(map-shuffle-reduce)、難以實現複雜的資料操作

處理流程固定,難以實現迭代式計算

資料基於磁碟進行傳遞,效率較低

2)spark

抽象出rdd的資料結構,dag圖組合資料處理操作,表達能力強

靈活的資料結構和依賴關係

自動並行化執行,開發人員僅編寫普通程式即可

缺點:

單向操作,中間資料不可修改

粗粒度,每個分割槽操作不可以不同,只能最後聚合到一起操作

使用者層:《輸入資料,使用者**,配置引數》

分布式資料並行處理層:將使用者提交的應用轉化為較小的計算任務,然後通過呼叫底層的資源管理與任務排程層實現並行執行

資源管理與任務排程層:將使用者提交的應用及其任務按照一定的策略進行排程執行

物理執行層:負責啟動任務,執行每個任務的資料處理步驟

master:負責管理應用和任務

worker:負責執行任務

spark driver:驅動程式,執行應用的main函式產生的程序

executor:執行器,計算資源的乙個單位,物理上是乙個jvm程序

task:計算任務,會將應用拆分成多個task分配給executor執行

區別:子rdd的各個分割槽是否完全依賴父rdd的乙個或多個分割槽(父rdd中的某個分割槽資料是否被拆開輸出)

水平劃分:按照record的索引進行劃分

hash劃分:按照record的hash值對資料劃分

range劃分:按照元素的大小關係劃分,比如1-100的數字,先將上邊界和下邊界劃分為若干份,再將每個數字劃分到對應分割槽,最後對分割槽進行排序

每個action操作生成乙個job

從最後的rdd向前回溯,遇到窄依賴繼續回溯,遇到寬依賴就停止並將已經回溯的所有rdd按照依賴關係建立乙個執行階段

根據stage的最後乙個rdd的分割槽個數決定生成的task數量

shufflewrite

map輸出 -> 資料聚合 -> 資料排序 -> 分割槽 -> 輸出

shuffleread

資料獲取 -> 資料聚合 -> 資料排序 -> 輸出

shufflewrite

bypassmergesortshufflewrite:不需要聚合排序的情況,直接計算partitionid(pid),先輸出到buffer中(因為map輸出的速度很快需要緩衝),填滿就溢寫到磁碟的分割槽檔案中

優點:速度很快

缺點:每個分割槽都需要乙個buffer(預設32k),適合分割槽數較少的情況

sortshufflewrite:不需要聚合但需要排序的情況,建立乙個類似array的結構存放資料,按照資料的key+pid進行排序,最後將所有寫入到乙個檔案中,通過建立索引來標示分割槽,array存不下就會擴容,如果還存不下就溢寫到磁碟中,最終進行全域性排序(spark還沒有提供這種資料操作,但不排除使用者會自定義)

優點:只需要乙個array結構就可以將key+pid進行排序,只需乙個分割槽檔案進行儲存

缺點:排序增加時延

優點:只需要乙個hashmap結構就可以將map端進行聚合,也適用於分割槽數大的情況,聚合後使用array排序滿足不同排序需求

缺點:記憶體中聚合,記憶體消耗較大,最後還需全域性聚合

shuffleread

同上,不包括分割槽操作

只支援record新增和對value更新的hashmap,只用陣列存放元素,根據hash值確定位置,發生衝突時,使用二次位址探測法解決

如果利用率達到70%擴張一倍,之前的hash失效,需要進行重hash排列key的位置,但只能使用記憶體

記憶體+磁碟,可全域性聚合。

同上,只是排序根據partitionid+key

partitionedpairbuffer

本質上是乙個基於記憶體+磁碟的array,隨資料不斷新增擴容,當達到記憶體限制時,將資料按照partitionid或partitionid+key進行排序,然後溢寫到磁碟上,最終進行全域性排序

mapreduce是嚴格按照key排序的,並且在此階段只能排序不能聚合,所以要等到資料都溢寫到磁碟之後再啟動乙個專門的聚合階段。

快取資料,避免重複計算,提高讀取和計算速度,是一種空間換時間的思想

會被重複使用的資料、資料不宜過大、非重複快取的資料(已經快取過的資料的血緣關係)

lru(最近最久未使用)策略,利用了linkedhashmap自帶的lru演算法

mapreduce的distributedcache快取機制不是用於存放job執行的中間結果的,而是用於快取job執行所需檔案的。並且將快取的資料放在每個worker的本地磁碟而不是記憶體中

spark快取機制缺點:快取的rdd資料是唯讀的,不能修改。不能根據rdd的生命週期進行自動快取替換

通過重新執行計算來容忍錯誤

通過checkpoint機制,對重要的輸入/輸出以及中間資料進行持久化,可提高重新計算的效率

需要checkpoint的資料:rdd的資料依賴關係比較複雜計算代價較高,比如關聯的資料較多、計算鏈過長、被多次重複利用等

時機以及計算順序:如果每計算出rdd就將其持久化效率太低,所以spark將使用者設定的checkpoint的rdd啟動額外的job再計算一次,會多乙個job任務,spark推薦使用者先進行快取,這樣只需將快取的資料進行checkpoint即可

目的不同:checkpoint目的是在job失敗後能快速回覆計算,快取的目的是加速計算

儲存方式不同:checkpoint為了可靠一般儲存在分布式檔案系統中,而快取為了加速計算主要使用記憶體,偶爾使用磁碟

寫入速度不同:checkpoint啟動專門的job寫到磁碟速度慢,快取寫入速度快

對lineage(血緣關係)影響不同:checkpoint因為已經可靠儲存不需要再儲存該rdd的lineage,快取對lineage沒有影響

應用場景不同:checkpoint應用於rdd重新計算代價較大的場景,快取應用於rdd被多次使用且占用空間不大的場景

將記憶體換分成三個分割槽:資料快取空間、框架執行空間、使用者**空間,且為前兩個設定了初始比例並可以根據執行過程動態調整。

系統保留空間:使用較小的空間儲存spark儲存產生的物件,預設300m

使用者**空間:使用者**生成的物件空間,預設約為40%

框架記憶體空間:包括框架執行空間和資料快取空間

存放的資料:rdd快取資料、廣播資料、task的執行結果

資料快取空間最主要的是儲存rdd的快取資料,剩下兩種採用記憶體+磁碟進行儲存,記憶體不足時放入磁碟

面試書籍筆記

面試的書籍主要是參考 王道程式設計師求職寶典 這本書來複習的,這本書列出了很多零散的知識點,還是蠻值得一看的。標準庫提供的字串處理函式 1.strlen s 2.strcmp s1,s2 3.strcat s1,s2 4.strcpy s1,s2 5.strncat s1,s2,n 6.strncp...

Spark學習筆記(一) spark簡介

spark是基於記憶體計算的大資料平行計算框架。09年誕生於加州大學伯克利分校amplab.spark是mapreduce的替代方案,相容hdfs hive等分布式儲存層,可融入hadoop的生態系統,以彌補mapreduce的不足。其主要優勢如下 中間結果輸出 可以將多stage的任務串聯或者並行...

spark 學習筆記

最近使用spark簡單的處理一些實際中的場景,感覺簡單實用,就記錄下來了。部門使用者業績表 1000w測試資料 使用者 部門 業績 資料載入 val context new sparkcontext conf var data context.textfile data.txt 場景1 求每個部門的...