Spark 結果片段快取 - Amazon EMR

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

Spark 結果片段快取

Amazon EMR 6.6.0 及更高版本包含選用的 Spark 結果片段快取功能,可自動快取結果片段。這些結果片段是來自查詢子樹狀結構的部分結果,它們存放在您選擇的 Amazon S3 儲存貯體中。儲存的查詢結果片段會在後續的查詢執行中重複使用,進而加快查詢速度。

結果片段快取會分析您的 Spark SQL 查詢,並在指定的 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 結果片段快取,請執行下列步驟:

  1. 在 Amazon S3 中建立快取儲存貯體,並授權的讀取/寫入存取權EMRFS。如需詳細資訊,請參閱 授權存取 Amazon S3 中的EMRFS資料

  2. 設置 Amazon EMR 星火配置以啟用該功能。

    spark.subResultCache.enabled = true spark.subResultCache.fs.root.path = s3://DOC-EXAMPLE-BUCKET/cache_dir/
  3. 啟用儲存貯體的 S3 生命週期管理,以自動清除快取檔案。

  4. (可選) 規劃 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. leafNodeDefault並行性(默認值是閃光 .default.並行性)

    • 閃耀 .sql 文件。 minPartitionNum (預設值為 spark.sql。 leafNodeDefault平行性)

    • 閃耀 .sql 文件。 openCostIn位元組

    • 閃耀 .sql 文件。 maxPartitionBytes

  • 結果片段快取功能會以RDD分割區粒度快取。先前描述的預設為 8:1 的減少比率是每個RDD分割區的評估。與每RDD減少比率持續低於 8:1 的工作負載相比,每減少比率持續RDD低於 8:1 的工作負載可能會看到更小的效能優勢。

  • 「結果片段快取」功能預設會針對快取的每個RDD分割區使用 16MB 的寫入緩衝區。如果每個RDD分割區快取超過 16mb,則判斷無法寫入的成本可能會導致效能迴歸。

  • 雖然在預設情況下,結果片段快取不會嘗試快取縮減比率小於 8:1 的RDD分割區結果,而且會將寫入緩衝區限制為 16MB,但這兩個值都可以透過下列組態調整:

    spark.sql.subResultCache.reductionRatioThreshold (default: 8.0) spark.sql.subResultCache.maxBufferSize (default: 16MB, max: 64MB)
  • 使用相同 Amazon EMR 版本的多個叢集可以共用相同的快取位置。為了確保結果的正確性,結果片段快取不會使用 Amazon 不同版本所寫入的快取結果。EMR

  • Spark 串流使用案例或使用 Apache Ranger 時 RecordServer,結果片段快取會自動 AWS Lake Formation 停用。

  • 結果片段快取讀取/寫入使用EMRFS和 Amazon S3 儲存貯體。CSE/SSES3/ SSE KMS 加密支持。