Spark Core的知識碎片

yu_lu發表於2024-07-15

spark初識

什麼是spark?

  • Apache Spark 是一個開源叢集計算系統,旨在快速進行資料分析。
  • 既好寫執行時的也快

BDAS

BDAS 是由加利福尼亞大學伯克利分校的AMPLab開發的一套開源大資料分析工具集。其目的是為資料分析和機器學習提供高效、易用的工具。

  1. Spark

    • Spark 是 BDAS 的核心元件,是一個快速的、通用的大資料處理引擎。與 Hadoop MapReduce 相比,Spark 提供了一個更加靈活且高效的處理模型,支援批處理、互動式查詢、流處理以及圖計算等多種資料處理模式。
    • Spark的核心是 RDD(分散式彈性資料集),它允許使用者以容錯的方式在叢集上進行並行操作。
  2. Spark SQL

    Spark SQL 是 Spark 中用於結構化資料處理的模組。它提供了一個名為 DataFrame 的程式設計抽象,類似於關聯式資料庫中的表,可以使用 SQL 語句進行查詢和操作。

    • 統一的資料訪問介面:Spark SQL 支援從多種資料來源(如 Hive、Parquet、JSON、JDBC、ORC)讀取和處理資料,提供統一的介面來訪問不同格式的資料。
    • 與SQL的整合:使用者可以在 Spark SQL 中直接使用 SQL 語句進行資料查詢和操作,同時也可以透過 DataFrame API 進行程式設計,靈活結合兩者的優勢。
    • 效能最佳化:Spark SQL 使用 Catalyst 最佳化器進行查詢最佳化,透過一系列的規則和策略來生成高效的執行計劃。
    • Hive相容性:Spark SQL 與 Apache Hive 高度相容,支援 Hive 的後設資料儲存、序列化格式和 UDF(使用者自定義函式),可以在 Spark 上無縫執行 Hive 查詢。
  3. Spark Streaming

    Spark Streaming 是 Spark 的實時資料流處理擴充套件。它允許使用者從各種資料來源(如 Kafka、Flume、Twitter、HDFS)接收和處理實時資料流。

    • 微批處理架構:Spark Streaming 將實時資料流分成小批次(微批次),然後使用 Spark 核心 API 進行批處理。每個微批次的資料被視為一個 RDD,進行並行處理。
    • 易於程式設計:Spark Streaming 提供與 Spark 核心 API 類似的高層次 API,使用者可以使用熟悉的程式設計模式來開發實時資料處理應用。
    • 容錯性和彈性:Spark Streaming 內建容錯機制,可以自動從失敗中恢復,並支援動態擴充套件以處理變化的工作負載。
    • 與其他Spark元件整合:Spark Streaming 可以與 Spark SQL、MLlib 和 GraphX 無縫整合,允許使用者在流資料上執行復雜的資料處理、查詢和分析。
  4. MLlib

    MLlib 是 Spark 的機器學習庫,旨在提供可擴充套件的機器學習演算法和實用工具

    • 豐富的演算法:MLlib 包含各種常用的機器學習演算法。
    • 高效的分散式計算:MLlib 的演算法設計為在分散式環境中高效執行,能夠處理大規模資料集。
    • 易於使用:MLlib 提供簡單易用的 API,支援多種程式語言
    • 與其他Spark元件整合:MLlib 可以與 Spark SQL、Spark Streaming 和 GraphX 結合使用
  5. GraphX

    GraphX 是 Spark 的圖計算庫,支援圖平行計算和圖演算法。

為什麼Hadoop的共享資料慢,spark共享資料快

  1. Hadoop
    • 批處理模型:Hadoop 主要基於 MapReduce 批處理模型,每個任務都要從磁碟讀取資料並將中間結果寫回磁碟。由於頻繁的磁碟 I/O 操作,資料處理速度較慢。
    • 資料儲存在 HDFS:Hadoop 的資料儲存在分散式檔案系統(HDFS)上,資料讀取和寫入需要經過網路傳輸和磁碟 I/O,進一步增加了延遲。
  2. Spark
    • 記憶體計算模型:Spark 使用記憶體作為主要的資料處理和儲存介質,採用記憶體中的 RDD(Resilient Distributed Dataset)來進行資料操作。大部分計算都在記憶體中進行,減少了磁碟 I/O 的頻率。
    • 資料持久化選項:Spark 允許使用者將中間結果持久化在記憶體中,並在多個操作之間共享資料,從而大幅提升資料處理速度。

spark的四種執行模式

  1. 本地模式(Local Mode):以一個獨立的程序透過配合其內部的多個執行緒來模擬整個spark執行時的環境(開發與測試)

  2. Kubernetes模式(容器叢集):Spark 中的各個角色執行在Kubernetes的容器內部,並組成spark叢集環境。

  3. 叢集模式(Standalone Mode):spark中的各個角色以獨立程序的形式存在,並組成spark叢集環境。

  4. 整合模式(Cluster Mode):描述:Spark 與外部叢集管理器整合,執行在真正的分散式環境中。

    • YARN 模式:Spark中的各個角色執行在YARN的容器內部,並組成Spark叢集環境
    • Mesos 模式:Spark 與 Apache Mesos 整合,提供高效的資源隔離和共享,適合在多租戶環境中執行。

初識小結

Spark解決了什麼問題?

海量資料的計算,可以進行離線批處理以及實時流計算

Spark有哪些模組?

核心SparkCore、SQL計算(Spark SQL)、流計算(SparkStreming)、圖計算(GraphX)、機器學習(MLlib)

Spark特點有哪些?

速度快、簡單使用、通用性強、多種模式執行

Spark的執行模式?

  • 本地模式
  • 叢集模式(StandAlone、YRAN、K8S)
  • 雲模式

Spark的執行角色(對比YARN)?

  • Master:叢集資源管理(類同ResourceManger)
  • Worker:單機資源管理(類同與NodeManager)
  • Driver:單任務管理者(類同與ApplicationMaster)
  • Executor:單任務執行者(類同與YRAN容器內的Task)

Spark Core

spark Core

1、Spark作業執行的特點

  1. 只有遇到行動運算元的適合,整個spark作業才會被觸發執行
  2. 遇到幾次行動運算元,就執行幾次

2、RDD:彈性分散式資料集

  • 彈性:資料量可大可小

    RDD類似於容器,但是本身儲存的不是資料,是計算邏輯

    當遇到行動運算元的時候,整個spark作業才會被觸發執行,是從第一個RDD開始執行,資料才開始產生流動

    資料在RDD之間只是流動關係,不會儲存

    流動的資料量可以很大,也可以很小,所以稱為彈性

  • 分散式:

    spark本質上它是需要從HDFS中讀取資料的,HDFS是分散式,資料block塊將來可能會在不同的datanode上

    RDD中流動的資料,可能會來自不同的datanode中的block塊資料

  • 資料集:

    計算流動過程中,可以短暫地將RDD看成一個容器,容器中有資料,預設情況下在記憶體中不會進行儲存

    可以將RDD的資料資料儲存到磁碟中

3、RDD的五大特性!!!

  1. RDD是由一系列分割槽構成

    • 讀檔案時的minPartitions引數只能決定最小分割槽數,實際讀取檔案後的RDD分割槽數,由資料內容本身以及叢集的分佈來共同決定的
    • 若設定minPartitions的大小比block數量還少的話,實際上以block塊數量來決定分割槽數
    • 產生shuffle的運算元呼叫時,可以傳入numPartitions,實際真正改變RDD的分割槽數,設定多少,最終RDD就多多少分割槽
  2. 運算元是作用在每一個分割槽上的

  3. RDD與RDD之間存在一些依賴關係

    • 窄依賴 前一個RDD中的某一個分割槽資料只會到後一個RDD中的某一個分割槽 一對一的關係

    • 寬依賴 前一個RDD中的某一個分割槽資料會進入到後一個RDD中的不同分割槽中 一對多的關係 也可以透過檢視是否產生shuffle來判斷

    • 整個spark作業會被寬依賴的個數劃分若干個stage,Num(stage) = Num(寬依賴) +1

    • 當遇到產生shuffle的運算元的時候,涉及到從前一個RDD寫資料到磁碟中,從子盤中讀取資料到後一個RDD的現象,

      注意:第一次觸發執行的時候,磁碟是沒有資料的,所以會從第一個RDD產生開始執行,當重複觸發相同的執行的時候,對於同一個DAG有向無環圖而言,會直接從shuffle之後的RDD開始執行,可以直接從磁碟讀取資料。

    • 一個階段中,RDD有幾個分割槽,就會有幾個並行task任務

  4. kv運算元只能作用在kv的RDD上

  5. spark會提供最優的任務計算方式,只移動計算,不移動資料(優先從有資料的地方產生RDD)

4、map操作運算元

將RDD中的資料依次取出,傳遞給後面的函式邏輯,將計算後的資料返回到新的RDD中

將RDD中的資料依次取出,處理完的資料返回下一個RDD直接繼續執行後續的邏輯

5、filter操作運算元

將rdd中的資料依次取出,傳遞給後面的函式,跟map一樣,也是依次傳遞一條

6、flatMap操作算組

將rdd中的資料每一條資料傳遞給後面的函式,最終將返回的陣列或者是序列進行扁平化,返回給新的集合

7、sample抽樣

withReplacement = false, fraction = n

n表示你要抽取多少比例

這個函式主要在機器學習中遇到

8、groupBy運算元的使用

1、gourpBy的運算元,後面的分組條件是我們自己指定的

2、spark中的groupBy之後的,所有值會被封裝到一個Iterable迭代器中儲存

9、groupByKey運算元

GroupByKey屬於kv格式的運算元,只能作用在kv格式的RDD上,也就是說只有kv格式的RDD才能呼叫kv格式的運算元。

sprak core中 groupBy運算元與groupByKey運算元的區別!!!?

  1. groupBy的分組條件可以自己指定,並且絕大部分的RDD都可以呼叫該運算元,返回的是鍵和元素本身組成的迭代器構成的kv格式RDD。

    groupByKey運算元,只能由kv格式的RDD進行呼叫,分組的條件會自動根據鍵進行分組,不需要再自己指定,返回值是鍵和值組成的迭代器構成的kv格式RDD

  2. 執行shuffle資料量來看。

    groupBy產生的shuffle資料量再一定程度上要大於groupByKey產生的shuffle資料量,所以groupByKey運算元的執行效率要比groupBy運算元的執行效率要高。

10、reduceByKey運算元

reduceByKey與groupByKey的區別!!!?

  • 相同點

    他們都是kv格式的運算元,只有kv格式的RDD才能呼叫

  • 不同點

    • groupByKey只能是單純地根據鍵進行分組,分組後的邏輯可以再後續的處理中呼叫其他的運算元實現
    • reduceByKey相當於MR中的預聚合,所以shuffle產生的資料量要比groupByKey中shuffle產生的資料量少,效率高,速度要快一些
    • groupByKey的靈活度要比reduceByKey的靈活度高,reduceByKey無法做一些複雜的操作,比如求方差。但是groupByKey可以在分組之後的RDD進行方差操作。

11、Union運算元

parallelize:將scala的集合變成spark中的RDD

兩個RDD想要進行union合併,必須保證元素的格式和資料型別是一致的

分割槽數也會進行合併,最終的分割槽數由兩個RDD總共的分割槽數決定

12、join運算元

join 內連線

right join右連線

left join 左連線

full join 全連線

13、MapValues運算元

mapValues運算元也是作用在kv格式的RDD上

將每個元素的值傳遞給後面的函式,進行處理得到新的值,鍵不變,這個處理後的組合重新返回到新的RDD中

14、mapPartitionBy運算元

mapPartitions:一次處理一個分割槽中的資料

它與map的區別在於,map是每次處理一條資料就返回一條資料到下一個RDD而mapPartitions一次處理一個分割槽的資料,處理完在返回

最後處理的效果和map是一樣的

mapPartitions可以最佳化與資料庫連線的次數

15、sortBy排序

可以根據條件進行排序

16、foreach行動運算元

行動運算元,就可以觸發一次作業執行,有幾次行動運算元呼叫,就會觸發幾次

rdd是懶載入的性質

17、collect

collect將rdd轉成合適的scala中的資料結構,在使用collect之後foreach就是scala中的foreach,不會產生作業執行的

18、Cahce

快取的目的是為了spark core作業執行的時候,縮短rdd的執行鏈,能夠更快的得到結果

快取的實現方式:

1、需要快取的rdd呼叫cache函式

2、persist(StorageLevel.xxx)修改快取級別

19、checkPoint

永久將執行過程中RDD中的流動的資料儲存到磁碟中(hdfs)中

需要設定 checkpoint的路徑,統一設定的

checkpoint也相當於一個行動運算元,觸發作業執行

第二次DAG有向無環圖執行的時候,直接從最後一個有檢查點的rdd開始向下執行

checkpoint和cache的區別!!!?

  • cache是將一個複雜的RDD做快取,將來執行的時候,只是這個rdd會從快取中取(當計算邏輯很複雜,消耗效能,使用快取)
  • checkpoint是永久將rdd資料持久化,將來執行的時候,直接從檢查點的rdd往後執行(當資料量很大,計算邏輯不復雜使用checkpoint)

寫spark core程式的注意事項

1、RDD中無法巢狀使用RDD

2、RDD中無法是使用SparkContext

廣播變數

使用SparkContext中的一個功能,將Driver端的變數廣播到executor執行的節點上的blockManager中

為什麼需要廣播變數?

變數在Rriver端,也隨著task任務一併傳送到executor中執行,後期隨著變數的資料量變大,也就意味著,每次傳送任務,附帶的資料量就會很大,無形之中,降低的執行速度。

standlone 模式 &yarn 模式

  • client模式 本地提交執行
  • cluster模式 本地叢集提交執行

spark yarn client模式提交作業,好處是可以在提交的節點上能夠看到詳細的執行日誌以及執行結果,不好的是,每次提交會在提交節點上啟動一個driver,將來如果很多作業都需要提交執行,都以client模式提交的話,客戶端會產生很多的driver,容易導致客戶端壓力過大崩潰,就會導致作業無法提交執行。

client模式一般是用於上線之前測試,當client模式透過沒有問題的話,後續會使用yarn cluster模式進行提交。

spark yarn cluster模式相較於client模式而言,不會在提交作業的節點上產生Driver程序,而是選擇一個相對空閒的子節點啟動ApplicationMaster,這裡的ApplicationMaster相當於一個Driver這樣的話,就減輕了客戶端的壓力,可以提交更多的spark作業

提交作業的節點與Driver的啟動節點不是同一個的,就會導致我們無法在提交·作業的節點上看到日誌,如果是yarn cluster模式提交的話,我們只能夠透過yarn logs -applicationld的命令檢視yarn的作業日誌來看到執行結果

上傳到hdfs路徑上

如果是打包到叢集的話,這裡的路徑就是hdfs路徑

如果是local的話,這裡路徑就是我們windows

Spark 任務排程

重試機制

  1. 正常情況下,task任務傳送完畢,也執行結束,對應的程序會一次關閉釋放
  2. 如果遇到失敗的情況:
    • task任務執行失敗(網路,許可權,外界條件導致的),會觸發重試機制,首先task Schedluer重試了三次之後,任務還是失敗的,就會由前一個DAG Scheduler重新傳送taskSet,重試了4次;若這兩個物件都重試了之後,任務還是失敗的,那麼整個job作業就會報錯
    • 如果遇到shuffle過程中,由於shuffle的小檔案丟失了,導致任務失敗,task Scheduler不會觸發重試的,就會由DAG Scheduler重新規劃taskSet,重新傳送任務執行

推測執行機制

當某一個executor中 的任務數過多的時候,就右可能會導致某個任務執行十分緩慢或者失敗,那麼spark提供了推測執行的機制,講緩慢執行的任務複製到其他相對空閒的且同屬於一個spark作業的executor中執行,只要有一個executor中的該任務執行成功,就以這個任務的結果為準。

spark作業提交可能會用到的一些引數

--num-executors 所提供的executor個數

--executor-cores 每一個executor的核數

--executor-memory 每一個execuotr的記憶體

--total-executor-cores(代替num-executors 和 executor-cores)

為什麼說spark執行的要比mr快

  1. MR屬於細粒度資源排程
    • MR中的map任務或者reduce任務,到要執行的時候,才會想yarn申請資源
    • 任務的執行速度整體會變慢 --> Job作業執行速度變慢
    • 優點:不會造成資源浪費
    • 缺點:速度慢
  2. Spark屬於粗粒度資源排程
    • spark會在任務排程之前,先將所有的需要的資源先申請下來,然後再將task任務傳送到執行
    • 優點:速度快,執行過程中無需再次申請資源
    • 缺點:有可能申請的資源不夠,導致任務執行失敗;也有可能申請的資源過多,再spark作業執行期間不會釋放,造成資源浪費。

Spark累加器

在Apache Spark中,累加器(Accumulator)是一種可以在叢集計算過程中對共享變數進行“加”操作的機制。這種機制使得累加器可以被多個任務(task)安全地更新,從而在分散式計算環境中實現高效的全域性聚合。

累加器的特點:

  1. 只支援累加操作:累加器只支援累加(add)操作,不能進行讀取和其他操作。這種設計確保了累加器的操作是冪等的(Idempotent),即多次執行相同的操作不會改變最終結果。
  2. 驅動程式端訪問:雖然任務(task)可以更新累加器的值,但只有驅動程式(Driver Program)能夠讀取累加器的最終值。這是為了防止在分散式環境中讀取不一致的中間值。
  3. 用於除錯和監控:累加器經常用於除錯和監控,因為它們可以收集任務執行過程中的一些統計資訊,如處理的資料量、錯誤計數等。

相關文章