使用 Glue AWS 任務和 Python 產生測試資料 - AWS 方案指引

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

使用 Glue AWS 任務和 Python 產生測試資料

由 Moinul Al-Mamun 建立 (AWS)

環境:生產

技術:分析 CloudNative;資料湖; DevelopmentAndTesting;無伺服器;大數據

AWS 服務:AWSGlue;Amazon S3

Summary

此模式說明如何建立以 Python 寫入的 AWS Glue 任務,以快速且輕鬆地同時產生數百萬個範例檔案。範例檔案存放在 Amazon Simple Storage Service (Amazon S3) 儲存貯體中。快速產生大量範例檔案的功能對於測試或評估 AWS Cloud 中的服務非常重要。例如,您可以透過對 Amazon S3 AWS 字首中的數百萬個小型檔案執行資料分析,來測試 Glue Studio 或 AWS Glue DataBrew 任務的效能。

雖然您可以使用其他 AWS 服務來產生範例資料集,但我們建議您使用 AWS Glue。您不需要管理任何基礎設施,因為 AWS Glue 是無伺服器資料處理服務。您可以攜帶程式碼,並在 Glue AWS 叢集中執行。此外,Glue AWS 會佈建、設定和擴展執行任務所需的資源。您只需為您的任務在執行時使用的資源支付費用。

先決條件和限制

先決條件

  • 作用中AWS帳戶

  • AWS 命令列介面 (AWS CLI),已安裝設定為與 AWS 帳戶搭配使用

產品版本

  • Python 3.9

  • AWS CLI 第 2 版

限制

每次觸發程序的 AWS Glue 任務數量上限為 50。如需詳細資訊,請參閱 AWS Glue 端點和配額

架構

下圖描述以 Glue AWS 任務為中心的架構範例,該任務會將輸出 (即範例檔案) 寫入 S3 儲存貯體。

工作流程顯示 會AWSCLI啟動將輸出寫入 S3 AWS 儲存貯體的 Glue 任務。

圖表包含下列工作流程:

  1. 您可以使用 AWS CLI、 AWS 管理主控台或 API來啟動 Glue AWS 任務。AWS CLI 或 API可讓您自動化調用任務的平行化,並減少產生範例檔案的執行時間。

  2. Glue AWS 任務會隨機產生檔案內容,將內容轉換為CSV格式,然後將內容儲存為 Amazon S3 物件的通用字首。每個檔案小於 KB。Glue AWS 任務接受兩個使用者定義的任務參數: START_RANGEEND_RANGE。您可以使用這些參數來設定檔案名稱,以及每個任務執行在 Amazon S3 中產生的檔案數目。您可以平行執行此任務的多個執行個體 (例如 100 個執行個體)。

工具

最佳實務

在實作此模式時,請考慮下列 AWS Glue 最佳實務:

  • 使用正確的 AWS Glue 工作者類型來降低成本。建議您了解工作者類型的不同屬性,然後根據 CPU和 記憶體需求,為您的工作負載選擇正確的工作者類型。對於此模式,我們建議您使用 Python shell 任務作為您的任務類型,以將成本降至最低DPU並降低成本。如需詳細資訊,請參閱 Glue AWS 開發人員指南中的在 Glue 中新增任務。 AWS

  • 使用正確的並行限制來擴展您的任務。我們建議您根據時間需求和所需檔案數量來建立 Glue AWS 任務的最大並行數量。

  • 首先開始產生少量檔案。若要在建置 Glue AWS 任務時降低成本並節省時間,請從少量檔案 (例如 1,000) 開始。這可以讓疑難排解更容易。如果產生少量檔案成功,則您可以擴展到更多檔案。

  • 先在本機執行。若要在建置 Glue AWS 任務時降低成本並節省時間,請在本機開始開發並測試程式碼。如需設定 Docker 容器的指示,該容器可協助您在 Shell AWS 和整合開發環境中寫入 Glue 擷取、轉換和載入 (ETL) 任務 (IDE),請參閱AWS巨量資料部落格上的使用容器文章在本機開發 AWS Glue ETL任務

如需更多 AWS Glue AWS 最佳實務,請參閱 Glue 文件中的最佳實務

史詩

任務描述所需的技能

建立用於儲存檔案的 S3 儲存貯體。

建立 S3 儲存貯體及其字

注意:此模式會使用s3://{your-s3-bucket-name}/small-files/位置進行示範。

應用程式開發人員

建立和設定IAM角色。

您必須建立 Glue AWS 任務可用來寫入 S3 儲存貯體IAM的角色。

  1. 建立IAM角色 (例如,稱為 "AWSGlueServiceRole-smallfiles")。

  2. 選擇 AWS Glue 作為政策的信任實體。

  3. 將名為 的AWS受管政策"AWSGlueServiceRole"連接至角色。

  4. 根據下列組態建立"s3-small-file-access"名為 的內嵌政策或客戶受管政策。將 取代"{bucket}"為您的儲存貯體名稱。

    { "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "s3:GetObject", "s3:PutObject" ], "Resource": [ "arn:aws:s3:::{bucket}/small-files/input/*" ] } ] }
  5. "s3-small-file-access"政策連接至您的角色。

應用程式開發人員
任務描述所需的技能

建立 AWS Glue 任務。

您必須建立產生內容的 AWS Glue 任務,並將其存放在 S3 儲存貯體中。

建立 AWS Glue 任務 ,然後完成下列步驟來設定您的任務:

  1. 登入 AWS 管理主控台並開啟 AWS Glue 主控台

  2. 在導覽窗格中的資料整合和 ETL下,選擇任務

  3. 建立任務區段中,選擇 Python Shell 指令碼編輯器

  4. 選項區段中,選取使用樣板程式碼建立新指令碼,然後選擇建立

  5. 選擇工作詳細資訊

  6. 對於名稱 ,輸入 create_small_files

  7. 針對IAM角色 ,選取您先前建立IAM的角色。

  8. 在此任務執行區段中,選擇要由您撰寫的新指令碼

  9. 展開進階屬性

  10. 針對最大並行數 ,請輸入 100 做為示範用途。注意:最大並行定義您可以平行執行的任務執行個體數量。

  11. 選擇 Save (儲存)。

應用程式開發人員

更新任務代碼。

  1. 開啟 AWS Glue 主控台

  2. 在導覽窗格中,選擇 Jobs (任務)

  3. 任務區段中,選擇您先前建立的任務。

  4. 選擇指令碼索引標籤,然後根據下列程式碼更新指令碼。使用 值更新 PREFIXBUCKET_NAMEtext_str變數。

    from awsglue.utils import getResolvedOptions import sys import boto3 from random import randrange # Two arguments args = getResolvedOptions(sys.argv, ['START_RANGE', 'END_RANGE']) START_RANGE = int(args['START_RANGE']) END_RANGE = int(args['END_RANGE']) BUCKET_NAME = '{BUCKET_NAME}' PREFIX = 'small-files/input/' s3 = boto3.resource('s3') for x in range(START_RANGE, END_RANGE): # generate file name file_name = f"input_{x}.txt" # generate text text_str = str(randrange(100000))+","+str(randrange(100000))+", " + str(randrange(10000000)) + "," + str(randrange(10000)) # write in s3 s3.Object(BUCKET_NAME, PREFIX + file_name).put(Body=text_str)
  5. 選擇 Save (儲存)。

應用程式開發人員
任務描述所需的技能

從命令列執行 AWS Glue 任務。

若要從 執行 AWS Glue AWS CLI 任務,請使用您的值執行下列命令:

cmd:~$ aws glue start-job-run --job-name create_small_files --arguments '{"--START_RANGE":"0","--END_RANGE":"1000000"}' cmd:~$ aws glue start-job-run --job-name create_small_files --arguments '{"--START_RANGE":"1000000","--END_RANGE":"2000000"}'

注意:如需從AWS管理主控台執行 AWS Glue 任務的指示,請參閱此模式的AWS管理主控台故事中的執行 AWS Glue 任務

秘訣:如果您想要使用不同的參數一次執行多個執行,建議您使用 AWSCLI來執行 AWS Glue 任務,如上例所示。

若要產生使用特定平行化因素產生定義數量檔案所需的所有AWSCLI命令,請執行下列低音程式碼 (使用您的值):

# define parameters NUMBER_OF_FILES=10000000; PARALLELIZATION=50; # initialize _SB=0; # generate commands for i in $(seq 1 $PARALLELIZATION); do echo aws glue start-job-run --job-name create_small_files --arguments "'"'{"--START_RANGE":"'$(((NUMBER_OF_FILES/PARALLELIZATION) * (i-1) + _SB))'","--END_RANGE":"'$(((NUMBER_OF_FILES/PARALLELIZATION) * (i)))'"}'"'"; _SB=1; done

如果您使用上述指令碼,請考慮下列事項:

  • 指令碼可簡化大規模調用和產生小型檔案的過程。

  • PARALLELIZATION 使用值更新 NUMBER_OF_FILES和 。

  • 上述指令碼會列印您必須執行的命令清單。複製這些輸出命令,然後在您的終端機中執行它們。

  • 如果您想要直接從指令碼中執行命令,請移除第 11 行中的echo陳述式。

注意:若要查看上述指令碼輸出的範例,請參閱此模式的額外資訊區段中的 Shell 指令碼輸出

應用程式開發人員

在AWS管理主控台中執行 AWS Glue 任務。

  1. 登入 AWS 管理主控台 並開啟 AWS Glue 主控台

  2. 在導覽窗格中的資料整合和 ETL下,選擇任務

  3. 任務區段中,選擇您的任務。

  4. 參數 (選用) 區段中,更新您的參數。

  5. 選擇動作 ,然後選擇執行任務

  6. 視需要多次重複步驟 3-5。例如,若要建立 1,000 萬個檔案,請重複此程序 10 次。

應用程式開發人員

檢查 Glue AWS 任務的狀態。

  1. 開啟 AWS Glue 主控台

  2. 在導覽窗格中,選擇 Jobs (任務)

  3. 任務區段中,選擇您先前建立的任務 (即 create_small_files)。

  4. 如需了解檔案的進度和產生,請檢閱執行 ID、執行狀態 和其他資料欄。

應用程式開發人員

相關資源

參考

指南和模式

其他資訊

基準測試

此模式用於使用不同的平行化參數產生 1,000 萬個檔案,作為基準測試的一部分。下表顯示測試的輸出:

平行化

任務執行產生的檔案數目

任務持續時間

Speed (速度)

10

1,000,000

6 小時 40 分鐘

非常慢

50

200,000

80 分鐘

適中

100

100,000

40 分鐘

快速

如果您想要讓程序更快,您可以在任務組態中設定更多並行執行。您可以根據您的需求輕鬆調整任務組態,但請記住,有 AWS Glue 服務配額限制。如需詳細資訊,請參閱 AWS Glue 端點和配額

Shell 指令碼輸出

下列範例顯示使用此模式從命令列故事執行 Glue AWS 任務的 Shell 指令碼輸出。

user@MUC-1234567890 MINGW64 ~ $ # define parameters NUMBER_OF_FILES=10000000; PARALLELIZATION=50; # initialize _SB=0; # generate commands for i in $(seq 1 $PARALLELIZATION); do echo aws glue start-job-run --job-name create_small_files --arguments "'"'{"--START_RANGE":"'$(((NUMBER_OF_FILES/PARALLELIZATION) (i-1) + SB))'","--ENDRANGE":"'$(((NUMBER_OF_FILES/PARALLELIZATION) (i)))'"}'"'"; _SB=1; done aws glue start-job-run --job-name create_small_files --arguments '{"--START_RANGE":"0","--END_RANGE":"200000"}' aws glue start-job-run --job-name create_small_files --arguments '{"--START_RANGE":"200001","--END_RANGE":"400000"}' aws glue start-job-run --job-name create_small_files --arguments '{"--START_RANGE":"400001","--END_RANGE":"600000"}' aws glue start-job-run --job-name create_small_files --arguments '{"--START_RANGE":"600001","--END_RANGE":"800000"}' aws glue start-job-run --job-name create_small_files --arguments '{"--START_RANGE":"800001","--END_RANGE":"1000000"}' aws glue start-job-run --job-name create_small_files --arguments '{"--START_RANGE":"1000001","--END_RANGE":"1200000"}' aws glue start-job-run --job-name create_small_files --arguments '{"--START_RANGE":"1200001","--END_RANGE":"1400000"}' aws glue start-job-run --job-name create_small_files --arguments '{"--START_RANGE":"1400001","--END_RANGE":"1600000"}' aws glue start-job-run --job-name create_small_files --arguments '{"--START_RANGE":"1600001","--END_RANGE":"1800000"}' aws glue start-job-run --job-name create_small_files --arguments '{"--START_RANGE":"1800001","--END_RANGE":"2000000"}' aws glue start-job-run --job-name create_small_files --arguments '{"--START_RANGE":"2000001","--END_RANGE":"2200000"}' aws glue start-job-run --job-name create_small_files --arguments '{"--START_RANGE":"2200001","--END_RANGE":"2400000"}' aws glue start-job-run --job-name create_small_files --arguments '{"--START_RANGE":"2400001","--END_RANGE":"2600000"}' aws glue start-job-run --job-name create_small_files --arguments '{"--START_RANGE":"2600001","--END_RANGE":"2800000"}' aws glue start-job-run --job-name create_small_files --arguments '{"--START_RANGE":"2800001","--END_RANGE":"3000000"}' aws glue start-job-run --job-name create_small_files --arguments '{"--START_RANGE":"3000001","--END_RANGE":"3200000"}' aws glue start-job-run --job-name create_small_files --arguments '{"--START_RANGE":"3200001","--END_RANGE":"3400000"}' aws glue start-job-run --job-name create_small_files --arguments '{"--START_RANGE":"3400001","--END_RANGE":"3600000"}' aws glue start-job-run --job-name create_small_files --arguments '{"--START_RANGE":"3600001","--END_RANGE":"3800000"}' aws glue start-job-run --job-name create_small_files --arguments '{"--START_RANGE":"3800001","--END_RANGE":"4000000"}' aws glue start-job-run --job-name create_small_files --arguments '{"--START_RANGE":"4000001","--END_RANGE":"4200000"}' aws glue start-job-run --job-name create_small_files --arguments '{"--START_RANGE":"4200001","--END_RANGE":"4400000"}' aws glue start-job-run --job-name create_small_files --arguments '{"--START_RANGE":"4400001","--END_RANGE":"4600000"}' aws glue start-job-run --job-name create_small_files --arguments '{"--START_RANGE":"4600001","--END_RANGE":"4800000"}' aws glue start-job-run --job-name create_small_files --arguments '{"--START_RANGE":"4800001","--END_RANGE":"5000000"}' aws glue start-job-run --job-name create_small_files --arguments '{"--START_RANGE":"5000001","--END_RANGE":"5200000"}' aws glue start-job-run --job-name create_small_files --arguments '{"--START_RANGE":"5200001","--END_RANGE":"5400000"}' aws glue start-job-run --job-name create_small_files --arguments '{"--START_RANGE":"5400001","--END_RANGE":"5600000"}' aws glue start-job-run --job-name create_small_files --arguments '{"--START_RANGE":"5600001","--END_RANGE":"5800000"}' aws glue start-job-run --job-name create_small_files --arguments '{"--START_RANGE":"5800001","--END_RANGE":"6000000"}' aws glue start-job-run --job-name create_small_files --arguments '{"--START_RANGE":"6000001","--END_RANGE":"6200000"}' aws glue start-job-run --job-name create_small_files --arguments '{"--START_RANGE":"6200001","--END_RANGE":"6400000"}' aws glue start-job-run --job-name create_small_files --arguments '{"--START_RANGE":"6400001","--END_RANGE":"6600000"}' aws glue start-job-run --job-name create_small_files --arguments '{"--START_RANGE":"6600001","--END_RANGE":"6800000"}' aws glue start-job-run --job-name create_small_files --arguments '{"--START_RANGE":"6800001","--END_RANGE":"7000000"}' aws glue start-job-run --job-name create_small_files --arguments '{"--START_RANGE":"7000001","--END_RANGE":"7200000"}' aws glue start-job-run --job-name create_small_files --arguments '{"--START_RANGE":"7200001","--END_RANGE":"7400000"}' aws glue start-job-run --job-name create_small_files --arguments '{"--START_RANGE":"7400001","--END_RANGE":"7600000"}' aws glue start-job-run --job-name create_small_files --arguments '{"--START_RANGE":"7600001","--END_RANGE":"7800000"}' aws glue start-job-run --job-name create_small_files --arguments '{"--START_RANGE":"7800001","--END_RANGE":"8000000"}' aws glue start-job-run --job-name create_small_files --arguments '{"--START_RANGE":"8000001","--END_RANGE":"8200000"}' aws glue start-job-run --job-name create_small_files --arguments '{"--START_RANGE":"8200001","--END_RANGE":"8400000"}' aws glue start-job-run --job-name create_small_files --arguments '{"--START_RANGE":"8400001","--END_RANGE":"8600000"}' aws glue start-job-run --job-name create_small_files --arguments '{"--START_RANGE":"8600001","--END_RANGE":"8800000"}' aws glue start-job-run --job-name create_small_files --arguments '{"--START_RANGE":"8800001","--END_RANGE":"9000000"}' aws glue start-job-run --job-name create_small_files --arguments '{"--START_RANGE":"9000001","--END_RANGE":"9200000"}' aws glue start-job-run --job-name create_small_files --arguments '{"--START_RANGE":"9200001","--END_RANGE":"9400000"}' aws glue start-job-run --job-name create_small_files --arguments '{"--START_RANGE":"9400001","--END_RANGE":"9600000"}' aws glue start-job-run --job-name create_small_files --arguments '{"--START_RANGE":"9600001","--END_RANGE":"9800000"}' aws glue start-job-run --job-name create_small_files --arguments '{"--START_RANGE":"9800001","--END_RANGE":"10000000"}' user@MUC-1234567890 MINGW64 ~

FAQ

我應該使用多少個並行執行或平行任務?

並行執行和平行任務的數量取決於您的時間需求和所需的測試檔案數量。建議您檢查要建立的檔案大小。首先,檢查 Glue AWS 任務需要多少時間來產生所需的檔案數目。然後,使用正確數量的並行執行來滿足您的目標。例如,如果您假設 100,000 個檔案需要 40 分鐘才能完成執行,但目標時間為 30 分鐘,則必須增加 Glue AWS 任務的並行設定。

我可以使用此模式建立哪種類型的內容?

您可以建立任何類型的內容,例如具有不同分隔符號的文字檔案 (例如 PIPE、 JSON或 CSV)。此模式使用 Boto3 寫入檔案,然後將檔案儲存在 S3 儲存貯體中。

我需要在 S3 儲存貯體中取得何種IAM許可層級?

您必須具有身分型政策,允許Write存取 S3 儲存貯體中的物件。如需詳細資訊,請參閱 Amazon S3:允許讀取和寫入 Amazon S3 文件中 S3 儲存貯體中的物件。 Amazon S3