

기계 번역으로 제공되는 번역입니다. 제공된 번역과 원본 영어의 내용이 상충하는 경우에는 영어 버전이 우선합니다.

# Apache Livy 엔드포인트를 통해 EMR Serverless에서 대화형 워크로드 실행
<a name="interactive-workloads-livy-endpoints"></a>

Amazon EMR 릴리스 6.14.0 이상을 사용하면 EMR Serverless 애플리케이션을 생성할 때 Apache Livy 엔드포인트를 생성 및 활성화하고 자체 호스팅 노트북 또는 사용자 지정 클라이언트를 통해 대화형 워크로드를 실행할 수 있습니다. Apache Livy 엔드포인트는 다음과 같은 이점을 제공합니다.
+ Jupyter Notebook을 통해 Apache Livy 엔드포인트에 안전하게 연결하고 Apache Livy의 REST 인터페이스를 사용하여 Apache Spark 워크로드를 관리할 수 있습니다.
+ Apache Spark 워크로드의 데이터를 사용하는 대화형 웹 애플리케이션에 대해 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에 액세스하는 데 필요한 권한 외에도 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 Notebook에서 대화형 쿼리를 제출합니다.

### 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 커널은 사용자 지정 인증자를 지원하므로, 모든 요청이 SIGv4로 서명되도록 인증자를 sparkmagic 커널과 통합할 수 있습니다.

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)를 참고하세요.
+ 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부터는 `2h`(시간), `120m`(분), `7200s`(초), `7200000ms`(밀리초)와 같이 `ttl` 파라미터를 Livy `/sessions POST` 요청의 일부로 지정하여 이 값을 설정할 수 있습니다.
**참고**  
emr-7.8.0 이전의 경우 이 구성을 변경할 수 없습니다. 다음은 `POST /sessions` 요청 본문입니다.

  ```
  {    
      "kind": "pyspark",
      "heartbeatTimeoutInSecond": 60, 
      "conf": {
          "emr-serverless.session.executionRoleArn": "executionRoleArn"
      },
      "ttl": "2h"
  }
  ```
+ Amazon EMR 릴리스 emr-7.8.0부터 Lake Formation을 통한 세분화된 접근 제어 기능을 지원하는 애플리케이션의 경우, 세션별로 해당 설정을 비활성화할 수 있습니다. 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 엔드포인트를 통해 액세스할 수 없습니다.