Amazon EMR on EKS에서 Apache Livy 시작하기 - Amazon EMR

Amazon EMR on EKS에서 Apache Livy 시작하기

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

  1. 아직 하지 않은 경우 Amazon EMR에 대한 Apache Livy on EKS를 설정합니다.

  2. Helm 클라이언트를 Amazon ECR 레지스트리에 인증합니다. 리전별로 Amazon 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
  3. Livy를 설정하면 Livy 서버에 대한 한 서비스 계정과 Spark 애플리케이션에 대한 다른 계정이 생성됩니다. 서비스 계정에 대한 IRSA를 설정하려면 서비스 계정에 대한 IAM 역할(IRSA)을 사용하여 액세스 권한 설정을 참조하세요.

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

    kubectl create ns <spark-ns>
  5. 다음 명령을 사용하여 Livy를 설치합니다.

    이 Livy 엔드포인트는 EKS 클러스터의 VPC에 대해서만 내부적으로 사용할 수 있습니다. VPC 이상의 액세스를 활성화하려면 Helm 설치 명령에서 —-set loadbalancer.internal=false를 설정합니다.

    참고

    기본적으로 SSL은 이 Livy 엔드포인트 내에서 활성화되지 않으며, 엔드포인트는 EKS 클러스터의 VPC 내에서만 표시됩니다. loadbalancer.internal=falsessl.enabled=false를 설정하면 비보안 엔드포인트가 VPC 외부로 노출됩니다. 보안 Livy 엔드포인트를 설정하려면 TLS/SSL을 사용하여 보안 Apache Livy 엔드포인트 구성을 참조하세요.

    helm install livy-demo \ oci://895885662937.dkr.ecr.region-id.amazonaws.com/livy \ --version 7.3.0 \ --namespace livy-ns \ --set image=ECR-registry-account.dkr.ecr.region-id.amazonaws.com/livy/emr-7.3.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-livyemr-containers-sa-spark-livy입니다. 사용자 지정 이름을 사용하려면 serviceAccounts.namesparkServiceAccount.name 파라미터를 사용합니다.

    --set serviceAccounts.name=my-service-account-for-livy --set sparkServiceAccount.name=my-service-account-for-spark
  6. 헬름 차트를 설치했는지 확인합니다.

    helm list -n livy-ns -o yaml

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

    app_version: 0.7.1-incubating chart: livy-emr-7.3.0 name: livy-demo namespace: livy-ns revision: "1" status: deployed updated: 2024-02-08 22:39:53.539243 -0800 PST
  7. 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
  8. 이제 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 상태가 되면 계속할 수 있습니다. 몇 분 정도 걸릴 수 있습니다.

  9. 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"
  10. 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
  11. VPC 외부에서 액세스를 활성화하도록 internalALB=true를 설정한 경우 Amazon EC2 인스턴스를 생성하고 Network Load Balancer가 EC2 인스턴스의 수신 네트워크 트래픽을 허용하는지 확인합니다. 인스턴스가 Livy 엔드포인트에 액세스할 수 있으려면 이를 수행해야 합니다. VPC 외부에서 엔드포인트를 안전하게 노출하는 방법에 대한 자세한 내용은 TLS/SSL을 사용하여 보안 Apache Livy 엔드포인트 설정을 참조하세요.

  12. Livy를 설치하면 Spark 애플리케이션을 실행할 emr-containers-sa-spark 서비스 계정이 생성됩니다. Spark 애플리케이션이 S3와 같은 AWS 리소스를 사용하거나 AWS API 또는 CLI 작업을 직접 호출하는 경우 IAM 역할을 Spark 서비스 계정에 필요한 권한과 연결해야 합니다. 자세한 내용은 서비스 계정에 대한 IAM 역할(IRSA)을 사용하여 클러스터 액세스 권한 설정을 참조하세요.

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