

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

# Apache Livy エンドポイントを介して EMR Serverless でインタラクティブワークロードを実行する
<a name="interactive-workloads-livy-endpoints"></a>

Amazon EMR リリース 6.14.0 以降では、EMR Serverless アプリケーションの作成時に Apache Livy エンドポイントを作成および有効化し、セルフホストノートブックまたはカスタムクライアントを使用してインタラクティブワークロードを実行します。Apache Livy エンドポイントには以下の利点があります。
+ Jupyter ノートブックを介して Apache Livy エンドポイントに安全に接続し、Apache Livy の REST インターフェイスを使用して Apache Spark ワークロードを管理できます。
+ Apache Livy REST API オペレーションは、Apache Spark ワークロードのデータを使用するインタラクティブなウェブアプリケーションに使用します。

## 前提条件
<a name="interactive-workloads-livy-endpoints-prereqs"></a>

EMR Serverless で Apache Livy エンドポイントを使用するには、次の要件を満たします。
+ [Amazon EMR Serverless の使用を開始する](https://docs.aws.amazon.com/emr/latest/EMR-Serverless-UserGuide/getting-started.html)の手順を完了します。
+ Apache Livy エンドポイントを介してインタラクティブワークロードを実行するには、特定のアクセス許可とロールが必要です。詳細については、「[Required permissions for interactive workloads](https://docs.aws.amazon.com/emr/latest/EMR-Serverless-UserGuide/interactive-workloads.html#interactive-permissions)」を参照してください。

## 必要なアクセス許可
<a name="interactive-workloads-livy-endpoints-permissions"></a>

EMR Serverless にアクセスするために必要なアクセス許可に加えて、Apache Livy エンドポイントにアクセスしてアプリケーションを実行するために、IAM ロールに次のアクセス許可を追加します。
+ `emr-serverless:AccessLivyEndpoints` – `Resource` として指定した Livy 対応アプリケーションにアクセスして接続するためのアクセス許可を付与します。Apache Livy エンドポイントから利用可能な REST API オペレーションを実行するには、このアクセス許可が必要です。
+ `iam:PassRole` – Apache Livy セッション作成時に IAM 実行ロールにアクセスするためのアクセス許可を付与します。EMR Serverless は、このロールを使用してワークロードを実行します。
+ `emr-serverless:GetDashboardForJobRun` – Spark Live UI とドライバーのログリンクを生成するためのアクセス許可を付与し、Apache Livy セッションの結果の一部としてログへのアクセスを許可します。

------
#### [ JSON ]

****  

```
{
  "Version":"2012-10-17",		 	 	 
  "Statement": [
    {
      "Sid": "EMRServerlessInteractiveAccess",
      "Effect": "Allow",
      "Action": [
        "emr-serverless:AccessLivyEndpoints"
      ],
      "Resource": [
        "arn:aws:emr-serverless:*:123456789012:/applications/*"
      ]
    },
    {
      "Sid": "EMRServerlessRuntimeRoleAccess",
      "Effect": "Allow",
      "Action": [
        "iam:PassRole"
      ],
      "Resource": [
        "arn:aws:iam::123456789012:role/EMRServerlessExecutionRole"
      ],
      "Condition": {
        "StringLike": {
          "iam:PassedToService": "emr-serverless.amazonaws.com"
        }
      }
    },
    {
      "Sid": "EMRServerlessDashboardAccess",
      "Effect": "Allow",
      "Action": [
        "emr-serverless:GetDashboardForJobRun"
      ],
      "Resource": [
        "arn:aws:emr-serverless:*:123456789012:/applications/*"
      ]
    }
  ]
}
```

------

## 開始方法
<a name="interactive-workloads-livy-endpoints-getting-started"></a>

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}'
   ```

1. 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>
   ```

1. 以下の URL を使用してエンドポイントにアクセスします。

   ```
   https://_<application-id>_.livy.emr-serverless-services._<AWS_REGION>_.amazonaws.com
   ```

エンドポイントの準備ができたら、ユースケースに基づいてワークロードを送信します。[SIGv4 プロトコル](https://docs.aws.amazon.com/IAM/latest/UserGuide/create-signed-request.html)を使用してエンドポイントへのすべてのリクエストに署名し、認証ヘッダーを渡す必要があります。次の方法を使用してワークロードを実行できます。
+ HTTP クライアント – カスタム HTTP クライアントを使用して Apache Livy エンドポイント API オペレーションを送信します。
+ Sparkmagic カーネル – Sparkmagic カーネルをローカルで実行し、Jupyter ノートブックを使用してインタラクティブクエリを送信します。

### HTTP クライアント
<a name="interactive-workloads-livy-endpoints-getting-started-http"></a>

Apache Livy セッションを作成するには、リクエスト本文の `conf` パラメータで `emr-serverless.session.executionRoleArn` を送信します。次の例は、サンプルの `POST /sessions` リクエストです。

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

次の表は、使用可能なすべての Apache Livy API オペレーションを示しています。


| API オペレーション: | 説明 | 
| --- | --- | 
| GET /sessions | アクティブなすべてのインタラクティブセッションのリストを返します。 | 
| POST /sessions | 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 エンドポイントへのリクエストの送信
<a name="interactive-workloads-livy-endpoints-getting-started-http-send-requests"></a>

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 カーネル
<a name="interactive-workloads-livy-endpoints-getting-started-sparkmagic"></a>

sparkmagic をインストールする前に、sparkmagic をインストールするインスタンスで AWS 認証情報が設定されていることを確認してください。

1. [インストール手順](https://github.com/jupyter-incubator/sparkmagic?tab=readme-ov-file#installation)に従って sparkmagic をインストールします。最初の 4 つのステップのみを実行することに注意してください。

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

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

   ```
   pip install emr-serverless-customauth
   ```

1. 次に、カスタム認証ツールへのパスと、sparkmagic の設定 json ファイル内の Apache Livy エンドポイント URL を指定します。以下のコマンドを使用して設定ファイルを開きます。

   ```
   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
   }
   ```

1. Jupyter ラボを起動します。最後のステップで設定したカスタム認証を使用する必要があります。

1. その後、次のノートブックコマンドとコードを実行して開始できます。

   ```
   %%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 エンドポイント URL を介して各 Apache Livy API オペレーションを呼び出します。その後、ユースケースに従って指示を記述できます。

## 考慮事項
<a name="interactive-workloads-livy-endpoints-considerations"></a>

Apache Livy エンドポイントを介してインタラクティブワークロードを実行する場合は、次の考慮事項を検討してください。
+ EMR Serverless は、発信者プリンシパルを使用してセッションレベルの分離を維持します。セッションを作成する発信者プリンシパルは、セッションにアクセスできる唯一のプリンシパルです。より詳細な分離のために、認証情報を引き受けるときにソース ID を設定します。この場合、EMR Serverless は発信者プリンシパルとソース ID に基づいてセッションレベルの分離を適用します。ソース ID の詳細については、「[引き受けたロールで実行されるアクションのモニタリングと制御](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_credentials_temp_control-access_monitor.html#id_credentials_temp_control-access_monitor-specify-sourceid)」を参照してください。
+ 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 個の vCPU を提案します。
+ Apache Livy セッションのデフォルトのタイムアウトは 1 時間です。ステートメントを 1 時間実行しない場合、Apache Livy はセッションを削除し、ドライバーとエグゼキューターを解放します。リリース emr-7.8.0 から、この値は `ttl` パラメータを Livy `/sessions POST` リクエストの一部として指定することで設定できます。例えば、 `2h`(時間)、 `120m`(分)、 `7200s`(秒)、 `7200000ms`(ミリ秒) などです。
**注記**  
この設定を emr-7.8.0 より前に変更できません。以下の例は、サンプルの `POST /sessions` リクエスト本文です。

  ```
  {    
      "kind": "pyspark",
      "heartbeatTimeoutInSecond": 60, 
      "conf": {
          "emr-serverless.session.executionRoleArn": "executionRoleArn"
      },
      "ttl": "2h"
  }
  ```
+ LakeFormation によるきめ細かなアクセスコントロールが有効になっているアプリケーション用の Amazon EMR リリース emr-7.8.0 以降、セッションごとに設定を無効にできます。EMR Serverless アプリケーションのきめ細かなアクセスコントロールを有効にする方法の詳細については、「[Methods for fine-grained access control](emr-serverless-lf-enable.html#emr-serverless-lf-enable-config)」を参照してください。
**注記**  
Lake Formation は、アプリケーションに対して有効になっていないセッションに対して有効にできません。以下の例は、サンプルの `POST /sessions` リクエスト本文です。

  ```
  {    
      "kind": "pyspark",
      "heartbeatTimeoutInSecond": 60, 
      "conf": {
          "emr-serverless.session.executionRoleArn": "executionRoleArn"
      },
      "spark.emr-serverless.lakeformation.enabled" : "false"
  }
  ```
+ アクティブなセッションのみが Apache Livy エンドポイントとやり取りできます。セッションが終了、キャンセル、または停止すると、Apache Livy エンドポイントからセッションにアクセスできなくなります。