Apache Livy エンドポイントを介してEMRサーバーレスでインタラクティブワークロードを実行する - Amazon EMR

翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。

Apache Livy エンドポイントを介してEMRサーバーレスでインタラクティブワークロードを実行する

Amazon EMRリリース 6.14.0 以降では、EMRサーバーレスアプリケーションの作成中に Apache Livy エンドポイントを作成および有効にし、セルフホストノートブックまたはカスタムクライアントを使用してインタラクティブワークロードを実行できます。Apache Livy エンドポイントには以下の利点があります。

  • Jupyter Notebook を介して Apache Livy エンドポイントに安全に接続し、Apache Livy のRESTインターフェイスを使用して Apache Spark ワークロードを管理できます。

  • Apache Livy RESTAPIオペレーションは、Apache Spark ワークロードのデータを使用するインタラクティブなウェブアプリケーションに使用します。

前提条件

EMR Serverless で Apache Livy エンドポイントを使用するには、次の要件を満たす必要があります。

必要なアクセス許可

EMR Serverless にアクセスするために必要なアクセス許可に加えて、Apache Livy エンドポイントにアクセスしてアプリケーションを実行するために、次のアクセス許可をIAMロールに追加する必要があります。

  • emr-serverless:AccessLivyEndpointsResource として指定した Livy 対応アプリケーションにアクセスして接続するためのアクセス許可を付与します。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 対応アプリケーションを作成して実行するには、次の手順に従います。

  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 をインストールします。最初の 4 つのステップのみを実行する必要があることに注意してください。

  2. sparkmagic カーネルはカスタム認証機能をサポートしているため、認証機能を sparkmagic カーネルと統合して、すべてのリクエストSIGv4に署名できます。

  3. EMR Serverless カスタム認証ツールをインストールします。

    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. 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 は、発信者プリンシパルを使用してセッションレベルの分離を維持します。セッションを作成する発信者プリンシパルは、セッションにアクセスできる唯一のプリンシパルです。より詳細な分離のために、認証情報を引き受けるときにソース ID を設定できます。この場合、EMRサーバーレスは発信者プリンシパルとソース ID の両方に基づいてセッションレベルの分離を適用します。ソース ID の詳細については、「引き受けたロールで実行されるアクションのモニタリングとコントロールアクション」を参照してください。

  • Apache Livy エンドポイントは、 EMR Serverless リリース 6.14.0 以降でサポートされています。

  • Apache Livy エンドポイントは、Apache Spark エンジンでのみサポートされています。

  • Apache Livy エンドポイントは Scala Spark と をサポートしています PySpark。

  • デフォルトでは、autoStopConfig はアプリケーションで有効になっています。これは、アイドル状態が 15 分間継続するとアプリケーションがシャットダウンすることを表します。この設定は、create-application または update-application リクエストの一部として変更できます。

  • 単一の Apache Livy エンドポイント対応アプリケーションで最大 25 件の同時セッションを実行できます。

  • 最適な起動エクスペリエンスを実現するには、ドライバーとエグゼキューターの事前初期化された容量を設定することをお勧めします。

  • Apache Livy エンドポイントに接続する前に、アプリケーションを手動で起動する必要があります。

  • Apache Livy エンドポイントでインタラクティブワークロードを実行する AWS アカウント には、 に十分な vCPU サービスクォータが必要です。少なくとも 24 v をお勧めしますCPU。

  • Apache Livy セッションのデフォルトのタイムアウトは 1 時間です。ステートメントを 1 時間実行しない場合、Apache Livy はセッションを削除し、ドライバーとエグゼキューターを解放します。この設定を変更することはできません。

  • アクティブなセッションのみが Apache Livy エンドポイントとやり取りできます。セッションが終了、キャンセル、または停止すると、Apache Livy エンドポイントからセッションにアクセスできなくなります。