开始在亚马逊 EMR 上使用 Apache Livy 在 EKS - Amazon EMR
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅 中国的 Amazon Web Services 服务入门 (PDF)

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

开始在亚马逊 EMR 上使用 Apache Livy 在 EKS

完成以下步骤来安装 Apache Livy。

  1. 如果你还没有,可以在 EKS 上为亚马逊 EMR 设置 Apache Livy

  2. 向 Amazon ECR 注册表验证您的 Helm 客户端。您可以按地区 Amazon Web Services 区域 从 Amazon ECR 注册账户中找到相应的ECR-registry-account值。

    aws ecr get-login-password \--region <AWS_REGION> | helm registry login \ --username Amazon \ --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 以外的访问权限,请—-set loadbalancer.internal=false在 Helm 安装命令中进行设置。

    注意

    默认情况下,此 Livy 终端节点中未启用 SSL,并且该终端节点仅在 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.1.0 \ --namespace livy-ns \ --set image=ECR-registry-account.dkr.ecr.region-id.amazonaws.com/livy/emr-7.1.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.namesparkServiceAccount.name参数。

    --set serviceAccounts.name=my-service-account-for-livy --set sparkServiceAccount.name=my-service-account-for-spark
  6. 确认您已安装了 Helm 图表。

    helm list -n livy-ns -o yaml

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

    app_version: 0.7.1-incubating chart: livy-emr-7.1.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. 如果您设置为internalALB=true允许从 VPC 外部进行访问,请创建一个 Amazon EC2 实例,并确保 Network Load Balancer 允许来自该 EC2 实例的网络流量。您必须这样做才能让实例访问您的 Livy 终端节点。有关在您的 VPC 之外安全地公开终端节点的更多信息,请参阅使用带有 TLS/SSL 的安全 Apache Livy 终端节点进行设置

  12. 安装 Livy 会创建用于运行 Spark 应用程序emr-containers-sa-spark的服务帐户。如果您的 Spark 应用程序使用诸如 S3 之类的任何 Amazon 资源或调用 Amazon API 或 CLI 操作,则必须将具有必要权限的 IAM 角色关联到您的 spark 服务账户。有关更多信息,请参阅使用 IAM 角色为服务账户设置访问权限 (IRSA)

Apache Livy 支持在安装 Livy 时可以使用的其他配置。有关更多信息,请参阅 EKS 版本上亚马逊 EMR 上的 Apache Livy 的安装属性。