本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。
透過 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 端點,您必須符合下列需求:
-
完成開始使用 Amazon 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/*" } ] }
開始使用
要創建一個 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無伺服器建立應用程式後,啟動應用程式以使 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 工作階段,您必須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 的執行個體中的認證
-
按照安裝步驟安裝
火花。請注意,您只需要執行前四個步驟。 -
sparkmagic 核心支援自訂驗證器,因此您可以將驗證器與 sparkmagic 核心整合,以便簽署每個要求。SIGv4
-
安裝EMR無伺服器自訂驗證器。
pip install emr-serverless-customauth
-
現在,在 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 } -
啟動木普特實驗室。它應該使用您在最後一步中設置的自定義身份驗證。
-
然後,您可以運行以下筆記本命令和代碼以開始使用。
%%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-application
或update-application
請求中變更此組態。 -
您可以在啟用 Apache Livy 端點的單一應用程式上執行多達 25 個並行工作階段。
-
為了獲得最佳的啟動體驗,我們建議您為驅動程式和執行程式設定預先初始化的容量。
-
您必須先手動啟動應用程式,才能連線到 Apache Livy 端點。
-
您必須擁有足夠的 v CPU 服務配額 AWS 帳戶 以使用 Apache Livy 端點執行互動式工作負載。我們建議至少 24 v CPU。
-
預設的 Apache 利維工作階段逾時為 1 小時。如果您沒有一小時執行陳述式,則 Apache Livy 會刪除工作階段並釋放驅動程式和執行程式。您無法變更此設定。
-
只有作用中的工作階段可以與 Apache Livy 端點互動。工作階段完成、取消或終止後,您將無法透過 Apache Livy 端點存取它。