本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。
Spark 結果片段快取
Amazon EMR 6.6.0 及更高版本包含選用的 Spark 結果片段快取功能,該功能會自動快取結果片段。這些結果片段是來自查詢子樹狀結構的部分結果,它們存放在您選擇的 Amazon S3 儲存貯體中。儲存的查詢結果片段會在後續的查詢執行中重複使用,進而加快查詢速度。
結果片段快取會分析您的 Spark 查詢,並在您指定的 S3 位置快取合格的結果片段。在後續的查詢執行中,系統會自動偵測並從 S3 擷取可使用的查詢結果片段。結果片段快取不同於結果集合快取,後者的後續查詢必須與原始查詢完全相符才能從快取傳回結果。當用於重複以您的資料之靜態子集為目標的查詢時,結果片段快取可大幅加快速度並提升效能。
考慮以下查詢,它會計算 2022 年前的訂單數量:
select l_returnflag, l_linestatus, count(*) as count_order from lineitem where l_shipdate <= current_date and year(l_shipdate) == '2022' group by l_returnflag, l_linestatus
隨著時間推移,此查詢需要每天執行以報告該年度的總銷售額。如果沒有結果片段快取,則需要每天重新計算一年中所有日期的結果。該查詢會隨時間變得越來越慢,並在年底時最慢,因為需要重新計算所有 365 天的結果。
當您啟用結果片段快取時,您將使用過去每天 (當年) 的快取結果。每天,該功能僅必須重新計算一天的結果。該功能對結果片段執行運算,然後快取相應片段。因此,啟用快取的查詢變得更快,它們在後續的每次查詢中保持不變。
啟用 Spark 結果片段快取
若要啟用 Spark 結果片段快取,請執行下列步驟:
-
在 Amazon S3 中建立快取儲存貯體,並為 EMRFS 授權讀取/寫入存取。如需詳細資訊,請參閱授權存取 Amazon S3 中的 EMRFS 資料。
-
設定 Amazon EMR Spark 組態以啟用該功能。
spark.subResultCache.enabled = true spark.subResultCache.fs.root.path = s3://&example-s3-bucket;/cache_dir/
-
啟用儲存貯體的 S3 生命週期管理,以自動清除快取檔案。
-
您可以選擇性設定 reductionRationThreshold 和 maxBufferSize 屬性,以進一步微調該功能。
spark.sql.subResultCache.reductionRatioThreshold spark.sql.subResultCache.maxBufferSize
使用結果片段快取時的考量
相較於重新運算,使用 Amazon S3 中原有快取結果所節約的成本會隨使用相同快取結果的次數而增加。若查詢使用大型資料表掃描,然後執行篩選或雜湊彙總以便將結果大小減至八分之一以下 (即輸入大小與結果之比至少為 8:1),它們將從此功能獲益最多。輸入和結果之間的減少比率越大,成本效益越高。如果查詢的減少比率較小,但包含資料表掃描和篩選或彙總之間的昂貴運算步驟,也將從中獲益,只要產生結果的成本大於從 Amazon S3 擷取結果的成本。依預設,只有在偵測到減少比率至少為 8:1 時,結果片段快取才會產生影響。
當您的查詢重複使用快取結果,此功能的優勢將最大限度得到體現。滾動和增量時段查詢是非常好的範例。例如,對於已執行 29 天的 30 天滾動時段查詢,它只需從其原始輸入來源提取 30 分之一的目標資料,並使用過去 29 天的快取結果片段。增量時段查詢的獲益更多,因為時段的起點是固定的:每次調用查詢時,處理的較小百分比要求從輸入來源讀取。
以下是使用結果片段快取時的其他考量事項:
-
不以具有相同查詢片段的相同資料為目標的查詢,其快取命中率較低,因此不會從此功能獲益。
-
對於具有低減少比率且不含昂貴運算步驟的查詢,快取結果的讀取成本與初始處理它們的成本大致相當。
-
由於寫入快取的成本,第一個查詢始終顯示輕微迴歸。
-
結果片段快取功能僅適用於 Parquet 檔案。不支援其他檔案格式。
-
結果片段快取功能緩衝區只會嘗試對 128 MB 或更大的檔案分割大小嘗試執行快取掃描。在使用預設的 Spark 組態時,如果掃描大小 (所有掃描檔案的大小總計) 除以執行器核心數量所得結果小於 128 MB,則結果片段快取將停用。當設定下列任一 Spark 組態時,檔案分割大小為:
min(maxPartitionBytes, max(openCostInBytes, scan size / minPartitionNum))
-
spark.sql.leafNodeDefaultParallelism (預設值為 spark.default.parallelism)
-
spark.sql.files.minPartitionNum (預設值為 spark.sql.leafNodeDefaultParallelism)
-
spark.sql.files.openCostInBytes
-
spark.sql.files.maxPartitionBytes
-
-
結果片段快取功能會以 RDD 分割區精細程度進行快取。針對每個 RDD 分割區,會使用前述預設為 8:1 的減少比率進行評估。每個 RDD 減少比率同時有大於和小於 8:1 之情形的工作負載,它們的效能提升不及每個 RDD 減少比率持續小於 8:1 的工作負載。
-
結果片段快取功能預設為每個要快取的 RDD 分割區使用 16 MB 的寫入緩衝區。若每個 RDD 分割區要快取的大小超過 16 MB,判斷寫入不可行的成本可能引發效能迴歸。
-
雖然依預設,結果片段快取不會嘗試快取減少比率小於 8:1 的 RDD 分割區結果,並且將其寫入緩衝區上限設為 16 MB,但可透過以下組態調整這兩個值。
spark.sql.subResultCache.reductionRatioThreshold (default: 8.0) spark.sql.subResultCache.maxBufferSize (default: 16MB, max: 64MB)
-
使用相同 Amazon EMR 版本的多個叢集可以共用相同的快取位置。為確定結果正確性,結果片段快取不會使用由不同 Amazon EMR 版本寫入的快取結果。
-
Spark 串流使用案例或使用 RecordServer、Apache Ranger 或 AWS Lake Formation 時,結果片段快取會自動停用。
-
結果片段快取讀取/寫入使用 EMRFS / S3A 和 Amazon S3 儲存貯體。支援 CSE (僅適用於 EMRFS)/ SSE S3/ SSE KMS 加密。針對內容,S3A 提供 Hadoop 實作,讓叢集讀取和寫入 Amazon S3 的資料。請注意,EMR-7.4.0 和更新版本支援 S3A。