本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。
透過 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 端點,您必須滿足下列需求:
-
完成 Amazon 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 的應用程式並執行它,請依照下列步驟執行。
若要建立啟用 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 筆記本提交互動式查詢。
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 登入資料
-
依照安裝步驟安裝
Sparkmagic。請注意,您只需要執行前四個步驟。 -
火花圖核心支援自訂驗證器,因此您可以將驗證器與火花圖核心整合,以便每個請求都SIGv4經過簽署。
-
安裝 EMR Serverless 自訂驗證器。
pip install emr-serverless-customauth
-
現在提供自訂驗證器的路徑,以及火花組態 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 } -
啟動 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 端點 呼叫每個 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-application
或update-application
請求中變更此組態。 -
您可以在單一啟用 Apache Livy 端點的應用程式上執行最多 25 個並行工作階段。
-
為了獲得最佳的啟動體驗,建議您為驅動程式和執行器設定預先初始化的容量。
-
您必須先手動啟動應用程式,才能連線至 Apache Livy 端點。
-
您的 中必須有足夠的 vCPU 服務配額 AWS 帳戶 ,才能使用 Apache Livy 端點執行互動式工作負載。我們建議至少使用 24 vCPU。
-
預設 Apache Livy 工作階段逾時為 1 小時。如果您沒有執行一小時的陳述式,則 Apache Livy 會刪除工作階段並釋出驅動程式和執行器。您無法變更此組態。
-
只有作用中工作階段才能與 Apache Livy 端點互動。一旦工作階段完成、取消或終止,您就無法透過 Apache Livy 端點存取它。