通过 Apache Livy 端点在 EMR Serverless 中运行交互式工作负载 - Amazon EMR

通过 Apache Livy 端点在 EMR Serverless 中运行交互式工作负载

在 Amazon EMR 6.14.0 及更高版本中,您可以创建并启用 Apache Livy 端点,同时创建 EMR Serverless 应用程序,以通过自托管笔记本或自定义客户端运行交互式工作负载。Apache Livy 端点具有以下优势:

  • 您可以通过 Jupyter Notebook 安全连接到 Apache Livy 端点,然后使用 Apache Livy 的 REST 接口管理 Apache Spark 工作负载。

  • 对于使用 Apache Spark 工作负载数据的交互式 Web 应用程序,请使用 Apache Livy REST API 操作。

先决条件

要在 EMR Serverless 中使用 Apache Livy 端点,必须满足以下要求:

所需的权限

除了访问 EMR Serverless 所需的权限外,您还必须向 IAM 角色添加以下权限,才能访问 Apache Livy 端点和运行应用程序:

  • emr-serverless:AccessLivyEndpoints:授予访问和连接您指定为 Resource 并启用 Livy 的交互式应用程序的权限。您需要此权限才能运行 Apache Livy 端点提供的 REST API 操作。

  • iam:PassRole:授予在创建 Apache Livy 会话时访问 IAM 执行角色的权限。EMR Serverless 将使用此角色来执行您的工作负载。

  • emr-serverless:GetDashboardForJobRun:授予生成 Spark Live UI 和驱动程序日志链接的权限,并作为 Apache Livy 会话结果的一部分提供对日志的访问。

{ "Version": "2012-10-17", "Statement": [{ "Sid": "EMRServerlessInteractiveAccess", "Effect": "Allow", "Action": "emr-serverless:AccessLivyEndpoints", "Resource": "arn:aws:emr-serverless:<AWS_REGION>:account:/applications/*" }, { "Sid": "EMRServerlessRuntimeRoleAccess", "Effect": "Allow", "Action": "iam:PassRole", "Resource": "execution-role-ARN", "Condition": { "StringLike": { "iam:PassedToService": "emr-serverless.amazonaws.com" } } }, { "Sid": "EMRServerlessDashboardAccess", "Effect": "Allow", "Action": "emr-serverless:GetDashboardForJobRun", "Resource": "arn:aws:emr-serverless:<AWS_REGION>:account:/applications/*" } ] }

开始使用

要创建并运行支持 Apache Livy 的应用程序,请按照以下步骤操作。

  1. 要创建支持 Apache Livy 的应用程序,请运行以下命令。

    aws emr-serverless create-application \ --name my-application-name \ --type 'application-type' \ --release-label <Amazon EMR-release-version> --interactive-configuration '{"livyEndpointEnabled": true}'
  2. 在 EMR Serverless 创建应用程序后,启动应用程序,使 Apache Livy 端点可用。

    aws emr-serverless start-application \ --application-id application-id

    使用以下命令检查应用程序的状态。状态变为 STARTED 之后,就可以访问 Apache Livy 端点。

    aws emr-serverless get-application \ --region <AWS_REGION> --application-id >application_id>
  3. 使用以下 URL 访问端点:

    https://_<application-id>_.livy.emr-serverless-services._<AWS_REGION>_.amazonaws.com

端点准备就绪后,就可以根据用例提交工作负载。您必须使用 SIGv4 协议签署对端点的每个请求,并传入授权标头。您可以使用以下方法运行工作负载:

  • HTTP 客户端:您必须使用自定义 HTTP 客户端提交 Apache Livy 端点 API 操作。

  • Sparkmagic 内核:您必须在本地运行 sparkmagic 内核,使用 Jupyter Notebook 提交交互式查询。

HTTP 客户端

要创建 Apache Livy 会话,您必须在请求正文的 conf 参数中提交 emr-serverless.session.executionRoleArn。下面是一个 POST /sessions 请求示例。

{ "kind": "pyspark", "heartbeatTimeoutInSecond": 60, "conf": { "emr-serverless.session.executionRoleArn": "<executionRoleArn>" } }

下表列出了所有可用的 Apache Livy API 操作。

API 操作 描述
GET /sessions 返回所有活动交互式会话的列表。
POST /sessions 通过 Spark 或 pyspark 创建新的交互式会话。
GET /sessions/<sessionId> 返回会话信息。
GET /sessions/<sessionId>/state 返回会话状态。
DELETE /sessions/<sessionId> 停止并删除会话。
GET /sessions/<sessionId>/statements 返回会话中的所有语句。
POST /sessions/<sessionId>/statements 在会话中运行语句。
GET /sessions/<sessionId>/statements/<statementId> 返回会话中指定语句的详细信息。
POST /sessions/<sessionId>/statements/<statementId>/cancel 取消会话中的指定语句。

向 Apache Livy 端点发送请求

您也可以从 HTTP 客户端直接向 Apache Livy 端点发送请求。这样,您就可以在笔记本之外远程运行用例的代码。

在开始向端点发送请求之前,确保已安装以下库:

pip3 install botocore awscrt requests

下面是一个直接向端点发送 HTTP 请求的 Python 脚本示例:

from botocore import crt import requests from botocore.awsrequest import AWSRequest from botocore.credentials import Credentials import botocore.session import json, pprint, textwrap endpoint = 'https://<application_id>.livy.emr-serverless-services-<AWS_REGION>.amazonaws.com' headers = {'Content-Type': 'application/json'} session = botocore.session.Session() signer = crt.auth.CrtS3SigV4Auth(session.get_credentials(), 'emr-serverless', '<AWS_REGION>') ### Create session request data = {'kind': 'pyspark', 'heartbeatTimeoutInSecond': 60, 'conf': { 'emr-serverless.session.executionRoleArn': 'arn:aws:iam::123456789012:role/role1'}} request = AWSRequest(method='POST', url=endpoint + "/sessions", data=json.dumps(data), headers=headers) request.context["payload_signing_enabled"] = False signer.add_auth(request) prepped = request.prepare() r = requests.post(prepped.url, headers=prepped.headers, data=json.dumps(data)) pprint.pprint(r.json()) ### List Sessions Request request = AWSRequest(method='GET', url=endpoint + "/sessions", headers=headers) request.context["payload_signing_enabled"] = False signer.add_auth(request) prepped = request.prepare() r2 = requests.get(prepped.url, headers=prepped.headers) pprint.pprint(r2.json()) ### Get session state session_url = endpoint + r.headers['location'] request = AWSRequest(method='GET', url=session_url, headers=headers) request.context["payload_signing_enabled"] = False signer.add_auth(request) prepped = request.prepare() r3 = requests.get(prepped.url, headers=prepped.headers) pprint.pprint(r3.json()) ### Submit Statement data = { 'code': "1 + 1" } statements_url = endpoint + r.headers['location'] + "/statements" request = AWSRequest(method='POST', url=statements_url, data=json.dumps(data), headers=headers) request.context["payload_signing_enabled"] = False signer.add_auth(request) prepped = request.prepare() r4 = requests.post(prepped.url, headers=prepped.headers, data=json.dumps(data)) pprint.pprint(r4.json()) ### Check statements results specific_statement_url = endpoint + r4.headers['location'] request = AWSRequest(method='GET', url=specific_statement_url, headers=headers) request.context["payload_signing_enabled"] = False signer.add_auth(request) prepped = request.prepare() r5 = requests.get(prepped.url, headers=prepped.headers) pprint.pprint(r5.json()) ### Delete session session_url = endpoint + r.headers['location'] request = AWSRequest(method='DELETE', url=session_url, headers=headers) request.context["payload_signing_enabled"] = False signer.add_auth(request) prepped = request.prepare() r6 = requests.delete(prepped.url, headers=prepped.headers) pprint.pprint(r6.json())

Sparkmagic 内核

在安装 Sparkmagic 之前,确保您已在要安装 Sparkmagic 的实例中配置了 AWS 凭证

  1. 按照安装步骤安装 Sparkmagic。请注意,您只需执行前四个步骤。

  2. Sparkmagic 内核支持自定义身份验证器,因此您可以将身份验证器与 Sparkmagic 内核集成,使每个请求都经过 SIGv4 签名。

  3. 安装 EMR Serverless 自定义身份验证器。

    pip install emr-serverless-customauth
  4. 现在,在 Sparkmagic 配置 json 文件中提供自定义身份验证器的路径和 Apache Livy 端点 URL。使用以下命令打开配置文件。

    vim ~/.sparkmagic/config.json

    以下为示例 config.json 文件。

    { "kernel_python_credentials" : { "username": "", "password": "", "url": "https://<application-id>.livy.emr-serverless-services.<AWS_REGION>.amazonaws.com", "auth": "Custom_Auth" }, "kernel_scala_credentials" : { "username": "", "password": "", "url": "https://<application-id>.livy.emr-serverless-services.<AWS_REGION>.amazonaws.com", "auth": "Custom_Auth" }, "authenticators": { "None": "sparkmagic.auth.customauth.Authenticator", "Basic_Access": "sparkmagic.auth.basic.Basic", "Custom_Auth": "emr_serverless_customauth.customauthenticator.EMRServerlessCustomSigV4Signer" }, "livy_session_startup_timeout_seconds": 600, "ignore_ssl_errors": false }
  5. 启动 Jupyter 实验室。应使用您在上一步中设置的自定义身份验证。

  6. 然后,您可以运行以下笔记本命令和代码开始使用。

    %%info //Returns the information about the current sessions.
    %%configure -f //Configure information specific to a session. We supply executionRoleArn in this example. Change it for your use case. { "driverMemory": "4g", "conf": { "emr-serverless.session.executionRoleArn": "arn:aws:iam::123456789012:role/JobExecutionRole" } }
    <your code>//Run your code to start the session

在内部,每条指令都通过配置的 Apache Livy 端点 URL 调用每个 Apache Livy API 操作。然后,您可以根据自己的用例编写指令。

注意事项

通过 Apache Livy 端点运行交互式工作负载时,请考虑以下注意事项。

  • EMR Serverless 使用调用方主体维护会话级隔离。创建会话的调用方主体是唯一可以访问该会话的主体。要进行更精细的隔离,可在代入凭证时配置源身份。在这种情况下,EMR Serverless 会基于调用方主体和源身份强制执行会话级隔离。有关源身份的更多信息,请参阅监控和控制使用代入角色执行的操作

  • EMR Serverless 6.14.0 及更高版本支持 Apache Livy 端点。

  • 只有 Apache Spark 引擎支持 Apache Livy 端点。

  • Apache Livy 端点支持 Scala Spark 和 Pyspark。

  • 默认情况下,应用程序中已启用 autoStopConfig。这意味着应用程序将在空闲 15 分钟后关闭。您可以将此配置作为 create-applicationupdate-application 请求的一部分进行更改。

  • 在一个支持 Apache Livy 端点的应用程序上,最多可以运行 25 个并发会话。

  • 为获得最佳启动体验,建议您为驱动程序和执行程序配置预初始化容量。

  • 在连接到 Apache Livy 端点之前,必须手动启动应用程序。

  • 您的 AWS 账户 中必须有足够的 vCPU 服务配额,才能使用 Apache Livy 端点运行交互式工作负载。我们建议至少使用 24 个 vCPU。

  • 默认的 Apache Livy 会话超时为 1 小时。如果一小时内没有运行语句,Apache Livy 将删除会话并释放驱动程序和执行程序。无法更改此配置。

  • 只有活动会话才能与 Apache Livy 端点交互。一旦会话结束、取消或终止,就无法通过 Apache Livy 端点访问会话。