从 AWS CLI 开始使用 - Amazon EMR

从 AWS CLI 开始使用

使用命令从 AWS CLI 开始使用 EMR Serverless,以创建应用程序、运行作业、检查作业运行输出和删除资源。

步骤 1:创建 EMR Serverless 应用程序

使用 emr-serverless create-application 命令创建您的第一个 EMR Serverless 应用程序。您需要指定应用程序类型,以及与要使用的应用程序版本关联的 Amazon EMR 发行版标签。应用程序的名称为可选。

Spark

要创建 Spark 应用程序,请运行以下命令。

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

在继续学习 CREATED 之前,请确保您的应用程序已使用 get-application API 达到 步骤 2:将作业运行提交到 EMR Serverless 应用程序 状态。

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-query.ql 的文件,其中包含您要在 Hive 作业中运行的所有查询。

    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-bucket 替换为您在 准备 EMR 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 配置