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

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

透過 Apache Livy 端點使用EMR無伺服器執行互動式工作負載

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

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

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

必要條件

若要搭配EMR無伺服器使用 Apache Livy 端點,您必須符合下列需求:

所需的許可

除了存取EMR無伺服器的必要權限之外,您還必須將下列權限新增至您的IAM角色,才能存取 Apache Livy 端點並執行應用程式:

  • emr-serverless:AccessLivyEndpoints— 授予訪問權限,並連接到您指定為啟用 LIVE 的應用程序。Resource您需要此權限才能執行可從 Apache Livy 端點執行可用的RESTAPI作業。

  • iam:PassRole— 授予在建立 Apache Livy 工作階段時存取IAM執行角色的權限。EMR無伺服器將使用此角色來執行您的工作負載。

  • 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/*" } ] }

開始使用

  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無伺服器建立應用程式後,啟動應用程式以使 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 工作階段,您必須emr-serverless.session.executionRoleArn在要求主體的conf參數中提交。下列範例是要POST /sessions求範例。

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

下表描述了所有可用的 Apache 利維API操作。

API操作 描述
GET/會話 傳回所有作用中互動式工作階段的清單。
POST/會話 通過火花或 pyspark 創建一個新的交互式會話。
GET/會議/ <sessionId> 返回會話信息。
GET/會議/ <sessionId>/ 州 返回會話的狀態。
DELETE/會議/ <sessionId> 停止並刪除工作階段。
GET/會議/ <sessionId> /聲明 返回會話中的所有語句。
POST/會議/ <sessionId> /聲明 在工作階段中執行陳述式。
GET/會議/ <sessionId>/ 月結單 /<statementId> 返回會話中指定語句的詳細信息。
POST/會議/ <sessionId>/ 月結單 /<statementId>/ 取消 取消此會話中指定的語句。

將請求發送到阿帕奇利維端點

您也可以從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())

火花核心

在安裝火花之前,請確保您已配置 AWS 您要在其中安裝 sparkmagic 的執行個體中的認證

  1. 按照安裝步驟安裝火花。請注意,您只需要執行前四個步驟。

  2. sparkmagic 核心支援自訂驗證器,因此您可以將驗證器與 sparkmagic 核心整合,以便簽署每個要求。SIGv4

  3. 安裝EMR無伺服器自訂驗證器。

    pip install emr-serverless-customauth
  4. 現在,在 Sparkmagic 設定 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. 啟動木普特實驗室。它應該使用您在最後一步中設置的自定義身份驗證。

  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無伺服器會使用呼叫者主體來維護工作階段層級隔離。建立工作階段的呼叫者主體是唯一可以存取該工作階段的主要項目。如需更精細的隔離,您可以在採用認證時設定來源身分識別。在此情況下,EMRServerless 會根據呼叫者主體和來源識別強制執行工作階段層級隔離。如需來源身分識別的詳細資訊,請參閱監視和控制對假定角色採取的動作。

  • EMR無伺服器版本 6.14.0 及更新版本支援 Apache Livy 端點。

  • 阿帕奇利維端點僅支持 Apache 星火引擎。

  • 阿帕奇生活端點支持斯卡拉星火和 PySpark。

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

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

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

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

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

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

  • 只有作用中的工作階段可以與 Apache Livy 端點互動。工作階段完成、取消或終止後,您將無法透過 Apache Livy 端點存取它。