

本文属于机器翻译版本。若本译文内容与英语原文存在差异，则一律以英文原文为准。

# 开始使用适用于 Amazon EMR on EKS 的 Apache Livy
<a name="job-runs-apache-livy-install"></a>

完成以下步骤安装 Apache Livy。包括配置软件包管理器、为运行 Spark 工作负载创建命名空间、安装 Livy、设置负载均衡和验证步骤。要使用 Spark 运行批处理作业，必须完成以下步骤。

1. 设置[适用于 Amazon EMR on EKS 的 Apache Livy](https://docs.aws.amazon.com/emr/latest/EMR-on-EKS-DevelopmentGuide/job-runs-apache-livy-setup.html)。

1. 向 Amazon ECR 注册表验证您的 Helm 客户端。您可以[按地区 AWS 区域 从 Amazon ECR 注册账户](https://docs.aws.amazon.com/emr/latest/EMR-on-EKS-DevelopmentGuide/docker-custom-images-tag.html#docker-custom-images-ECR)中找到相应的`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`。
**注意**  
默认情况下，该 Livy 端点未启用 SSL，且该端点仅在 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 图表。

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

   `helm list` 命令应返回有关新 Helm 图表的信息。

   ```
   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. 验证网络负载均衡器是否处于活动状态。

   ```
   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. 现在，验证网络负载均衡器中的目标组是否运行正常。

   ```
   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. 如果您设置为`internalALB=true`允许从 VPC 外部进行访问，请创建一个 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 会创建服务账户 `emr-containers-sa-spark` 来运行 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 安装属性。