在阿帕奇星火關鍵主題 -

本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。

在阿帕奇星火關鍵主題

本節說明 Apache 星火的基本概念和關鍵主題,以及調整 AWS Glue Apache 星火效能的重要主題。在討論真實世界的調整策略之前,了解這些概念和主題非常重要。

架構

Spark 驅動程序主要負責將您的 Spark 應用程序拆分為可以在個人工作人員上完成的任務。星火驅動程序具有以下職責:

  • main()在您的代碼中運行

  • 產生執行計畫

  • 配合叢集管理員來佈建 Spark 執行程式,以管理叢集上的資源

  • 為 Spark 執行程序調度任務和請求任務

  • 管理任務進度和復原

您可以使用SparkContext物件與 Spark 驅動程式進行工作執行互動。

星火執行程序是用於保存數據和運行從 Spark 驅動程序傳遞的任務的工作。Spark 執行程序的數量將隨集群的大小而上下。

Spark 驅動程序,集群管理器和工作節點與工作節點的工作節點連接在工作節點中。
注意

星火執行程序具有多個插槽,以便多個任務 parallel 處理。Spark 預設為每個虛擬 CPU (vCPU) 核心支援一項工作。例如,如果執行程序有四個 CPU 內核,它可以運行四個並發任務。

彈性分散式資料

Spark 不存儲和跟踪跨 Spark 執行程序大型數據集的複雜工作。當您撰寫 Spark 工作的程式碼時,不需要考慮儲存的詳細資料。星火提供了彈性的分佈式數據集(RDD)抽象,這是可以在並行操作,並且可以跨集群的 Spark 執行器進行分區元素的集合。

下圖顯示了當 Python 腳本在其典型環境中運行以及在 Spark 框架(PySpark)中運行時如何將數據存儲在內存中的差異。

Python VAL [1,2,3 N], 阿帕奇星火 RDD = 平行化 [1,2,3 N].
  • Python — 在 Python 腳本val = [1,2,3...N]中編寫將數據保留在運行代碼的單個機器上的內存中。

  • PySpark— Spark 提供 RDD 資料結構,以載入和處理分佈在多個 Spark 執行程式記憶體中的資料。您可以使用代碼生成 RDDrdd = sc.parallelize[1,2,3...N],Spark 可以在多個 Spark 執行程序中自動分發和保存內存中的數據。

    在許多 AWS Glue 工作中,您使用 RDD 通過 AWS Glue DynamicFrames和火花。DataFrames這些是抽象,允許您在 RDD 中定義數據的模式,並使用該附加信息執行更高級別的任務。因為它們在內部使用 RDD,因此資料會透明地分散並載入到下列程式碼中的多個節點:

    • DynamicFrame

      dyf= glueContext.create_dynamic_frame.from_options( 's3', {"paths": [ "s3://<YourBucket>/<Prefix>/"]}, format="parquet", transformation_ctx="dyf" )
    • DataFrame

      df = spark.read.format("parquet") .load("s3://<YourBucket>/<Prefix>")

一個 RDD 具有以下特點:

  • RDD 由分成多個部分的數據組成,稱為分區。每個 Spark 執行程序存儲在內存中的一個或多個分區,並且數據分佈在多個執行程序。

  • RDD 是不可的,這意味著它們在創建之後不能更改。若要變更 DataFrame,您可以使用轉換,這些變形在下一節中定義。

  • RDD 會跨可用節點複寫資料,以便自動從節點故障中復原。

懶惰評價

RDD 支援兩種類型的作業:轉換 (從現有資料集建立新資料集),以及動作 (在資料集上執行計算後,將值傳回給驅動程式的驅動程式)。

  • 轉換 — 由於 RDD 是不可變的,因此您只能使用轉換來變更它們。

    例如,map是一種轉換,會透過函數傳遞每個資料集元素,並傳回代表結果的新 RDD。請注意,該map方法不返回輸出。Spark 存儲 future 的抽象轉換,而不是讓你與結果進行交互。火花不會對轉換採取行動,直到你調用一個動作。

  • 動作 — 使用轉換,您可以建立邏輯轉換計劃。若要啟動計算,請執行諸如writecountshow、或之類的動作collect

    Spark 中的所有轉換都是懶惰的,因為它們不會立即計算結果。相反地,Spark 會記住套用至某些基本資料集的一系列轉換,例如亞馬遜簡單儲存服務 (Amazon S3) 物件。只有當動作需要將結果傳回給驅動程式時,才會計算轉換。這種設計使 Spark 能夠更有效地運行。例如,假設透過map轉換建立的資料集只會被大幅減少資料列數目的轉換所使用的情況,例如reduce。然後,您可以將經過兩種轉換的較小數據集傳遞給驅動程序,而不是傳遞較大的映射數據集。

星火應用術語

本節涵蓋 Spark 應用程式術語。Spark 驅動程序創建一個執行計劃,並在幾個抽象控制應用程序的行為。下列術語對於使用 Spark UI 進行開發、偵錯和效能調整非常重要。

  • 應用程式 — 以 Spark 工作階段 (Spark 內容) 為基礎。由唯一的 ID 識別,例如<application_XXX>

  • 工作 — 根據針對 RDD 建立的動作。工作由一個或多個階段組成。

  • 階段 — 根據為 RDD 建立的隨機播放。階段由一個或多個任務組成。隨機播放是 Spark 的機制,用於重新分配數據,以便它在 RDD 分區之間以不同的方式進行分組。某些轉換,例如join(),需要隨機播放。隨機播放會在「最佳化隨機播放」調整實務中更詳細地討論。

  • 務-任務是 Spark 安排的最小處理單位。任務是為每個 RDD 分區創建的,任務數是階段中同時執行的最大數量。

包含工作、階段、隨機播放和工作的執行計畫。
注意

工作是最佳化平行性時最重要的事情。任務的數量與 RDD 的數量擴展

平行處理

星火並行處理任務,用於加載和轉換數據。

假設您在 Amazon S3 上執行存取日誌檔 (命名accesslog1 ... accesslogN) 的分散式處理的範例。下圖顯示了分佈式處理流程。

""
  1. Spark 驅動程序創建跨許多 Spark 執行程序分佈式處理的執行計劃。

  2. Spark 驅動程序根據執行計劃分配任務每個執行程序。根據預設,Spark 驅動程式會為每個 S3 物件 () 建立 RDD 分割區 (每個分割區都對應於 Spark 工作Part1 ... N)。然後 Spark 驅動程序將任務分配給每個執行人。

  3. 每個 Spark 任務都會下載其指派的 S3 物件,並將其存放在 RDD 分割區的記憶體中。通過這種方式,多個 Spark 執行程序下載並 parallel 處理其分配的任務。

如需有關初始分割區數目和最佳化的詳細資訊,請參閱平行化工作一節。

催化劑優化

在內部,Spark 使用稱為催化劑優化器的引擎來優化執行計劃。催化劑有一個查詢最佳化工具,您可以在執行高階 Spark API 時使用DataFrame,例如 Spark SQL 和資料集,如下圖所述。

邏輯計劃通過催化劑優化器,該優化器輸出發送到 RDD 的優化計劃。

由於催化劑最佳化工具無法直接與 RDD API 搭配使用,因此高階 API 通常會比低階 RDD API 快。對於複雜的聯結,Catalyst 最佳化工具可以透過最佳化工作執行計劃來顯著改善效能 您可以在 Spark UI 的 SQL 選項卡上查看 Spark 任務的優化計劃。

自適應查詢執行

催化劑優化器通過稱為自適應查詢執行過程執行運行時優化。調適性查詢執行會使用執行階段統計資料,在工作執行時重新最佳化查詢的執行計畫。調適性查詢執行提供多種效能挑戰的解決方案,包括合併隨機後分割區、將排序合併聯結轉換為廣播聯結,以及傾斜聯結最佳化,如下列各節所述。

自適應查詢執行在 AWS Glue 3.0 及更高版本中可用,並且在 AWS Glue 4.0(Spark 3.3.0)及更高版本中默認啟用。自適應查詢執行可以通過在代碼spark.conf.set("spark.sql.adaptive.enabled", "true")中使用打開和關閉。

合併後隨機分割區

此功能會根據輸出統計資料,減少每次隨機播放後的 RDD 分割區 (合併)。map它簡化了運行查詢時洗牌分區號的調整。您不需要設置隨機分區編號來適合您的數據集。Spark 可以在您有足夠大的初始分區數量足夠大後,在運行時選擇適當的隨機分區號。

合併後隨機分割區會spark.sql.adaptive.coalescePartitions.enabled在兩者皆啟用spark.sql.adaptive.enabled且設定為 true 時。如需詳細資訊,請參閱 Apache 星火文件

將排序合併聯結轉換為廣播加入

此功能可識別您何時加入兩個大小不同的資料集,並根據該資訊採用更有效率的聯結演算法。如需詳細資訊,請參閱 Apache 星火文件。聯結策略將在「最佳化洗牌」一節中討論。

傾斜加入最佳化

資料偏斜是 Spark 工作最常見的瓶頸之一。它描述了數據傾斜到特定的 RDD 分區(因此,特定的任務),這會延遲應用程序的整體處理時間的情況。這通常會降低聯結作業的效能。歪斜連接優化功能通過將傾斜任務拆分(並在需要時複製)為大致均勻大小的任務來動態處理排序合併聯接中的歪斜。

此功能在設定spark.sql.adaptive.skewJoin.enabled為 true 時啟用。如需詳細資訊,請參閱 Apache 星火文件。資料偏斜會在「最佳化洗牌」一節中進一步討論。