本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。
Apache Livy on Amazon EMR on EKS 入門
完成下列步驟以安裝 Apache Livy。其中包括設定套件管理員、建立執行 Spark 工作負載的命名空間、安裝 Livy、設定負載平衡和驗證步驟。您必須完成這些步驟,才能使用 Spark 執行批次任務。
如果您尚未設定 Amazon EMR on EKS 的 Apache Livy。
向 Amazon ECR 登錄檔驗證 Helm 用戶端。您可以從 Amazon ECR AWS 區域 登錄帳戶依區域找到 的對應
ECR-registry-account
值。 https://docs.aws.amazon.com/emr/latest/EMR-on-EKS-DevelopmentGuide/docker-custom-images-tag.html#docker-custom-images-ECRaws ecr get-login-password \--region
<AWS_REGION>
| helm registry login \ --username AWS \ --password-stdin<ECR-registry-account>
.dkr.ecr.<region-id>
.amazonaws.com.rproxy.goskope.com-
設定 Livy 會為 Livy 伺服器建立服務帳戶,並為 Spark 應用程式建立另一個帳戶。若要設定服務帳戶的 IRSA,請參閱使用服務帳戶 (IRSA) 的 IAM 角色設定存取許可。
-
建立命名空間來執行 Spark 工作負載。
kubectl create ns
<spark-ns>
使用下列命令來安裝 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 端點。helm install livy-demo \ oci://895885662937.dkr.ecr.region-id.amazonaws.com/livy \ --version 7.7.0 \ --namespace livy-ns \ --set image=ECR-registry-account.dkr.ecr.region-id.amazonaws.com/livy/emr-7.7.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
確認您已安裝 Helm Chart。
helm list -n livy-ns -o yaml
helm list
命令應會傳回新 Helm Chart 的相關資訊。app_version: 0.7.1-incubating chart: livy-emr-7.7.0 name: livy-demo namespace: livy-ns revision: "1" status: deployed updated: 2024-02-08 22:39:53.539243 -0800 PST
確認 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-
現在請確認 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
,您就可以繼續。可能需要幾分鐘的時間。 從 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"-
從 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
-
如果您
internalALB=true
將 設定為從 VPC 外部啟用存取,請建立 Amazon EC2 執行個體,並確保 Network Load Balancer 允許來自 EC2 執行個體的網路流量。您必須這樣做,執行個體才能存取您的 Livy 端點。如需在 VPC 外部安全地公開端點的詳細資訊,請參閱使用 TLS/SSL 設定安全的 Apache Livy 端點。 安裝 Livy 會建立服務帳戶
emr-containers-sa-spark
以執行 Spark 應用程式。如果您的 Spark 應用程式使用任何 AWS 資源,例如 S3 或呼叫 AWS API 或 CLI 操作,您必須將 IAM 角色與必要的許可連結至您的 Spark 服務帳戶。如需詳細資訊,請參閱使用服務帳戶 (IRSA) 的 IAM 角色設定存取許可。
Apache Livy 支援其他組態,您可以在安裝 Livy 時使用。如需詳細資訊,請參閱 Amazon EMR on EKS 版本上 Apache Livy 的安裝屬性。