Glue AWS ジョブと Python を使用してテストデータを生成する - AWS 規範ガイダンス

翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。

Glue AWS ジョブと Python を使用してテストデータを生成する

作成者: Moinul Al-Mamun (AWS)

環境:本稼働

テクノロジー: 分析 CloudNative、データレイク DevelopmentAndTesting、サーバーレス、ビッグデータ

AWS サービス: AWS Glue、Amazon S3

[概要]

このパターンは、Python で記述された Glue AWS ジョブを作成することで、数百万のサンプルファイルを同時に迅速かつ簡単に生成する方法を示しています。サンプルファイルは Amazon Simple Storage Service (Amazon S3) のバケットに保存されています。多数のサンプルファイルをすばやく生成できることは、 AWS クラウドでサービスをテストまたは評価するために重要です。例えば、Amazon S3 AWS プレフィックス内の数百万の小さなファイルに対してデータ分析を実行して、Glue Studio または AWS Glue DataBrew ジョブのパフォーマンスをテストできます。 Amazon S3

他の AWSのサービスを使用してサンプルデータセットを生成することもできますが、Glue AWS を使用することをお勧めします。AWS Glue はサーバーレスデータ処理サービスであるため、インフラストラクチャを管理する必要はありません。コードを持ち込み、Glue AWS クラスターで実行するだけで済みます。さらに、Glue AWS はジョブの実行に必要なリソースをプロビジョニング、設定、スケーリングします。ジョブの実行中に使用したリソースに対してのみ料金を支払います。

前提条件と制限

前提条件

  • アクティブなAWSアカウント

  • AWS コマンドラインインターフェイス (AWS CLI)、 AWSアカウントで動作するようにインストールおよび設定されている

製品バージョン

  • Python 3.9

  • AWS CLI バージョン 2

制約事項

トリガーあたりの AWS Glue ジョブの最大数は 50 です。詳細については、AWS「Glue エンドポイントとクォータ」を参照してください。

アーキテクチャ

次の図は、出力 (サンプルファイル) AWS を S3 バケットに書き込む Glue ジョブを中心とするアーキテクチャの例を示しています。

ワークフローは、S3 AWS バケットに出力を書き込む Glue ジョブAWSCLIを開始します。

この図表は、次のワークフローを示しています:

  1. AWS CLI、AWSマネジメントコンソール、または を使用して API Glue AWS ジョブを開始します。AWS CLI または APIを使用すると、呼び出されたジョブの並列化を自動化し、サンプルファイルを生成するためのランタイムを短縮できます。

  2. AWS Glue ジョブは、ファイルコンテンツをランダムに生成し、コンテンツをCSV形式に変換してから、コンテンツを Amazon S3 オブジェクトとして共通のプレフィックスで保存します。各ファイルは 1 KB 未満です。Glue ジョブは、 START_RANGEと の 2 AWS つのユーザー定義ジョブパラメータを受け入れますEND_RANGE。これらのパラメータを使用して、ジョブを実行するたびに Amazon S3 で生成されるファイル名とファイル数を設定できます。このジョブの複数のインスタンス (たとえば、100 インスタンス) を並行実行できます。

ツール

  • Amazon Simple Storage Service (Amazon S3) は、量にかかわらず、データを保存、保護、取得するのに役立つクラウドベースのオブジェクトストレージサービスです。

  • AWS コマンドラインインターフェイス (AWS CLI) は、コマンドラインシェルのコマンドを使用してAWSサービスとやり取りするのに役立つオープンソースツールです。

  • AWS Glue は、フルマネージドの抽出、変換、ロード (ETL) サービスです。これにより、データストアとデータストリーム間でのデータの分類、整理、強化、移動を確実に行うことができます。

  • AWS Identity and Access Management (IAM) は、誰が認証され、誰に使用を許可されているかを制御することで、AWSリソースへのアクセスを安全に管理できます。

ベストプラクティス

このパターンを実装する際は、次の Glue AWS のベストプラクティスを考慮してください。

  • 適切な Glue AWS ワーカータイプを使用してコストを削減します。ワーカータイプのさまざまなプロパティを理解し、 CPUとメモリ要件に基づいてワークロードに適したワーカータイプを選択することをお勧めします。このパターンでは、Python シェルジョブをジョブタイプとして使用して、コストを最小限に抑えDPU、削減することをお勧めします。詳細については、Glue AWS デベロッパーガイドの「Glue でのジョブの追加」を参照してください。 AWS

  • 同時実行数の上限を適切に設定してジョブをスケールしてください。AWS Glue ジョブの最大同時実行数は、時間要件と必要なファイル数に基づいて設定することをお勧めします。

  • 最初は、少数のファイルの生成から始めてください。AWS Glue ジョブを構築するときにコストを削減し、時間を節約するには、少数のファイル (1,000 など) から開始します。これにより、トラブルシューティングが容易になります。少数のファイルの生成に成功すれば、より多くのファイル数に拡張できます。

  • 最初にローカルで実行します。AWS Glue ジョブを構築するときにコストを削減し、時間を節約するには、ローカルで開発を開始し、コードをテストします。シェルと統合開発環境 () の両方で AWS Glue 抽出、変換、ロード (ETL) ジョブを記述するのに役立つ Docker コンテナの設定手順IDEについては、AWSビッグデータブログのコンテナ投稿を使用してローカルで Glue AWS ETLジョブを開発するを参照してください。

AWS Glue のベストプラクティスの詳細については、Glue AWS ドキュメントの「ベストプラクティス」を参照してください。

エピック

タスク説明必要なスキル

ファイルを保存する S3 バケットを作成します。

S3 バケット」とその中に「プレフィックス」を作成します。

注:このパターンでは、s3://{your-s3-bucket-name}/small-files/ ロケーションをデモンストレーションに使用しています。

アプリ開発者

IAM ロールを作成して設定します。

Glue ジョブが S3 AWS バケットへの書き込みに使用できる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" ポリシーをロールにアタッチします。

アプリ開発者
タスク説明必要なスキル

Glue AWS ジョブを作成します。

コンテンツを生成して S3 バケットに保存する AWS Glue ジョブを作成する必要があります。

AWS Glue ジョブ を作成し、次の手順を実行してジョブを設定します。

  1. AWS マネジメントコンソールにサインインし、AWSGlue コンソール を開きます。

  2. ナビゲーションペインのデータ統合と ETLで、ジョブ を選択します。

  3. 「ジョブの作成」セクションで、[Python シェルスクリプトエディタ] を選択します。

  4. 「オプション」セクションで、[ボイラープレートコードで新しいスクリプトを作成] を選択し、[作成] を選択します。

  5. [ジョブの詳細] を選択します。

  6. [名前] には「create_small_files」と入力します。

  7. IAM ロール で、前に作成したIAMロールを選択します。

  8. 「このジョブは実行」セクションで、[自分で作成する新しいスクリプト] を選択します。

  9. [詳細プロパティ] を展開します。

  10. [最大同時実行数] には、デモンストレーション用に「100」と入力します。注:最大同時実行数は、並行実行できるジョブのインスタンス数を定義します。

  11. [Save] を選択します。

アプリ開発者

ジョブのコードを更新する。

  1. AWS Glue コンソール を開きます。

  2. ナビゲーションペインで ジョブを選択します。

  3. 「あなたのジョブ」セクションで、前に作成したジョブを選択します。

  4. [スクリプト] タブを選択し、次のコードに基づいてスクリプトを更新します。BUCKET_NAMEPREFIX、および text_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マネジメントコンソールストーリーの「 Glue AWS ジョブの実行」を参照してください。

ヒント: 上記の例に示すように、異なるパラメータで一度に複数の実行を実行する場合は、 を使用して AWS Glue ジョブAWSCLIを実行することをお勧めします。

特定の並列化係数を使用して定義された数のファイルを生成するために必要なすべてのAWSCLIコマンドを生成するには、次の bash コードを実行します ( 値を使用)。

# 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

上記のスクリプトを使用する場合は、次の点を考慮してください。

  • このスクリプトを使うと、小規模なファイルの呼び出しと生成を大規模に簡略化できます。

  • NUMBER_OF_FILESPARALLELIZATION を任意の値で更新します。

  • 上のスクリプトは、実行する必要のあるコマンドのリストを出力します。これらの出力コマンドをコピーして、ターミナルで実行します。

  • スクリプト内から直接コマンドを実行する場合は、11 行目の echo ステートメントを削除してください。

注:上記のスクリプトの出力例については、このパターンの「追加情報」セクションにある「シェルスクリプトの出力」を参照してください。

アプリ開発者

AWS 管理コンソールで AWS Glue ジョブを実行します。

  1. AWS マネジメントコンソール にサインインし、AWSGlue コンソール を開きます。

  2. ナビゲーションペインのデータ統合と ETLで、ジョブ を選択します。

  3. 「あなたのジョブ」セクションで、あなたのジョブを選択します。

  4. 「パラメーター (オプション)」セクションで、パラメーターを更新します。

  5. [アクション]、[ジョブの実行] の順に選択します。

  6. ステップ 3 ~ 5 を必要な回数繰り返します。たとえば、1,000 万個のファイルを作成するには、この処理を 10 回繰り返します。

アプリ開発者

Glue AWS ジョブのステータスを確認します。

  1. AWS Glue コンソール を開きます。

  2. ナビゲーションペインで ジョブを選択します。

  3. 「あなたのジョブ」セクションで、前に作成したジョブ (つまり、create_small_files) を選択します。

  4. ファイルの進行状況と生成状況を確認するには、「実行 ID」、「実行ステータス」などの列を確認してください。

アプリ開発者

関連リソース

リファレンス

ガイドとパターン

追加情報

ベンチマークテスト

このパターンを使用して、ベンチマークテストの一環として、さまざまな並列化パラメーターを使用して 1,000 万個のファイルを生成しました。次のテーブルは、テストの出力を示しています。

並列化

1 回のジョブ実行で生成されるファイルの数

ジョブ所要時間

[Speed] (スピード)

10

1,000,000

6 時間、40 分

とても遅い

50

200,000 件の

80 分

100

100,000

40 分

高速

処理を速くしたい場合は、ジョブ設定で同時実行数を増やすことができます。要件に基づいてジョブ設定を簡単に調整できますが、Glue AWS サービスクォータの制限があることに注意してください。詳細については、AWS「Glue エンドポイントとクォータ」を参照してください。

シェルスクリプト出力

次の例は、このパターンのコマンドラインストーリーから AWS Glue ジョブを実行する からのシェルスクリプトの出力を示しています。

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アクセス許可のレベルは?

S3 バケット内のオブジェクトへの Write アクセスを許可する ID ベースのポリシーが必要です。詳細については、Amazon S3 ドキュメントの「Amazon S3: S3 バケットのオブジェクトへの読み取りおよび書き込みのアクセス許可」を参照してください。