透過 Apache Livy 端點使用 EMR Serverless 執行互動式工作負載 - Amazon EMR

本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。

透過 Apache Livy 端點使用 EMR Serverless 執行互動式工作負載

使用 Amazon 6.14.0 版和更新EMR版本,您可以在建立無EMR伺服器應用程式時建立和啟用 Apache Livy 端點,並透過自我託管筆記本或使用自訂用戶端執行互動式工作負載。Apache Livy 端點提供下列優點:

  • 您可以透過 Jupyter 筆記本安全地連線至 Apache Livy 端點,並使用 Apache Livy 的REST界面管理 Apache Spark 工作負載。

  • 針對使用 Apache Spark 工作負載資料的互動 Web 應用程式,使用 Apache Livy RESTAPI操作。

必要條件

若要搭配 EMR Serverless 使用 Apache Livy 端點,您必須滿足下列需求:

所需的許可

除了存取 EMR Serverless 所需的許可之外,您還必須將下列許可新增至您的IAM角色,以存取 Apache Livy 端點並執行應用程式:

  • emr-serverless:AccessLivyEndpoints – 授予許可,以存取和連線至您指定為 的已啟用 Livy 的應用程式Resource。您需要此許可才能執行 Apache Livy 端點可用的RESTAPI操作。

  • iam:PassRole – 授予在建立 Apache Livy 工作階段時存取IAM執行角色的許可。 EMRServerless 將使用此角色來執行您的工作負載。

  • 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 筆記本提交互動式查詢。

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 /工作階段 傳回所有作用中互動式工作階段的清單。
POST /工作階段 透過 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. 火花圖核心支援自訂驗證器,因此您可以將驗證器與火花圖核心整合,以便每個請求都SIGv4經過簽署。

  3. 安裝 EMR Serverless 自訂驗證器。

    pip install emr-serverless-customauth
  4. 現在提供自訂驗證器的路徑,以及火花組態 json 檔案中URL的 Apache Livy 端點。使用下列命令來開啟組態檔案。

    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 端點 呼叫每個 Apache Livy API操作URL。然後,您可以根據使用案例撰寫指示。

考量事項

透過 Apache Livy 端點執行互動式工作負載時,請考慮以下因素。

  • EMR Serverless 使用呼叫者主體維持工作階段層級隔離。建立工作階段的呼叫者主體是唯一可以存取該工作階段的主體。如需更精細的隔離,您可以在取得登入資料時設定來源身分。在此情況下,無EMR伺服器會根據發起人主體和來源身分強制執行工作階段層級隔離。如需來源身分的詳細資訊,請參閱監控和控制使用擔任的角色所採取的動作

  • Serverless 6.14EMR.0 版及更新版本支援 Apache Livy 端點。

  • Apache Livy 端點僅支援 Apache Spark 引擎。

  • Apache Livy 端點支援 Scala Spark 和 PySpark。

  • 根據預設, autoStopConfig 會在您的應用程式中啟用。這表示應用程式會在閒置 15 分鐘後關閉。您可以在 create-applicationupdate-application請求中變更此組態。

  • 您可以在單一啟用 Apache Livy 端點的應用程式上執行最多 25 個並行工作階段。

  • 為了獲得最佳的啟動體驗,建議您為驅動程式和執行器設定預先初始化的容量。

  • 您必須先手動啟動應用程式,才能連線至 Apache Livy 端點。

  • 您的 中必須有足夠的 vCPU 服務配額 AWS 帳戶 ,才能使用 Apache Livy 端點執行互動式工作負載。我們建議至少使用 24 vCPU。

  • 預設 Apache Livy 工作階段逾時為 1 小時。如果您沒有執行一小時的陳述式,則 Apache Livy 會刪除工作階段並釋出驅動程式和執行器。您無法變更此組態。

  • 只有作用中工作階段才能與 Apache Livy 端點互動。一旦工作階段完成、取消或終止,您就無法透過 Apache Livy 端點存取它。