本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。
在阿帕奇星火關鍵主題
本節說明 Apache 星火的基本概念和關鍵主題,以及調整 AWS Glue Apache 星火效能的重要主題。在討論真實世界的調整策略之前,了解這些概念和主題非常重要。
架構
Spark 驅動程序主要負責將您的 Spark 應用程序拆分為可以在個人工作人員上完成的任務。星火驅動程序具有以下職責:
-
main()
在您的代碼中運行 -
產生執行計畫
-
配合叢集管理員來佈建 Spark 執行程式,以管理叢集上的資源
-
為 Spark 執行程序調度任務和請求任務
-
管理任務進度和復原
您可以使用SparkContext
物件與 Spark 驅動程式進行工作執行互動。
星火執行程序是用於保存數據和運行從 Spark 驅動程序傳遞的任務的工作。Spark 執行程序的數量將隨集群的大小而上下。
注意
星火執行程序具有多個插槽,以便多個任務 parallel 處理。Spark 預設為每個虛擬 CPU (vCPU) 核心支援一項工作。例如,如果執行程序有四個 CPU 內核,它可以運行四個並發任務。
彈性分散式資料
Spark 不存儲和跟踪跨 Spark 執行程序大型數據集的複雜工作。當您撰寫 Spark 工作的程式碼時,不需要考慮儲存的詳細資料。星火提供了彈性的分佈式數據集(RDD)抽象,這是可以在並行操作,並且可以跨集群的 Spark 執行器進行分區元素的集合。
下圖顯示了當 Python 腳本在其典型環境中運行以及在 Spark 框架(PySpark)中運行時如何將數據存儲在內存中的差異。
-
Python — 在 Python 腳本
val = [1,2,3...N]
中編寫將數據保留在運行代碼的單個機器上的內存中。 -
PySpark— Spark 提供 RDD 資料結構,以載入和處理分佈在多個 Spark 執行程式記憶體中的資料。您可以使用代碼生成 RDD
rdd = 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 的抽象轉換,而不是讓你與結果進行交互。火花不會對轉換採取行動,直到你調用一個動作。 -
動作 — 使用轉換,您可以建立邏輯轉換計劃。若要啟動計算,請執行諸如
write
、count
show
、或之類的動作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
) 的分散式處理的範例。下圖顯示了分佈式處理流程。
-
Spark 驅動程序創建跨許多 Spark 執行程序分佈式處理的執行計劃。
-
Spark 驅動程序根據執行計劃分配任務每個執行程序。根據預設,Spark 驅動程式會為每個 S3 物件 () 建立 RDD 分割區 (每個分割區都對應於 Spark 工作
Part1 ... N
)。然後 Spark 驅動程序將任務分配給每個執行人。 -
每個 Spark 任務都會下載其指派的 S3 物件,並將其存放在 RDD 分割區的記憶體中。通過這種方式,多個 Spark 執行程序下載並 parallel 處理其分配的任務。
如需有關初始分割區數目和最佳化的詳細資訊,請參閱平行化工作一節。
催化劑優化
在內部,Spark 使用稱為催化劑優化器
由於催化劑最佳化工具無法直接與 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 星火文件