翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。
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 はジョブの実行に必要なリソースをプロビジョニング、設定、スケーリングします。ジョブの実行中に使用したリソースに対してのみ料金を支払います。
前提条件と制限
前提条件
製品バージョン
Python 3.9
AWS CLI バージョン 2
制約事項
トリガーあたりの AWS Glue ジョブの最大数は 50 です。詳細については、AWS「Glue エンドポイントとクォータ」を参照してください。
アーキテクチャ
次の図は、出力 (サンプルファイル) AWS を S3 バケットに書き込む Glue ジョブを中心とするアーキテクチャの例を示しています。
この図表は、次のワークフローを示しています:
AWS CLI、AWSマネジメントコンソール、または を使用して API Glue AWS ジョブを開始します。AWS CLI または APIを使用すると、呼び出されたジョブの並列化を自動化し、サンプルファイルを生成するためのランタイムを短縮できます。
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 バケット」とその中に「プレフィックス」を作成します。 注:このパターンでは、 | アプリ開発者 |
IAM ロールを作成して設定します。 | Glue ジョブが S3 AWS バケットへの書き込みに使用できるIAMロールを作成する必要があります。
| アプリ開発者 |
タスク | 説明 | 必要なスキル |
---|---|---|
Glue AWS ジョブを作成します。 | コンテンツを生成して S3 バケットに保存する AWS Glue ジョブを作成する必要があります。 AWS Glue ジョブ を作成し、次の手順を実行してジョブを設定します。
| アプリ開発者 |
ジョブのコードを更新する。 |
| アプリ開発者 |
タスク | 説明 | 必要なスキル |
---|---|---|
コマンドラインから AWS Glue ジョブを実行します。 | から AWS Glue AWS CLI ジョブを実行するには、値を使用して次のコマンドを実行します。
注: AWSマネジメントコンソールから AWS Glue ジョブを実行する手順については、このパターンのAWSマネジメントコンソールストーリーの「 Glue AWS ジョブの実行」を参照してください。 ヒント: 上記の例に示すように、異なるパラメータで一度に複数の実行を実行する場合は、 を使用して AWS Glue ジョブAWSCLIを実行することをお勧めします。 特定の並列化係数を使用して定義された数のファイルを生成するために必要なすべてのAWSCLIコマンドを生成するには、次の bash コードを実行します ( 値を使用)。
上記のスクリプトを使用する場合は、次の点を考慮してください。
注:上記のスクリプトの出力例については、このパターンの「追加情報」セクションにある「シェルスクリプトの出力」を参照してください。 | アプリ開発者 |
AWS 管理コンソールで AWS Glue ジョブを実行します。 |
| アプリ開発者 |
Glue AWS ジョブのステータスを確認します。 |
| アプリ開発者 |
関連リソース
リファレンス
ガイドとパターン
追加情報
ベンチマークテスト
このパターンを使用して、ベンチマークテストの一環として、さまざまな並列化パラメーターを使用して 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 バケットのオブジェクトへの読み取りおよび書き込みのアクセス許可」を参照してください。