

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

# Amazon EMR on EKS에서 Apache Livy 사용
<a name="job-runs-apache-livy"></a>

Amazon EMR 릴리스 7.1.0 이상에서는 Apache Livy를 사용하여 Amazon EMR on EKS에서 작업을 제출할 수 있습니다. Apache Livy를 사용하면 자체 Apache Livy REST 엔드포인트를 설정하고 이를 사용해 Amazon EKS 클러스터에서 Spark 애플리케이션을 배포하고 관리할 수 있습니다. Amazon EKS 클러스터에 Livy를 설치한 후 Livy 엔드포인트를 사용하여 Spark 애플리케이션을 Livy 서버에 제출할 수 있습니다. 서버는 Spark 애플리케이션의 수명 주기를 관리합니다.

**참고**  
Amazon EMR은 vCPU 및 메모리 소비를 기반으로 Amazon EKS에 대한 요금을 계산합니다. 이 계산은 드라이버 및 실행기 포드에 적용됩니다. 이 계산은 Amazon EMR 애플리케이션 이미지를 다운로드한 시점부터 시작하여 Amazon EKS 포드가 종료될 때까지 수행되며, 가장 가까운 초로 반올림됩니다.

**Topics**
+ [Amazon EMR on EKS에 대한 Apache Livy 설정](job-runs-apache-livy-setup.md)
+ [Amazon EMR on EKS에서 Apache Livy 시작하기](job-runs-apache-livy-install.md)
+ [Amazon EMR on EKS에 대한 Apache Livy를 사용하여 Spark 애플리케이션 실행](job-runs-apache-livy-run-spark.md)
+ [Amazon EMR on EKS에서 Apache Livy 제거](job-runs-apache-livy-uninstall.md)
+ [Amazon EMR on EKS에서 Apache Livy에 대한 보안](job-runs-apache-livy-security.md)
+ [Amazon EMR on EKS 릴리스에서 Apache Livy에 대한 설치 속성](job-runs-apache-livy-installation-properties.md)
+ [일반적인 환경 변수 형식 오류 문제 해결](job-runs-apache-livy-troubleshooting.md)

# Amazon EMR on EKS에 대한 Apache Livy 설정
<a name="job-runs-apache-livy-setup"></a>

Amazon EKS 클러스터에 Apache Livy를 설치하려면 먼저 사전 조건 도구 세트를 설치하고 구성해야 합니다. 여기에는 AWS 리소스 작업을 위한 기본 명령줄 도구 AWS CLI인 , Amazon EKS 작업을 위한 명령줄 도구,이 사용 사례에서 클러스터 애플리케이션을 인터넷에 제공하고 네트워크 트래픽을 라우팅하는 데 사용되는 컨트롤러가 포함됩니다.
+ **[의 최신 버전 설치 또는 업데이트 AWS CLI](https://docs.aws.amazon.com/cli/latest/userguide/getting-started-install.html) ** -를 이미 설치한 경우 최신 버전이 있는지 AWS CLI확인합니다.
+ **[kubectl 및 eksctl 설치](https://docs.aws.amazon.com/eks/latest/userguide/install-kubectl.html)** - eksctl은 Amazon EKS와 통신하는 데 사용하는 명령줄 도구입니다.
+ **[Install Helm](https://docs.aws.amazon.com/eks/latest/userguide/helm.html)** – Kubernetes용 Helm 패키지 관리자는 Kubernetes 클러스터에서 애플리케이션을 설치하고 관리하는 데 도움이 됩니다.
+ **[Amazon EKS 시작하기 – eksctl](https://docs.aws.amazon.com/eks/latest/userguide/getting-started-eksctl.html) ** - 관련 단계를 수행하여 Amazon EKS에서 노드를 포함하는 새 Kubernetes 클러스터를 생성합니다.
+ **[Amazon EMR 릴리스 레이블 선택](docker-custom-images-tag.md)** - Amazon EMR 릴리스 7.1.0 이상에서 Apache Livy가 지원됩니다.
+ **[ALB 컨트롤러 설치 ](https://docs.aws.amazon.com/eks/latest/userguide/aws-load-balancer-controller.html)**- ALB 컨트롤러는 Kubernetes 클러스터용 AWS Elastic Load Balancing을 관리합니다. Apache Livy를 설정하는 동안 Kubernetes 수신을 생성할 때 AWS Network Load Balancer(NLB)를 생성합니다.

# Amazon EMR on EKS에서 Apache Livy 시작하기
<a name="job-runs-apache-livy-install"></a>

다음 단계를 완료하여 Apache Livy를 설치합니다. 여기에는 패키지 관리자 구성, Spark 워크로드 실행을 위한 네임스페이스 생성, Livy 설치, 로드 밸런싱 설정 및 확인 단계가 포함됩니다. Spark에서 배치 작업을 실행하려면 다음 단계를 완료해야 합니다.

1. 아직 하지 않은 경우 [Amazon EMR에 대한 Apache Livy on EKS](https://docs.aws.amazon.com/emr/latest/EMR-on-EKS-DevelopmentGuide/job-runs-apache-livy-setup.html)를 설정합니다.

1. Helm 클라이언트를 Amazon ECR 레지스트리에 인증합니다. [리전별로 Amazon ECR 레지스트리 계정](https://docs.aws.amazon.com/emr/latest/EMR-on-EKS-DevelopmentGuide/docker-custom-images-tag.html#docker-custom-images-ECR) AWS 리전 에서에 해당하는 `ECR-registry-account` 값을 찾을 수 있습니다.

   ```
   aws ecr get-login-password \--region <AWS_REGION> | helm registry login \
   --username AWS \
   --password-stdin <ECR-registry-account>.dkr.ecr.<region-id>.amazonaws.com
   ```

1. Livy를 설정하면 Livy 서버에 대한 한 서비스 계정과 Spark 애플리케이션에 대한 다른 계정이 생성됩니다. 서비스 계정에 대한 IRSA를 설정하려면 [서비스 계정에 대한 IAM 역할(IRSA)을 사용하여 액세스 권한 설정](https://docs.aws.amazon.com/emr/latest/EMR-on-EKS-DevelopmentGuide/job-runs-apache-livy-irsa.html)을 참조하세요.

1. Spark 워크로드를 실행할 네임스페이스를 생성합니다.

   ```
   kubectl create ns <spark-ns>
   ```

1. 다음 명령을 사용하여 Livy를 설치합니다.

   이 Livy 엔드포인트는 EKS 클러스터의 VPC에 대해서만 내부적으로 사용할 수 있습니다. VPC 이상의 액세스를 활성화하려면 Helm 설치 명령에서 `—-set loadbalancer.internal=false`를 설정합니다.
**참고**  
기본적으로 SSL은 이 Livy 엔드포인트 내에서 활성화되지 않으며, 엔드포인트는 EKS 클러스터의 VPC 내에서만 표시됩니다. `loadbalancer.internal=false` 및 `ssl.enabled=false`를 설정하면 비보안 엔드포인트가 VPC 외부로 노출됩니다. 보안 Livy 엔드포인트를 설정하려면 [TLS/SSL을 사용하여 보안 Apache Livy 엔드포인트 구성](https://docs.aws.amazon.com/emr/latest/EMR-on-EKS-DevelopmentGuide/job-runs-apache-livy-secure-endpoint.html)을 참조하세요.

   ```
   helm install livy-demo \
     oci://895885662937.dkr.ecr.region-id.amazonaws.com/livy \
     --version 7.12.0 \
     --namespace livy-ns \
     --set image=ECR-registry-account.dkr.ecr.region-id.amazonaws.com/livy/emr-7.12.0:latest \
     --set sparkNamespace=<spark-ns> \
     --create-namespace
   ```

   다음과 같이 출력되어야 합니다.

   ```
   NAME: livy-demo
   LAST DEPLOYED: Mon Mar 18 09:23:23 2024
   NAMESPACE: livy-ns
   STATUS: deployed
   REVISION: 1
   TEST SUITE: None
   NOTES:
   The Livy server has been installed.
   Check installation status:
   1. Check Livy Server pod is running
     kubectl --namespace livy-ns get pods -l "app.kubernetes.io/instance=livy-demo"
   2. Verify created NLB is in Active state and it's target groups are healthy (if loadbalancer.enabled is true)
   
   Access LIVY APIs:
       # Ensure your NLB is active and healthy
       # Get the Livy endpoint using command:
       LIVY_ENDPOINT=$(kubectl get svc -n livy-ns -l app.kubernetes.io/instance=livy-demo,emr-containers.amazonaws.com/type=loadbalancer -o jsonpath='{.items[0].status.loadBalancer.ingress[0].hostname}' |  awk '{printf "%s:8998\n", $0}')
       # Access Livy APIs using http://$LIVY_ENDPOINT or https://$LIVY_ENDPOINT (if SSL is enabled)
       # Note: While uninstalling Livy, makes sure the ingress and NLB are deleted after running the helm command to avoid dangling resources
   ```

   Livy 서버 및 Spark 세션의 기본 서비스 계정 이름은 `emr-containers-sa-livy` 및 `emr-containers-sa-spark-livy`입니다. 사용자 지정 이름을 사용하려면 `serviceAccounts.name` 및 `sparkServiceAccount.name` 파라미터를 사용합니다.

   ```
   --set serviceAccounts.name=my-service-account-for-livy
   --set sparkServiceAccount.name=my-service-account-for-spark
   ```

1. 헬름 차트를 설치했는지 확인합니다.

   ```
   helm list -n livy-ns -o yaml
   ```

   `helm list` 명령은 새 헬름 차트에 대한 정보를 반환해야 합니다.

   ```
   app_version: 0.7.1-incubating
   chart: livy-emr-7.12.0
   name: livy-demo
   namespace: livy-ns
   revision: "1"
   status: deployed
   updated: 2024-02-08 22:39:53.539243 -0800 PST
   ```

1. Network Load Balancer가 활성 상태인지 확인합니다.

   ```
   LIVY_NAMESPACE=<livy-ns>
   LIVY_APP_NAME=<livy-app-name>
   AWS_REGION=<AWS_REGION>
   
   # Get the NLB Endpoint URL
   NLB_ENDPOINT=$(kubectl --namespace $LIVY_NAMESPACE get svc -l "app.kubernetes.io/instance=$LIVY_APP_NAME,emr-containers.amazonaws.com/type=loadbalancer" -o jsonpath='{.items[0].status.loadBalancer.ingress[0].hostname}') 
   
   # Get all the load balancers in the account's region
   ELB_LIST=$(aws elbv2 describe-load-balancers --region $AWS_REGION)
   
   # Get the status of the NLB that matching the endpoint from the Kubernetes service
   NLB_STATUS=$(echo $ELB_LIST | grep -A 8 "\"DNSName\": \"$NLB_ENDPOINT\"" | awk '/Code/{print $2}/}/' | tr -d '"},\n')
   echo $NLB_STATUS
   ```

1. 이제 Network Load Balancer의 대상 그룹이 정상인지 확인합니다.

   ```
   LIVY_NAMESPACE=<livy-ns>
   LIVY_APP_NAME=<livy-app-name>
   AWS_REGION=<AWS_REGION>
   
   # Get the NLB endpoint
   NLB_ENDPOINT=$(kubectl --namespace $LIVY_NAMESPACE get svc -l "app.kubernetes.io/instance=$LIVY_APP_NAME,emr-containers.amazonaws.com/type=loadbalancer" -o jsonpath='{.items[0].status.loadBalancer.ingress[0].hostname}') 
   
   # Get all the load balancers in the account's region
   ELB_LIST=$(aws elbv2 describe-load-balancers --region $AWS_REGION)
   
   # Get the NLB ARN from the NLB endpoint
   NLB_ARN=$(echo $ELB_LIST | grep -B 1 "\"DNSName\": \"$NLB_ENDPOINT\"" | awk '/"LoadBalancerArn":/,/"/'| awk '/:/{print $2}' | tr -d \",)
   
   # Get the target group from the NLB. Livy setup only deploys 1 target group
   TARGET_GROUP_ARN=$(aws elbv2 describe-target-groups --load-balancer-arn $NLB_ARN --region $AWS_REGION | awk '/"TargetGroupArn":/,/"/'| awk '/:/{print $2}' | tr -d \",)
   
   # Get health of target group
   aws elbv2 describe-target-health --target-group-arn $TARGET_GROUP_ARN
   ```

   다음은 대상 그룹의 상태를 보여주는 샘플 출력입니다.

   ```
   {
       "TargetHealthDescriptions": [
           {
               "Target": {
                   "Id": "<target IP>",
                   "Port": 8998,
                   "AvailabilityZone": "us-west-2d"
               },
               "HealthCheckPort": "8998",
               "TargetHealth": {
                   "State": "healthy"
               }
           }
       ]
   }
   ```

   NLB가 `active` 상태가 되고 대상 그룹이 `healthy` 상태가 되면 계속할 수 있습니다. 몇 분 정도 걸릴 수 있습니다.

1. Helm 설치에서 Livy 엔드포인트를 검색합니다. Livy 엔드포인트의 보안 여부는 SSL을 활성화했는지 여부에 따라 달라집니다.

   ```
   LIVY_NAMESPACE=<livy-ns>
    LIVY_APP_NAME=livy-app-name
    LIVY_ENDPOINT=$(kubectl get svc -n livy-ns -l app.kubernetes.io/instance=livy-app-name,emr-containers.amazonaws.com/type=loadbalancer -o jsonpath='{.items[0].status.loadBalancer.ingress[0].hostname}' |  awk '{printf "%s:8998\n", $0}')
    echo "$LIVY_ENDPOINT"
   ```

1. Helm 설치에서 Spark 서비스 계정 검색

   ```
   SPARK_NAMESPACE=spark-ns
   LIVY_APP_NAME=<livy-app-name>
   SPARK_SERVICE_ACCOUNT=$(kubectl --namespace $SPARK_NAMESPACE get sa -l "app.kubernetes.io/instance=$LIVY_APP_NAME" -o jsonpath='{.items[0].metadata.name}')
   echo "$SPARK_SERVICE_ACCOUNT"
   ```

   다음 출력과 유사한 결과가 나타날 것입니다.

   ```
   emr-containers-sa-spark-livy
   ```

1. VPC 외부에서 액세스를 활성화하도록 `internalALB=true`를 설정한 경우 Amazon EC2 인스턴스를 생성하고 Network Load Balancer가 EC2 인스턴스의 수신 네트워크 트래픽을 허용하는지 확인합니다. 인스턴스가 Livy 엔드포인트에 액세스할 수 있으려면 이를 수행해야 합니다. VPC 외부에서 엔드포인트를 안전하게 노출하는 방법에 대한 자세한 내용은 [TLS/SSL을 사용하여 보안 Apache Livy 엔드포인트 설정](https://docs.aws.amazon.com/emr/latest/EMR-on-EKS-DevelopmentGuide/job-runs-apache-livy-secure-endpoint.html)을 참조하세요.

1. Livy를 설치하면 Spark 애플리케이션을 실행할 `emr-containers-sa-spark` 서비스 계정이 생성됩니다. Spark 애플리케이션이 S3와 같은 AWS 리소스를 사용하거나 AWS API 또는 CLI 작업을 호출하는 경우 IAM 역할을 Spark 서비스 계정에 필요한 권한과 연결해야 합니다. 자세한 내용은 [서비스 계정에 대한 IAM 역할(IRSA)을 사용하여 클러스터 액세스 권한 설정](https://docs.aws.amazon.com/emr/latest/EMR-on-EKS-DevelopmentGuide/job-runs-apache-livy-irsa.html)을 참조하세요.

Apache Livy는 Livy를 설치하는 동안 사용할 수 있는 추가 구성을 지원합니다. 자세한 내용은 Amazon EMR on EKS 릴리스의 Apache Livy 설치 속성을 참조하세요.

# Amazon EMR on EKS에 대한 Apache Livy를 사용하여 Spark 애플리케이션 실행
<a name="job-runs-apache-livy-run-spark"></a>

Apache Livy로 Spark 애플리케이션을 실행하기 전에 [Amazon EMR on EKS에 대한 Apache Livy 설정](https://docs.aws.amazon.com/emr/latest/EMR-on-EKS-DevelopmentGuide/job-runs-apache-livy-setup.html) 및 [Amazon EMR on EKS에 대한 Apache Livy 시작하기](https://docs.aws.amazon.com/emr/latest/EMR-on-EKS-DevelopmentGuide/job-runs-apache-livy-install.html)의 단계를 완료했는지 확인합니다.

Apache Livy를 사용하여 두 가지 유형의 애플리케이션을 실행할 수 있습니다.
+ 배치 세션 - Spark 배치 작업을 제출하는 Livy 워크로드의 한 유형.
+ 대화형 세션 - Spark 쿼리를 실행할 수 있는 프로그래밍 방식 및 시각적 인터페이스를 제공하는 Livy 워크로드의 한 유형.

**참고**  
서로 다른 세션의 드라이버 및 실행기 포드는 서로 통신할 수 있습니다. 네임스페이스는 포드 간 보안을 보장하지 않습니다. Kubernetes는 지정된 네임스페이스 내 포드 하위 세트에 대한 선택적 권한을 허용하지 않습니다.

## 배치 세션 실행
<a name="job-runs-apache-livy-run-spark-batch"></a>

배치 작업을 제출하려면 다음 명령을 사용합니다.

```
curl -s -k -H 'Content-Type: application/json' -X POST \
      -d '{
            "name": "my-session",
            "file": "entryPoint_location (S3 or local)",
            "args": ["argument1", "argument2", ...],
            "conf": {
                "spark.kubernetes.namespace": "<spark-namespace>",
                "spark.kubernetes.container.image": "public.ecr.aws/emr-on-eks/spark/emr-7.12.0:latest",
                "spark.kubernetes.authenticate.driver.serviceAccountName": "<spark-service-account>"
            }
          }' <livy-endpoint>/batches
```

배치 작업을 모니터링하려면 다음 명령을 사용합니다.

```
curl -s -k -H 'Content-Type: application/json' -X GET <livy-endpoint>/batches/my-session
```

## 대화형 세션 구성
<a name="job-runs-apache-livy-run-spark-interactive"></a>

Apache Livy를 사용하여 대화형 세션을 실행하려면 다음 단계를 참조하세요.

1. 자체 호스팅 또는 SageMaker AI Jupyter Notebook과 같은 관리형 Jupyter Notebook에 액세스할 수 있는지 확인합니다. Jupyter Notebook에 [sparkmagic](https://github.com/jupyter-incubator/sparkmagic/blob/master/README.md)이 설치되어 있어야 합니다.

1. Spark 구성 `spark.kubernetes.file.upload.path`에 대한 버킷을 생성합니다. Spark 서비스 계정이 버킷에 대한 읽기 및 쓰기 액세스 권한을 보유하는지 확인합니다. Spark 서비스 계정을 구성하는 방법에 대한 자세한 내용은 서비스 계정에 대한 IAM 역할(IRSA)을 사용하여 액세스 권한 설정을 참조하세요.

1. `%load_ext sparkmagic.magics` 명령을 사용하여 Jupyter Notebook에 sparkmagic을 로드합니다.

1. `%manage_spark` 명령을 실행하여 Jupyter Notebook으로 Livy 엔드포인트를 설정합니다. **엔드포인트 추가** 탭을 선택하고 구성된 인증 유형을 선택하며 노트북에 Livy 엔드포인트를 추가한 다음, **엔드포인트 추가**를 선택합니다.

1. 다시 `%manage_spark`를 실행하여 Spark 컨텍스트를 생성한 다음, **세션 생성**으로 이동합니다. Livy 엔드포인트를 선택하고 고유한 세션 이름을 지정하며 언어를 선택한 후 다음 속성을 추가합니다.

   ```
   {
     "conf": {
       "spark.kubernetes.namespace": "livy-namespace",
       "spark.kubernetes.container.image": "public.ecr.aws/emr-on-eks/spark/emr-7.12.0:latest",
       "spark.kubernetes.authenticate.driver.serviceAccountName": "<spark-service-account>", 
       "spark.kubernetes.file.upload.path": "<URI_TO_S3_LOCATION_>"
     }
   }
   ```

1. 애플리케이션을 제출하고 Spark 컨텍스트가 생성될 때까지 기다립니다.

1. 대화형 세션의 상태를 모니터링하려면 다음 명령을 실행합니다.

   ```
   curl -s -k -H 'Content-Type: application/json' -X GET livy-endpoint/sessions/my-interactive-session
   ```

## Spark 애플리케이션 모니터링
<a name="job-runs-apache-livy-run-ui"></a>

Livy UI를 사용하여 Spark 애플리케이션의 진행 상황을 모니터링하려면 `http://<livy-endpoint>/ui` 링크를 사용합니다.

# Amazon EMR on EKS에서 Apache Livy 제거
<a name="job-runs-apache-livy-uninstall"></a>

다음 단계를 수행하여 Apache Livy를 제거합니다.

1. 네임스페이스의 이름 및 애플리케이션 이름을 사용하여 Livy 설정을 삭제합니다. 이 예제에서 애플리케이션 이름은 `livy-demo`이고 네임스페이스는 `livy-ns`입니다.

   ```
   helm uninstall livy-demo -n livy-ns
   ```

1. 제거 시 Amazon EMR on EKS는 Livy의 Kubernetes 서비스, AWS 로드 밸런서 및 설치 중에 생성한 대상 그룹을 삭제합니다. 리소스를 삭제하는 데 몇 분 정도 걸릴 수 있습니다. 네임스페이스에 Livy를 다시 설치하기 전에 리소스가 삭제되었는지 확인합니다.

1. Spark 네임스페이스를 삭제합니다.

   ```
   kubectl delete namespace spark-ns
   ```

# Amazon EMR on EKS에서 Apache Livy에 대한 보안
<a name="job-runs-apache-livy-security"></a>

Amazon EMR on EKS에서 Apache Livy에 대한 보안을 구성하는 방법에 대한 자세한 내용은 다음 주제를 참조하세요. 이러한 옵션에는 전송 계층 보안, 조직 내 개인의 역할을 기반으로 하는 액세스인 역할 기반 액세스 제어, 부여된 권한을 기반으로 리소스에 대한 액세스를 제공하는 IAM 역할 사용이 포함됩니다.

**Topics**
+ [TLS/SSL을 사용하여 보안 Apache Livy 엔드포인트 설정](job-runs-apache-livy-secure-endpoint.md)
+ [역할 기반 액세스 제어(RBAC)를 사용하여 Apache Livy 및 Spark 애플리케이션 권한 설정](job-runs-apache-livy-rbac.md)
+ [서비스 계정에 대한 IAM 역할(IRSA)을 사용하여 액세스 권한 설정](job-runs-apache-livy-irsa.md)

# TLS/SSL을 사용하여 보안 Apache Livy 엔드포인트 설정
<a name="job-runs-apache-livy-secure-endpoint"></a>

엔드투엔드 TLS 및 SSL 암호화를 사용하여 Amazon EMR on EKS에 대해 Apache Livy를 설정하는 방법에 대한 자세한 내용은 다음 섹션을 참조하세요.

## TLS 및 SSL 암호화 설정
<a name="job-runs-apache-livy-security-tls"></a>

Apache Livy 엔드포인트에서 SSL 암호화를 설정하려면 다음 단계를 수행합니다.
+ [Secrets Store CSI Driver and AWS Secrets and Configuration Provider(ASCP) 설치](https://docs.aws.amazon.com/secretsmanager/latest/userguide/integrating_csi_driver.html) - Secrets Store CSI Driver 및 ASCP는 Livy 서버 포드가 SSL을 활성화하는 데 필요한 Livy의 JKS 인증서와 암호를 안전하게 저장합니다. Secrets Store CSI 드라이버만 설치하고 지원되는 다른 보안 암호 제공업체를 사용할 수도 있습니다.
+ [ACM 인증서 생성](https://docs.aws.amazon.com/acm/latest/userguide/gs-acm-request-public.html) - 이 인증서는 클라이언트와 ALB 엔드포인트 간 연결을 보안하는 데 필요합니다.
+ ALB 엔드포인트와 Livy 서버 간의 연결을 보호하는 데 AWS Secrets Manager 필요한에 대한 JKS 인증서, 키 암호 및 키 스토어 암호를 설정합니다.
+ Livy 서비스 계정에 보안 암호를 검색할 수 있는 권한을 추가합니다 AWS Secrets Manager . Livy 서버는 ASCP에서 보안 암호를 검색하고 Livy 구성을 추가하여 Livy 서버를 보호하려면 이러한 권한이 필요합니다. 서비스 계정에 IAM 권한을 추가하려면 서비스 계정에 대한 IAM 역할(IRSA)을 사용하여 액세스 권한 설정을 참조하세요.

### 에 대한 키 및 키 스토어 암호를 사용하여 JKS 인증서 설정 AWS Secrets Manager
<a name="job-runs-apache-livy-jks-certificate"></a>

다음 단계를 수행하여 키 및 키 저장소 암호를 사용해 JKS 인증서를 설정합니다.

1. Livy 서버의 키 저장소 파일을 생성합니다.

   ```
   keytool -genkey -alias <host> -keyalg RSA -keysize 2048 –dname CN=<host>,OU=hw,O=hw,L=<your_location>,ST=<state>,C=<country> –keypass <keyPassword> -keystore <keystore_file> -storepass <storePassword> --validity 3650
   ```

1. 인증서를 생성합니다.

   ```
   keytool -export -alias <host> -keystore mykeystore.jks -rfc -file mycertificate.cert -storepass <storePassword>
   ```

1. 신뢰 저장소 파일을 생성합니다.

   ```
   keytool -import -noprompt -alias <host>-file <cert_file> -keystore <truststore_file> -storepass <truststorePassword>
   ```

1. JKS 인증서를에 저장합니다 AWS Secrets Manager. `livy-jks-secret`을 보안 암호로, `fileb://mykeystore.jks`를 키 저장소 JKS 인증서의 경로로 바꿉니다.

   ```
   aws secretsmanager create-secret \ 
   --name livy-jks-secret \
   --description "My Livy keystore JKS secret" \
   --secret-binary fileb://mykeystore.jks
   ```

1. Secrets Manager에 키 저장소 및 키 암호를 저장합니다. 자체 파라미터를 사용해야 합니다.

   ```
   aws secretsmanager create-secret \
   --name livy-jks-secret \
   --description "My Livy key and keystore password secret" \
   --secret-string "{\"keyPassword\":\"<test-key-password>\",\"keyStorePassword\":\"<test-key-store-password>\"}"
   ```

1. 다음 명령으로 Livy 서버 네임스페이스를 생성합니다.

   ```
   kubectl create ns <livy-ns>
   ```

1. JKS 인증서와 암호가 있는 Livy 서버에 대한 `ServiceProviderClass` 객체를 생성합니다.

   ```
   cat >livy-secret-provider-class.yaml << EOF
   apiVersion: secrets-store.csi.x-k8s.io/v1
   kind: SecretProviderClass
   metadata:
     name: aws-secrets
   spec:
     provider: aws
     parameters:
       objects: |
           - objectName: "livy-jks-secret"
             objectType: "secretsmanager"
           - objectName: "livy-passwords"
             objectType: "secretsmanager"
                        
   EOF
   kubectl apply -f livy-secret-provider-class.yaml -n <livy-ns>
   ```

## SSL 지원 Apache Livy 시작하기
<a name="job-runs-apache-livy-ssl-enabled-getting-started"></a>

Livy 서버에서 SSL을 활성화한 후 AWS Secrets Manager에서 `keyStore` 및 `keyPasswords` 보안 암호에 액세스할 수 있도록 `serviceAccount`를 설정해야 합니다.

1. Livy 서버 네임스페이스를 생성합니다.

   ```
   kubectl create namespace <livy-ns>
   ```

1. Secrets Manager의 보안 암호에 액세스할 수 있도록 Livy 서비스 계정을 설정합니다. IRSA 설정에 대한 자세한 내용은 [Apache Livy를 설치하는 동안 IRSA 설정](https://docs.aws.amazon.com/emr/latest/EMR-on-EKS-DevelopmentGuide/job-runs-apache-livy-irsa.html#job-runs-apache-livy-irsa)을 참조하세요.

   ```
   aws ecr get-login-password \--region region-id | helm registry login \
   --username AWS \
   --password-stdin ECR-registry-account.dkr.ecr.region-id.amazonaws.com
   ```

1. Livy를 설치합니다. 헬름 차트 --version 파라미터의 경우 Amazon EMR 릴리스 레이블(`7.1.0`)을 사용합니다. 또한 Amazon ECR 레지스트리 계정 ID 및 리전 ID를 자체 ID로 바꾸어야 합니다. [리전별로 Amazon ECR 레지스트리 계정](https://docs.aws.amazon.com/emr/latest/EMR-on-EKS-DevelopmentGuide/docker-custom-images-tag.html#docker-custom-images-ECR) AWS 리전 에서에 해당하는 `ECR-registry-account` 값을 찾을 수 있습니다.

   ```
   helm install <livy-app-name> \
     oci://895885662937.dkr.ecr.region-id.amazonaws.com/livy \
     --version 7.12.0 \
     --namespace livy-namespace-name \
     --set image=<ECR-registry-account.dkr.ecr>.<region>.amazonaws.com/livy/emr-7.12.0:latest \
     --set sparkNamespace=spark-namespace \
     --set ssl.enabled=true
     --set ssl.CertificateArn=livy-acm-certificate-arn
     --set ssl.secretProviderClassName=aws-secrets
     --set ssl.keyStoreObjectName=livy-jks-secret
     --set ssl.keyPasswordsObjectName=livy-passwords
     --create-namespace
   ```

1. [Amazon EMR on EKS에 Apache Livy 설치](https://docs.aws.amazon.com/emr/latest/EMR-on-EKS-DevelopmentGuide/job-runs-apache-livy-setup.html#job-runs-apache-livy-install)의 5단계부터 계속합니다.

# 역할 기반 액세스 제어(RBAC)를 사용하여 Apache Livy 및 Spark 애플리케이션 권한 설정
<a name="job-runs-apache-livy-rbac"></a>

Livy를 배포하기 위해 Amazon EMR on EKS는 서버 서비스 계정 및 역할과 Spark 서비스 계정 및 역할을 생성합니다. 이러한 역할에는 설정을 완료하고 Spark 애플리케이션을 실행하는 데 필요한 RBAC 권한이 있어야 합니다.

**서버 서비스 계정 및 역할에 대한 RBAC 권한**

Amazon EMR on EKS는 Spark 작업에 대한 Livy 세션을 관리하고 수신 및 기타 리소스 사이에서 트래픽을 라우팅하도록 Livy 서버 서비스 계정 및 역할을 생성합니다.

이 서비스 계정의 기본 이름은 `emr-containers-sa-livy`입니다. 이 경우 다음 권한이 있어야 합니다.

```
rules:
- apiGroups:
  - ""
  resources:
  - "namespaces"
  verbs:
  - "get"
- apiGroups:
  - ""
  resources:
  - "serviceaccounts"
    "services"
    "configmaps"
    "events"
    "pods"
    "pods/log"
  verbs:
  - "get"
    "list"
    "watch"
    "describe"
    "create"
    "edit"
    "delete"
    "deletecollection"
    "annotate"
    "patch"
    "label"
 - apiGroups:
   - ""
   resources:
   - "secrets"
   verbs:
   - "create"
     "patch"
     "delete"
     "watch"
 - apiGroups:
   - ""
   resources:
   - "persistentvolumeclaims"
   verbs:
   - "get"
     "list"
     "watch"
     "describe"
     "create"
     "edit"
     "delete"
     "annotate"
     "patch"
     "label"
```

**Spark 서비스 계정 및 역할에 대한 RBAC 권한**

Spark 드라이버 포드에는 포드와 동일한 네임스페이스에 있는 Kubernetes 서비스 계정이 필요합니다. 이 서비스 계정에는 실행기 포드 그리고 드라이버 포드에 필요한 모든 리소스를 관리할 수 있는 권한이 필요합니다. 네임스페이스의 기본 서비스 계정에 필요한 권한이 없으면 드라이버가 실패하고 종료됩니다. 다음 RBAC 권한이 필요합니다.

```
rules:
- apiGroups:
  - ""
    "batch"
    "extensions"
    "apps"
  resources:
  - "configmaps"
    "serviceaccounts"
    "events"
    "pods"
    "pods/exec"
    "pods/log"
    "pods/portforward"
    "secrets"
    "services"
    "persistentvolumeclaims"
    "statefulsets"
  verbs:
  - "create"
    "delete"
    "get"
    "list"
    "patch"
    "update"
    "watch"
    "describe"
    "edit"
    "deletecollection"
    "patch"
    "label"
```

# 서비스 계정에 대한 IAM 역할(IRSA)을 사용하여 액세스 권한 설정
<a name="job-runs-apache-livy-irsa"></a>

기본적으로 Livy 서버와 Spark 애플리케이션의 드라이버 및 실행기는 AWS 리소스에 액세스할 수 없습니다. 서버 서비스 계정 및 Spark 서비스 계정은 Livy 서버의 AWS 리소스 및 Spark 애플리케이션의 포드에 대한 액세스를 제어합니다. 액세스 권한을 부여하려면 서비스 계정을 필요한 AWS 권한이 있는 IAM 역할로 매핑해야 합니다.

Apache Livy를 설치하기 전, 설치 중 또는 설치를 완료한 후 IRSA 매핑을 설정할 수 있습니다.

## Apache Livy 설치 중 IRSA 설정(서버 서비스 계정용)
<a name="job-runs-apache-livy-irsa"></a>

**참고**  
이 매핑은 서버 서비스 계정에서만 지원됩니다.

1. [Amazon EMR on EKS에 대한 Apache Livy 설정](https://docs.aws.amazon.com/emr/latest/EMR-on-EKS-DevelopmentGuide/job-runs-apache-livy-setup.html)을 완료하고 [Amazon EMR on EKS에서 Apache Livy 설치](https://docs.aws.amazon.com/emr/latest/EMR-on-EKS-DevelopmentGuide/job-runs-apache-livy-install.html)를 수행하는 중인지 확인합니다.

1. Livy 서버에 대한 Kubernetes 네임스페이스를 생성합니다. 이 예제에서 네임스페이스의 이름은 `livy-ns`입니다.

1. 포드가 액세스할에 AWS 서비스 대한 권한이 포함된 IAM 정책을 생성합니다. 다음 예제에서는 Spark 진입점에 대한 Amazon S3 리소스를 가져오는 IAM 정책을 생성합니다.

   ```
   cat >my-policy.json <<EOF{
   "Version": "2012-10-17",		 	 	 
       "Statement": [
           {
   "Effect": "Allow",
               "Action": "s3:GetObject",
               "Resource": "arn:aws:s3:::my-spark-entrypoint-bucket"
           }
       ]
   }
   EOF
   
   aws iam create-policy --policy-name my-policy --policy-document file://my-policy.json
   ```

1. 다음 명령을 사용하여 AWS 계정 ID를 변수로 설정합니다.

   ```
   account_id=$(aws sts get-caller-identity --query "Account" --output text)
   ```

1. 클러스터의 OpenID Connect(OIDC) ID 제공업체를 환경 변수로 설정합니다.

   ```
   oidc_provider=$(aws eks describe-cluster --name my-cluster --region $AWS_REGION --query "cluster.identity.oidc.issuer" --output text | sed -e "s/^https:\/\///")
   ```

1. 서비스 계정의 네임스페이스 및 이름에 대한 변수를 설정합니다. 자체 값을 사용해야 합니다.

   ```
   export namespace=default
   export service_account=my-service-account
   ```

1. 다음 명령으로 신뢰 정책 파일을 생성합니다. 네임스페이스 내 모든 서비스 계정에 역할의 액세스 권한을 부여하려면 다음 명령을 복사하고 `StringEquals`를 `StringLike`로 바꾸고 `$service_account`를 `*`로 바꿉니다.

   ```
   cat >trust-relationship.json <<EOF
   {
     "Version": "2012-10-17",		 	 	 
     "Statement": [
       {
         "Effect": "Allow",
         "Principal": {
           "Federated": "arn:aws:iam::$account_id:oidc-provider/$oidc_provider"
         },
         "Action": "sts:AssumeRoleWithWebIdentity",
         "Condition": {
           "StringEquals": {
             "$oidc_provider:aud": "sts.amazonaws.com",
             "$oidc_provider:sub": "system:serviceaccount:$namespace:$service_account"
           }
         }
       }
     ]
   }
   EOF
   ```

1. 역할을 생성합니다.

   ```
   aws iam create-role --role-name my-role --assume-role-policy-document file://trust-relationship.json --description "my-role-description"
   ```

1. 다음 Helm 설치 명령을 사용하여 IRSA를 매핑하도록 `serviceAccount.executionRoleArn`을 설정합니다. 다음은 Helm 설치 명령의 예제입니다. [리전별로 Amazon ECR 레지스트리 계정](https://docs.aws.amazon.com/emr/latest/EMR-on-EKS-DevelopmentGuide/docker-custom-images-tag.html#docker-custom-images-ECR) AWS 리전 에서에 해당하는 `ECR-registry-account` 값을 찾을 수 있습니다.

   ```
   helm install livy-demo \
     oci://895885662937.dkr.ecr.us-west-2.amazonaws.com/livy \
     --version 7.12.0 \
     --namespace livy-ns \
     --set image=ECR-registry-account.dkr.ecr.region-id.amazonaws.com/livy/emr-7.12.0:latest \
     --set sparkNamespace=spark-ns \
     --set serviceAccount.executionRoleArn=arn:aws:iam::123456789012:role/my-role
   ```

## Spark 서비스 계정에 IRSA 매핑
<a name="job-runs-apache-livy-irsa-spark"></a>

IRSA를 Spark 서비스 계정에 매핑하기 전에 다음 항목을 완료했는지 확인합니다.
+ [Amazon EMR on EKS에 대한 Apache Livy 설정](https://docs.aws.amazon.com/emr/latest/EMR-on-EKS-DevelopmentGuide/job-runs-apache-livy-setup.html)을 완료하고 [Amazon EMR on EKS에서 Apache Livy 설치](https://docs.aws.amazon.com/emr/latest/EMR-on-EKS-DevelopmentGuide/job-runs-apache-livy-install.html)를 수행하는 중인지 확인합니다.
+ 클러스터에 대한 기존 IAM OpenID Connect(OIDC) 제공업체가 있어야 합니다. 이미 있는지 확인하거나 새로 생성하는 방법을 알아보려면 [Create an IAM OIDC provider for your cluster](https://docs.aws.amazon.com/eks/latest/userguide/enable-iam-roles-for-service-accounts.html)를 참조하세요.
+ `eksctl` CLI의 버전 0.171.0 이상 또는 AWS CloudShell을 설치했는지 확인합니다. `eksctl`을 설치 또는 업그레이드하려면 `eksctl` 설명서의 [Installation](https://eksctl.io/installation/)을 참조하세요.

다음 단계를 수행하여 IRSA를 Spark 서비스 계정에 매핑합니다.

1. 다음 명령을 사용하여 Spark 서비스 계정을 가져옵니다.

   ```
   SPARK_NAMESPACE=<spark-ns>
   LIVY_APP_NAME=<livy-app-name>
   kubectl --namespace $SPARK_NAMESPACE describe sa -l "app.kubernetes.io/instance=$LIVY_APP_NAME" | awk '/^Name:/ {print $2}'
   ```

1. 서비스 계정의 네임스페이스 및 이름에 대한 변수를 설정합니다.

   ```
   export namespace=default
   export service_account=my-service-account
   ```

1. 다음 명령을 사용하여 IAM 역할에 대한 신뢰 정책 파일을 생성합니다. 다음 예제에서는 네임스페이스 내 모든 서비스 계정에 역할을 사용할 수 있는 권한을 부여합니다. 이를 수행하려면 `StringEquals`를 `StringLike`로 바꾸고 `$service_account`를 \$1로 바꿉니다.

   ```
   cat >trust-relationship.json <<EOF
   {
     "Version": "2012-10-17",		 	 	 
     "Statement": [
       {
         "Effect": "Allow",
         "Principal": {
           "Federated": "arn:aws:iam::$account_id:oidc-provider/$oidc_provider"
         },
         "Action": "sts:AssumeRoleWithWebIdentity",
         "Condition": {
           "StringEquals": {
             "$oidc_provider:aud": "sts.amazonaws.com",
             "$oidc_provider:sub": "system:serviceaccount:$namespace:$service_account"
           }
         }
       }
     ]
   }
   EOF
   ```

1. 역할을 생성합니다.

   ```
   aws iam create-role --role-name my-role --assume-role-policy-document file://trust-relationship.json --description "my-role-description"
   ```

1. 다음 `eksctl` 명령을 사용하여 서버 또는 Spark 서비스 계정을 매핑합니다. 자체 값을 사용해야 합니다.

   ```
    eksctl create iamserviceaccount --name spark-sa \
    --namespace spark-namespace --cluster livy-eks-cluster \
    --attach-role-arn arn:aws:iam::0123456789012:role/my-role \
    --approve --override-existing-serviceaccounts
   ```

# Amazon EMR on EKS 릴리스에서 Apache Livy에 대한 설치 속성
<a name="job-runs-apache-livy-installation-properties"></a>

Apache Livy 설치에서는 Livy 헬름 차트 버전을 선택할 수 있습니다. 헬름 차트는 설치 및 설정 환경을 사용자 지정할 수 있는 다양한 속성을 제공합니다. 이러한 속성은 Amazon EMR on EKS 릴리스 7.1.0 이상에서 지원됩니다.

**Topics**
+ [Amazon EMR 7.1.0 설치 속성](#job-runs-apache-livy-installation-properties-710)

## Amazon EMR 7.1.0 설치 속성
<a name="job-runs-apache-livy-installation-properties-710"></a>

다음 표에서는 지원되는 모든 Livy 속성을 설명합니다. Apache Livy를 설치하는 경우 Livy 헬름 차트 버전을 선택할 수 있습니다. 설치 중에 속성을 설정하려면 `--set <property>=<value>` 명령을 사용합니다.


| 속성 | 설명 | 기본값 | 
| --- | --- | --- | 
| image | Livy 서버의 Amazon EMR 릴리스 URI. 필수 구성입니다. | "" | 
| sparkNamespace | Livy Spark 세션을 실행할 네임스페이스. 예를 들어, "livy"를 지정합니다. 필수 구성입니다. | "" | 
| nameOverride | livy 대신 이름을 제공합니다. 이름은 모든 Livy 리소스에 대한 레이블로 설정됩니다. | "livy" | 
| fullnameOverride | 리소스의 전체 이름 대신 사용할 이름을 제공합니다. | "" | 
| ssl.enabled | Livy 엔드포인트에서 Livy 서버로 엔드투엔드 SSL을 활성화합니다. | FALSE | 
| ssl.certificateArn | SSL이 활성화된 경우 서비스에서 생성한 NLB에 대한 ACM 인증서 ARN입니다. | "" | 
| ssl.secretProviderClassName | SSL이 활성화된 경우 SSL과의 Livy 서버 연결을 위해 NLB를 보안하는 보안 암호 제공업체 클래스 이름입니다. | "" | 
| ssl.keyStoreObjectName | SSL이 활성화된 경우 보안 암호 제공업체 클래스의 키 저장소 인증서에 대한 객체 이름입니다. | "" | 
| ssl.keyPasswordsObjectName | SSL이 활성화된 경우 키 저장소 및 키 암호가 있는 보안 암호의 객체 이름. | "" | 
| rbac.create | true인 경우 RBAC 리소스를 생성합니다. | FALSE | 
| serviceAccount.create | true인 경우 Livy 서비스 계정을 생성합니다. | TRUE | 
| serviceAccount.name | Livy에 대해 사용할 서비스 계정의 이름. 이 속성을 설정하지 않고 서비스 계정을 생성하면 Amazon EMR on EKS는 fullname 재정의 속성을 사용하여 이름을 자동 생성합니다. | "emr-containers-sa-livy" | 
| serviceAccount.executionRoleArn | Livy 서비스 계정의 실행 역할 ARN. | "" | 
| sparkServiceAccount.create | true인 경우 .Release.Namespace에서 Spark 서비스 계정 생성 | TRUE | 
| sparkServiceAccount.name | Spark에 대해 사용할 서비스 계정의 이름. 이 속성을 설정하지 않고 Spark 서비스 계정을 생성하면 Amazon EMR on EKS는 -spark-livy 접미사의 fullnameOverride 속성으로 이름을 자동 생성합니다. | "emr-containers-sa-spark-livy" | 
| service.name | Livy 서비스의 이름 | "emr-containers-livy" | 
| service.annotations | Livy 서비스 주석 | \$1\$1 | 
| loadbalancer.enabled | Amazon EKS 클러스터 외부에 Livy 엔드포인트를 노출하는 데 사용되는 Livy 서비스에 대한 로드 밸런서를 생성할지 여부. | FALSE | 
| loadbalancer.internal | Livy 엔드포인트를 VPC 내부 또는 외부로 구성할지 여부. 이 속성을 `FALSE`로 설정하면 엔드포인트가 VPC 외부의 소스에 노출됩니다. 엔드포인트를 TLS/SSL로 보안하는 것이 좋습니다. 자세한 내용은 [TLS 및 SSL 암호화 설정](https://docs.aws.amazon.com/emr/latest/EMR-on-EKS-DevelopmentGuide/job-runs-apache-livy-security.html#job-runs-apache-livy-security-tls)을 참조하세요. | FALSE | 
| imagePullSecrets | 프라이빗 리포지토리에서 Livy 이미지를 가져오는 데 사용할 imagePullSecret 이름 목록. | [] | 
| 리소스 | Livy 컨테이너에 대한 리소스 요청 및 제한. | \$1\$1 | 
| nodeSelector | Livy 포드를 예약할 노드. | \$1\$1 | 
| 허용 오차 | 정의할 Livy 포드 허용치를 포함하는 목록. | [] | 
| affinity | Livy 포드 선호도 규칙. | \$1\$1 | 
| persistence.enabled | true인 경우 세션 디렉터리의 지속성을 활성화합니다. | FALSE | 
| persistence.subPath | 세션 디렉터리에 탑재할 PVC 하위 경로. | "" | 
| persistence.existingClaim | 새 PVC를 생성하는 대신 사용할 PVC. | \$1\$1 | 
| persistence.storageClass | 사용할 스토리지 클래스. 이 파라미터를 정의하려면 storageClassName: <storageClass> 형식을 사용합니다. 이 파라미터를 "-"로 설정하면 동적 프로비저닝이 비활성화됩니다. 이 파라미터를 null로 설정하거나 아무 것도 지정하지 않으면 Amazon EMR on EKS는 storageClassName을 설정하지 않으며 기본 프로비저너를 사용합니다. | "" | 
| persistence.accessMode | PVC 액세스 모드. | ReadWriteOnce | 
| persistence.size | PVC 크기. | 20Gi | 
| persistence.annotations | PVC에 대한 추가 주석. | \$1\$1 | 
| env.\$1 | Livy 컨테이너로 설정할 추가 env. 자세한 내용은 [Livy를 설치하는 동안 자체 Livy 및 Spark 구성 입력](https://docs.aws.amazon.com/emr/latest/EMR-on-EKS-DevelopmentGuide/job-runs-apache-livy-troubleshooting.html)을 참조하세요. | \$1\$1 | 
| envFrom.\$1 | Kubernetes 구성 맵 또는 보안 암호에서 Livy로 설정할 추가 envs. | [] | 
| livyConf.\$1 | 탑재된 Kubernetes 구성 맵 또는 보안 암호에서 설정할 추가 livy.conf 항목. | \$1\$1 | 
| sparkDefaultsConf.\$1 | 탑재된 Kubernetes 구성 맵 또는 보안 암호에서 설정할 추가 spark-defaults.conf 항목. | \$1\$1 | 

# 일반적인 환경 변수 형식 오류 문제 해결
<a name="job-runs-apache-livy-troubleshooting"></a>

Livy 및 Spark 구성을 입력하는 경우 지원되지 않으며 오류를 일으킬 수 있는 환경 변수 형식이 있습니다. 이 절차에서는 올바른 형식을 사용하는 데 도움이 되는 일련의 단계를 안내합니다.

**Livy를 설치하는 동안 자체 Livy 및 Spark 구성 입력**

`env.*` Helm 속성을 사용하여 모든 Apache Livy 또는 Apache Spark 환경 변수를 구성할 수 있습니다. 아래 단계를 수행하여 `example.config.with-dash.withUppercase` 예제 구성을 지원되는 환경 변수 형식으로 변환합니다.

1. 대문자를 1 및 소문자를 바꿉니다. 예를 들어, `example.config.with-dash.withUppercase`는 `example.config.with-dash.with1uppercase`가 됩니다.

1. 대시(-)를 0으로 바꿉니다. 예를 들어, `example.config.with-dash.with1uppercase`는 `example.config.with0dash.with1uppercase`가 됩니다.

1. 점(.)을 밑줄(\$1)로 바꿉니다. 예를 들어, `example.config.with0dash.with1uppercase`는 `example_config_with0dash_with1uppercase`가 됩니다.

1. 모든 소문자를 대문자로 바꿉니다.

1. 변수 이름에 `LIVY_` 접두사를 추가합니다.

1. --set env.*YOUR\$1VARIABLE\$1NAME*.value=*yourvalue* 형식을 사용하여 헬름 차트를 통해 Livy를 설치하는 동안 변수를 사용합니다.

예를 들어, Livy 및 Spark 구성 `livy.server.recovery.state-store = filesystem` 및 `spark.kubernetes.executor.podNamePrefix = my-prefix`를 설정하려면 다음 Helm 속성을 사용합니다.

```
—set env.LIVY_LIVY_SERVER_RECOVERY_STATE0STORE.value=filesystem
—set env.LIVY_SPARK_KUBERNETES_EXECUTOR_POD0NAME0PREFIX.value=myprefix
```