

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

# 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 설치 속성을 참조하세요.