通过 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 端点,必须满足以下要求:
-
完成开始使用 Amazon 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 的应用程序,请按照以下步骤操作。
要创建支持 Apache Livy 的应用程序,请运行以下命令。
aws emr-serverless create-application \ --name
my-application-name
\ --type 'application-type
' \ --release-label <Amazon EMR-release-version> --interactive-configuration '{"livyEndpointEnabled": true}'-
在 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>
-
使用以下 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 凭证
-
按照安装步骤
安装 Sparkmagic。请注意,您只需执行前四个步骤。 -
Sparkmagic 内核支持自定义身份验证器,因此您可以将身份验证器与 Sparkmagic 内核集成,使每个请求都经过 SIGv4 签名。
-
安装 EMR Serverless 自定义身份验证器。
pip install emr-serverless-customauth
-
现在,在 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 } -
启动 Jupyter 实验室。应使用您在上一步中设置的自定义身份验证。
-
然后,您可以运行以下笔记本命令和代码开始使用。
%%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-application
或update-application
请求的一部分进行更改。 -
在一个支持 Apache Livy 端点的应用程序上,最多可以运行 25 个并发会话。
-
为获得最佳启动体验,建议您为驱动程序和执行程序配置预初始化容量。
-
在连接到 Apache Livy 端点之前,必须手动启动应用程序。
-
您的 AWS 账户 中必须有足够的 vCPU 服务配额,才能使用 Apache Livy 端点运行交互式工作负载。我们建议至少使用 24 个 vCPU。
-
默认的 Apache Livy 会话超时为 1 小时。如果一小时内没有运行语句,Apache Livy 将删除会话并释放驱动程序和执行程序。无法更改此配置。
-
只有活动会话才能与 Apache Livy 端点交互。一旦会话结束、取消或终止,就无法通过 Apache Livy 端点访问会话。