

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

# 在 AWS 上最佳化輸入檔案大小的 ETL 擷取
<a name="optimize-the-etl-ingestion-of-input-file-size-on-aws"></a>

*Apoorva Patrikar，Amazon Web Services*

## 總結
<a name="optimize-the-etl-ingestion-of-input-file-size-on-aws-summary"></a>

此模式說明如何在處理您的資料之前最佳化檔案大小，以最佳化 AWS Glue 上大數據和 Apache Spark 工作負載的擷取、轉換和載入 (ETL) 程序的擷取步驟。使用此模式來防止或解決*小型檔案問題*。也就是說，當大量小型檔案因為檔案的彙總大小而減慢資料處理速度時。例如，各僅數百 KB 的數百個檔案可以大幅降低 AWS Glue 任務的資料處理速度。這是因為 AWS Glue 必須在 Amazon Simple Storage Service (Amazon S3) 上執行內部清單函數，而 YARN (Yet Another Resource Negotiator) 必須存放大量中繼資料。若要改善資料處理速度，您可以使用分組讓 ETL 任務將一組輸入檔案讀取至單一記憶體內分割區。分割區會自動將較小的檔案分組在一起。或者，您可以使用自訂程式碼，將批次邏輯新增至現有的檔案。

## 先決條件和限制
<a name="optimize-the-etl-ingestion-of-input-file-size-on-aws-prereqs"></a>

**先決條件**
+ 作用中的 AWS 帳戶
+ 一或多個 AWS 黏附[任務](https://docs.aws.amazon.com/glue/latest/dg/author-job.html)
+ 一或多個大數據或 [Apache Spark](https://spark.apache.org/) 工作負載
+ [S3 儲存貯體](https://docs.aws.amazon.com/AmazonS3/latest/userguide/UsingBucket.html)

## Architecture
<a name="optimize-the-etl-ingestion-of-input-file-size-on-aws-architecture"></a>

下列模式顯示 AWS Glue 任務如何處理不同格式的資料，然後存放在 S3 儲存貯體中以取得效能的可見性。

![\[AWS Glue 任務會處理不同格式的資料，然後存放在 S3 儲存貯體中。\]](http://docs.aws.amazon.com/zh_tw/prescriptive-guidance/latest/patterns/images/pattern-img/88ee332f-2f12-4d88-b491-e78bbb173850/images/9a97b54a-3f67-4a48-94d2-5807373ace25.png)


該圖顯示以下工作流程：

1. 
**注意**  
AWS Glue 任務會將 CSV、JSON 和 Parquet 格式的小型檔案轉換為動態影格。：輸入檔案的大小對 AWS Glue 任務的效能影響最大。

1. AWS Glue 任務會在 S3 儲存貯體中執行內部清單函數。

## 工具
<a name="optimize-the-etl-ingestion-of-input-file-size-on-aws-tools"></a>
+ [AWS Glue](https://docs.aws.amazon.com/glue/latest/dg/what-is-glue.html) 是全受管 ETL 服務。它可協助您可靠地分類、清理、擴充和移動資料存放區和資料串流之間的資料。
+ [Amazon Simple Storage Service (Amazon S3)](https://docs.aws.amazon.com/AmazonS3/latest/userguide/Welcome.html) 是一種雲端型物件儲存服務，可協助您儲存、保護和擷取任何數量的資料。

## 史詩
<a name="optimize-the-etl-ingestion-of-input-file-size-on-aws-epics"></a>

### 使用分組來最佳化讀取期間的 ETL 擷取
<a name="use-grouping-to-optimize-etl-ingestion-during-reading"></a>


| 任務 | Description | 所需的技能 | 
| --- | --- | --- | 
| 指定群組大小。 | 如果您有超過 50，000 個檔案，預設會完成分組。不過，您也可以在 `connectionOptions` 參數中指定群組大小，以使用少於 50，000 個檔案的分組。`connectionOptions` 參數位於 `create_dynamic_frame.from_options`方法中。 | 資料工程師 | 
| 撰寫分組程式碼。 | 使用 `create_dynamic_frame`方法來建立動態影格。例如：<pre>S3bucket_node1 = glueContext.create_dynamic_frame.from_options(<br />    format_options={"multiline": False},<br />    connection_type="s3",<br />    format="json",<br />    connection_options={<br />        "paths": ["s3://bucket/prefix/file.json"],<br />        "recurse": True,<br />        "groupFiles": 'inPartition', <br />        "groupSize": 1048576<br />    },<br />    transformation_ctx="S3bucket_node1",<br />)</pre>使用 `groupFiles` 將 Amazon S3 分割區群組中的檔案分組。使用 `groupSize`設定要在記憶體中讀取之群組的目標大小。`groupSize` 以位元組 (1048576 = 1 MB 指定 )。 | 資料工程師 | 
| 將程式碼新增至工作流程。 | 在 AWS Glue 中將分組程式碼新增至您的任務[工作流程](https://docs.aws.amazon.com/glue/latest/dg/workflows_overview.html)。 | 資料工程師 | 

### 使用自訂邏輯來最佳化 ETL 擷取
<a name="use-custom-logic-to-optimize-etl-ingestion"></a>


| 任務 | Description | 所需的技能 | 
| --- | --- | --- | 
| 選擇語言和處理平台。 | 選擇專為您的使用案例量身打造的指令碼語言和處理平台。 | 雲端架構師 | 
| 撰寫程式碼。 | 撰寫自訂邏輯，將檔案批次處理在一起。 | 雲端架構師 | 
| 將程式碼新增至工作流程。 | 在 AWS Glue 中將程式碼新增至您的任務[工作流程](https://docs.aws.amazon.com/glue/latest/dg/workflows_overview.html)。這可讓您的自訂邏輯在每次執行任務時套用。 | 資料工程師 | 

### 在轉換後寫入資料時重新分割
<a name="repartition-when-writing-data-after-transformation"></a>


| 任務 | Description | 所需的技能 | 
| --- | --- | --- | 
| 分析消耗模式。 | 了解下游應用程式如何使用您寫入的資料。例如，如果他們每天查詢資料，而且您只有每個區域的分割區資料，或具有非常小的輸出檔案，例如每個檔案 2.5 KB，則這並非消耗的理想選擇。 | DBA | 
| 寫入前重新分割資料。 | 在處理期間 （根據處理邏輯） 和處理後 （根據耗用），根據聯結或查詢重新分割。例如，根據位元組大小重新分割，例如 `.repartition(100000)`，或根據資料欄重新分割，例如 `.repartition("column_name")`。 | 資料工程師 | 

## 相關資源
<a name="optimize-the-etl-ingestion-of-input-file-size-on-aws-resources"></a>
+ [讀取較大群組中的輸入檔案](https://docs.aws.amazon.com/glue/latest/dg/grouping-input-files.html)
+ [監控 AWS Glue](https://docs.aws.amazon.com/glue/latest/dg/monitor-glue.html)
+ [使用 Amazon CloudWatch 指標監控 AWS Glue ](https://docs.aws.amazon.com/glue/latest/dg/monitoring-awsglue-with-cloudwatch-metrics.html)
+ [任務監控與偵錯](https://docs.aws.amazon.com/glue/latest/dg/monitor-profile-glue-job-cloudwatch-metrics.html)
+ [AWS Glue 上的無伺服器 ETL 入門](https://docs.aws.amazon.com/prescriptive-guidance/latest/serverless-etl-aws-glue/welcome.html)

## 其他資訊
<a name="optimize-the-etl-ingestion-of-input-file-size-on-aws-additional"></a>

**判斷檔案大小**

無法直接判斷檔案大小是否太大或太小。檔案大小對處理效能的影響取決於叢集的組態。在核心 Hadoop 中，我們建議您使用 128 MB 或 256 MB 的檔案，以充分利用區塊大小。

對於 AWS Glue 上的大多數文字檔案工作負載，我們建議 5-10 DPU 叢集的檔案大小介於 100 MB 到 1 GB 之間。若要找出輸入檔案的最佳大小，請監控 AWS Glue 任務的預先處理區段，然後檢查任務的 CPU 使用率和記憶體使用率。

**其他考量事項**

如果早期 ETL 階段的效能是瓶頸，請考慮在處理之前分組或合併資料檔案。如果您完全控制檔案產生程序，在原始資料傳送至 AWS 之前，在來源系統本身彙總資料點會更有效率。