AWS CLI からの開始方法 - Amazon EMR

AWS CLI からの開始方法

コマンドを使用して AWS CLI から EMR Serverless の使用を開始して、アプリケーションの作成、ジョブの実行、ジョブの実行出力の確認、リソースの削除を行います。

ステップ 1: EMR Serverless アプリケーションを作成する

最初の EMR Serverless アプリケーションを構築するには、emr-serverless create-application コマンドを使用します。使用するアプリケーションバージョンに関連付けられたアプリケーションタイプと Amazon EMR リリースラベルを指定する必要があります。アプリケーションの名前はオプションです。

Spark

Spark SQL アプリケーションを作成するには、次のコマンドを実行します。

aws emr-serverless create-application \ --release-label emr-6.6.0 \ --type "SPARK" \ --name my-application
Hive

Hive アプリケーションを作成するには、次のコマンドを実行します。

aws emr-serverless create-application \ --release-label emr-6.6.0 \ --type "HIVE" \ --name my-application

出力で返されるアプリケーション ID を書き留めます。アプリケーションの起動とジョブの送信に この ID を使用します。以後は application-id として参照します。

ステップ 2: EMR Serverless アプリケーションにジョブ実行を送信する に進む前に、アプリケーションが get-application API で CREATED 状態に達していることを確認してください。

aws emr-serverless get-application \ --application-id application-id

EMR Serverless は、リクエストされたジョブに対応するワーカーを作成します。デフォルトでは、これらはオンデマンドで作成されますが、アプリケーションの作成時に initialCapacity パラメータを設定することで、事前に初期化された容量を指定することもできます。maximumCapacity パラメータを使用して、アプリケーションが使用できる最大容量の合計を制限することもできます。これらのオプションの詳細については、EMR Serverless を使用する際のアプリケーションの設定を参照してください。

ステップ 2: EMR Serverless アプリケーションにジョブ実行を送信する

これで、EMR Serverless アプリケーションはジョブを実行する準備が整いました。

Spark

このステップでは、PySpark スクリプトを使用して、複数のテキストファイルにわたる一意の単語の出現数を計算します。パブリックで読み取り専用の S3 バケットには、スクリプトとデータセットの両方が保存されます。アプリケーションは、Spark ランタイムの出力ファイルとログデータを、作成した S3 バケットの /output および /logs ディレクトリに送信します。

Spark ジョブを実行するには
  1. 次のコマンドを使用して、実行するサンプルスクリプトを新しいバケットにコピーします。

    aws s3 cp s3://us-east-1.elasticmapreduce/emr-containers/samples/wordcount/scripts/wordcount.py s3://amzn-s3-demo-bucket/scripts/
  2. 次のコマンドで、application-id をアプリケーション ID に置き換えます。job-role-arnジョブランタイムロールを作成する で作成したランタイムロール ARN に置き換えます。job-run-name をジョブ実行を呼び出す名前に置き換えます。すべての amzn-s3-demo-bucket の文字列を作成した Amazon S3 バケットに置き換え、/output をパスに追加します。これにより、バケットに新しいフォルダが作成され、EMR Serverless はアプリケーションの出力ファイルをコピーできます。

    aws emr-serverless start-job-run \ --application-id application-id \ --execution-role-arn job-role-arn \ --name job-run-name \ --job-driver '{ "sparkSubmit": { "entryPoint": "s3://amzn-s3-demo-bucket/scripts/wordcount.py", "entryPointArguments": ["s3://amzn-s3-demo-bucket/emr-serverless-spark/output"], "sparkSubmitParameters": "--conf spark.executor.cores=1 --conf spark.executor.memory=4g --conf spark.driver.cores=1 --conf spark.driver.memory=4g --conf spark.executor.instances=1" } }'
  3. 出力で返されるジョブ実行 ID を書き留めておいてください。次の手順で、job-run-id をこの ID に置き換えます。

Hive

このチュートリアルでは、テーブルを作成し、いくつかのレコードを挿入して、カウント集計クエリを実行します。Hive ジョブを実行するには、まず、単一のジョブの一部として実行するすべての Hive クエリを含むファイルを作成し、ファイルを S3 にアップロードして、Hive ジョブを開始するときにこの S3 パスを指定します。

Hive ジョブを実行するには
  1. Hive ジョブで実行するすべてのクエリを含む hive-query.ql というファイルを作成します。

    create database if not exists emrserverless; use emrserverless; create table if not exists test_table(id int); drop table if exists Values__Tmp__Table__1; insert into test_table values (1),(2),(2),(3),(3),(3); select id, count(id) from test_table group by id order by id desc;
  2. 次のコマンドを使用して、hive-query.ql を S3 バケットにアップロードします。

    aws s3 cp hive-query.ql s3://amzn-s3-demo-bucket/emr-serverless-hive/query/hive-query.ql
  3. 次のコマンドで、application-id を独自のアプリケーション ID に置き換えます。job-role-arnジョブランタイムロールを作成する で作成したランタイムロール ARN に置き換えます。すべての amzn-s3-demo-bucket の文字列を作成した Amazon S3 バケットに置き換え、/output/logs をパスに追加します。これにより、バケットに新しいフォルダが作成され、EMR Serverless はアプリケーションの出力ファイルとログファイルをコピーできます。

    aws emr-serverless start-job-run \ --application-id application-id \ --execution-role-arn job-role-arn \ --job-driver '{ "hive": { "query": "s3://amzn-s3-demo-bucket/emr-serverless-hive/query/hive-query.ql", "parameters": "--hiveconf hive.log.explain.output=false" } }' \ --configuration-overrides '{ "applicationConfiguration": [{ "classification": "hive-site", "properties": { "hive.exec.scratchdir": "s3://amzn-s3-demo-bucket/emr-serverless-hive/hive/scratch", "hive.metastore.warehouse.dir": "s3://amzn-s3-demo-bucket/emr-serverless-hive/hive/warehouse", "hive.driver.cores": "2", "hive.driver.memory": "4g", "hive.tez.container.size": "4096", "hive.tez.cpu.vcores": "1" } }], "monitoringConfiguration": { "s3MonitoringConfiguration": { "logUri": "s3://amzn-s3-demo-bucket/emr-serverless-hive/logs" } } }'
  4. 出力で返されるジョブ実行 ID を書き留めておいてください。次の手順で、job-run-id をこの ID に置き換えます。

ステップ 3: ジョブ実行の出力を確認する

ジョブの実行には通常、完了までに 3~5 分を要します。

Spark

次のコマンドを使用して、Spark ジョブの状態を確認できます。

aws emr-serverless get-job-run \ --application-id application-id \ --job-run-id job-run-id

ログの送信先を s3://amzn-s3-demo-bucket/emr-serverless-spark/logs に設定すると、この特定のジョブ実行のログを s3://amzn-s3-demo-bucket/emr-serverless-spark/logs/applications/application-id/jobs/job-run-id で確認できます。

Spark アプリケーションの場合、EMR Serverless は 30 秒ごとにイベントログを S3 ログ送信先の sparklogs フォルダにプッシュします。ジョブが完了すると、ドライバーとエグゼキューターの Spark ランタイムログが、driverexecutor などのワーカータイプによって適切に名前が付けられたフォルダにアップロードされます。PySpark ジョブの出力が s3://amzn-s3-demo-bucket/output/ にアップロードされます。

Hive

以下のコマンドを使用して Hive ジョブの状態を確認できます。

aws emr-serverless get-job-run \ --application-id application-id \ --job-run-id job-run-id

ログの送信先を s3://amzn-s3-demo-bucket/emr-serverless-hive/logs に設定すると、この特定のジョブ実行のログを s3://amzn-s3-demo-bucket/emr-serverless-hive/logs/applications/application-id/jobs/job-run-id で確認できます。

Hive アプリケーションの場合、EMR Serverless は Hive ドライバーを S3 ログ送信先の HIVE_DRIVER フォルダに、Tez タスクログを TEZ_TASK フォルダに継続的にアップロードします。ジョブの実行が SUCCEEDED 状態に達すると、Hive クエリの出力は、configurationOverridesmonitoringConfiguration フィールドで指定した Amazon S3 ロケーションで使用可能になります。

ステップ 4: クリーンアップする

このチュートリアルの操作が完了したら、作成したリソースの削除を検討してください。再度使用しないリソースをリリースすることをお勧めします。

アプリケーションを削除する

アプリケーションを削除するには、次のコマンドを使用します。

aws emr-serverless delete-application \ --application-id application-id

S3 ログバケットを削除する

S3 ログ記録と出力バケットを削除するには、次のコマンドを使用します。amzn-s3-demo-bucketEMR Serverless 用のストレージを準備する で作成した S3 バケットの実際の名前に置き換えます。

aws s3 rm s3://amzn-s3-demo-bucket --recursive aws s3api delete-bucket --bucket amzn-s3-demo-bucket

ジョブランタイムロールを削除する

ランタイムロールを削除するには、ロールからポリシーをデタッチします。その後、ロールとポリシーの両方を削除できます。

aws iam detach-role-policy \ --role-name EMRServerlessS3RuntimeRole \ --policy-arn policy-arn

ロールを削除するには、次のコマンドを使用します。

aws iam delete-role \ --role-name EMRServerlessS3RuntimeRole

ロールにアタッチされているポリシーを削除するには、次のコマンドを使用します。

aws iam delete-policy \ --policy-arn policy-arn

Spark ジョブと Hive ジョブの実行に関するその他の例については、「EMR Serverless ジョブ実行時の Spark 設定の使用」および「EMR Serverless ジョブ実行時の Hive 設定の使用」を参照してください。