通過使用壓實維護表 - AWS 規定指引

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

通過使用壓實維護表

Iceberg 包含的功能可讓您在將資料寫入資料表後執行資料表維護作業。某些維護作業著重於簡化中繼資料檔案,而其他維護作業則會增強資料在檔案中叢集的方式,以便查詢引擎能夠有效率地找到必要的資訊,以回應使用者要求。本節著重於與緊湊相關的最佳化。

冰山壓實

在冰山,您可以使用壓實來執行四個任務:

  • 將小型檔案合併為大小通常超過 100 MB 的大型檔案。這種技術被稱為垃圾箱包裝

  • 合併刪除文件與數據文件。刪除文件是由使用該 merge-on-read 方法的更新或刪除生成的。

  • (重新)按照查詢模式對數據進行排序。無需任何排序順序,也可以使用適合寫入和更新的排序順序來寫入資料。

  • 使用空間填充曲線對資料進行叢集,以針對不同的查詢模式進行最佳化,尤其是 z 順序排序。

上 AWS,您可以通過 Amazon 雅典娜或使用 Spark 在亞馬遜 EMR 或運行冰山表壓實和維護操作。 AWS Glue

當您使用 rewrite_data_files 程序執行壓縮時,您可以調整數個旋鈕來控制壓縮行為。下圖顯示垃圾桶裝箱的預設行為。了解 bin 打包壓縮是理解分層排序和 Z 順序排序實現的關鍵,因為它們是 bin 打包接口的擴展,並以類似的方式操作。主要區別在於排序或叢集資料所需的額外步驟。

冰山表中的默認垃圾箱包裝行為

在此示例中,冰山表由四個分區組成。每個分區都有不同的大小和不同數量的文件。如果您啟動 Spark 應用程式來執行壓縮,應用程式總共會建立四個要處理的檔案群組。文件組是一個冰山抽象,表示將由單個 Spark 作業進行處理的文件集合。也就是說,運行壓縮的 Spark 應用程序將創建四個 Spark 作業來處理數據。

調整壓實行為

下列索引鍵屬性控制如何選取壓縮資料檔案:

  • 依預設,最大檔案群組 (星火工作) 的資料限制設定為 100 GB。對於沒有分割區或具有跨越數百 GB 之分割區的表格而言,此屬性尤其重要。透過設定此限制,您可以細分作業以規劃工作並進行進度,同時防止叢集上的資源耗盡。

    注意:每個文件組都單獨排序。因此,如果您想要執行磁碟分割層級的排序,您必須調整此限制以符合分割區大小。

  • 最小檔案大小 _ 位元組或最小檔案 _ 大小 _ 預設值是在資料表層級設定的目標檔案大小的 75%。例如,如果資料表的目標大小為 512 MB,任何小於 384 MB 的檔案都會包含在要壓縮的檔案集中。

  • 最大 _ 文件大小 _ 字節或最大 _ 文件 _ 大小 _ 默認比率默認為目標文件大小的 180 百分比。如同設定最小檔案大小的兩個屬性一樣,這些屬性可用來識別壓縮工作的候選檔案。

  • MIN_INPUT_FILES 指定如果資料表分割區大小小於目標檔案大小,則要壓縮的檔案數目下限。此屬性的值用於確定是否值得根據文件數量壓縮文件(默認為 5)。

  • DELETE_FILE_閾值指定一個文件被包含在壓縮之前的刪除操作的最小數目。除非另有指定,否則壓縮不會將刪除文件與數據文件結合在一起。若要啟用此功能,您必須使用此屬性來設定臨界值。此臨界值特定於個別資料檔案,因此,如果您將其設定為 3,則只有在有三個或更多個參考資料檔案的刪除檔案時,才會重寫資料檔案。

這些屬性可讓您深入瞭解前一個圖表中檔案群組的形成。

例如,標示的分割區month=01包含兩個檔案群組,因為它超過 100 GB 的最大大小限制。相反地,month=02分割區包含單一檔案群組,因為它小於 100 GB。該month=03分區不滿足五個文件的默認最低輸入文件要求。結果,它不會被壓縮。最後,雖然month=04分區不包含足夠的數據來形成所需大小的單個文件,但這些文件將被壓縮,因為該分區包含五個以上的小文件。

您可以設置星火在 Amazon EMR 或 AWS Glue運行這些參數。對於 Amazon Athena,您可以使用以前綴optimize_開頭的表格屬性來管理類似的屬性。

運行壓實與星火在 Amazon EMR 或 AWS Glue

本節說明如何正確調整 Spark 叢集的大小以執行 Iceberg 的壓實用程式。下列範例使用 Amazon EMR 無伺服器,但您可以在 Amazon EC2 或 Amazon EKS 或中使用相同的方法。 AWS Glue

您可以利用檔案群組與 Spark 工作之間的關聯來規劃叢集資源。要按順序處理文件組,考慮到每個文件組 100 GB 的最大大小,您可以設置以下 Spark 屬性

  • spark.dynamicAllocation.enabled = FALSE

  • spark.executor.memory = 20 GB

  • spark.executor.instances = 5

如果您想要加速壓縮,可以增加 parallel 壓縮的檔案群組數目,以水平方式縮放。您也可以使用手動或動態擴展來擴展 Amazon EMR。

  • 手動縮放 (例如,係數為 4)

    • MAX_CONCURRENT_FILE_GROUP_REWRITES= 4 (我們的因素)

    • spark.executor.instances=5(在示例中使用的值)x4(我們的因子)= 20

    • spark.dynamicAllocation.enabled = FALSE

  • 動態縮放

    • spark.dynamicAllocation.enabled= TRUE (預設值,不需要採取任何動作)

    • 最大 _ 同步 _ 檔案 _ 群組 _ 重寫 = N (將此值與預設為 100 對齊;根據範例中的執行程式組態spark.dynamicAllocation.maxExecutors,您可以將此值設定為 20) N

    這些是協助調整叢集大小的準則。不過,您也應該監視 Spark 任務的效能,以找出適合您工作負載的最佳設定。

與 Amazon Athena 運行壓實

Athena 透過 OPTIMIZ E 陳述式將冰山壓實用程式做為受管理功能的實作提供。您可以使用這個陳述式來執行壓縮,而不必評估基礎結構。

此陳述式會使用 bin 封裝演算法,將小型檔案分組成較大的檔案,並將刪除檔案與現有資料檔案合併。若要使用分層排序或 Z 順序排序來叢集資料,請使用 Amazon EMR 上的 Spark 或. AWS Glue

您可以在陳述式中傳遞資料表屬性,或使用OPTIMIZE陳述式建立資料表之後,變更資料表建立時ALTER TABLE陳述式的預設行為。CREATE TABLE如需預設值,請參閱 A thena 文件

執行壓實的建議

使用案例

建議

根據時間表運行垃圾箱包裝壓實

  • 如果您不知道表格包含多少小檔案,請使用 Athena 中的OPTIMIZE陳述式。Athena 定價模式是以掃描的資料為基礎,因此如果沒有要壓縮的檔案,則這些作業不會產生相關費用。為了避免在 Athena 表上遇到超時,請 per-table-partition 基礎OPTIMIZE上運行。

  • 如果您希望壓縮大量小檔案,請使用 Amazon EMR 或 AWS Glue 動態擴展。

根據事件執行垃圾桶包裝壓實

  • 如果您希望壓縮大量小檔案,請使用 Amazon EMR 或 AWS Glue 動態擴展。

執行壓縮以排序資料

  • 使用 Amazon EMR AWS Glue,或者,因為排序是一項昂貴的操作,可能需要將資料溢滿到磁碟。

運行壓實以使用 z 順序排序對數據進行分組

  • 使用 Amazon EMR AWS Glue,或者,因為 Z 順序排序是非常昂貴的操作,可能需要將資料溢滿到磁碟。

在可能由於延遲到達數據而被其他應用程序更新的分區上運行壓縮

  • 使用 Amazon EMR 或 AWS Glue. 啟用已啟用冰山部分進度的屬性。當您使用此選項時,Iceberg 會將壓縮輸出拆分為多個提交。如果發生衝突 (也就是說,在壓縮執行時更新資料檔案),此設定會將重試的成本限制為包含受影響檔案的認可,以降低重試的成本。否則,您可能必須重新壓縮所有文件。