

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

# 透過 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 Spark 工作負載資料的互動 Web 應用程式，使用 Apache Livy REST API 操作。

## 先決條件
<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 端點執行互動式工作負載，您需要特定許可和角色。如需詳細資訊，請參閱[互動式工作負載的必要許可](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 所需的許可之外，也請將下列許可新增至您的 IAM 角色，以存取 Apache Livy 端點並執行應用程式：
+ `emr-serverless:AccessLivyEndpoints` – 授予許可，以存取和連線至您指定為 的已啟用 Livy 的應用程式`Resource`。您需要此許可才能從 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 操作 | Description | 
| --- | --- | 
| 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 端點
<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。請注意，您只執行前四個步驟。

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 使用發起人主體維持工作階段層級隔離。建立工作階段的呼叫者主體是唯一可以存取該工作階段的主體。如需更精細的隔離，請在取得登入資料時設定來源身分。在此情況下，EMR Serverless 會根據發起人主體和來源身分強制執行工作階段層級隔離。如需來源身分的詳細資訊，請參閱[監控和控制使用擔任角色所採取的動作](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_credentials_temp_control-access_monitor.html#id_credentials_temp_control-access_monitor-specify-sourceid)。
+ EMR Serverless 6.14.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 會刪除工作階段，並釋出驅動程式和執行器。從版本 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 應用程式啟用精細存取控制的詳細資訊，請參閱[精細存取控制的方法](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 端點存取它。