Amazon EMR on EKS での Apache Livy の使用開始 - Amazon EMR

Amazon EMR on EKS での Apache Livy の使用開始

Apache Livy をインストールするには、次の手順を実行します。これには、パッケージマネージャーの設定、Spark ワークロード実行用の名前空間の作成、Livy のインストール、負荷分散の設定、検証ステップが含まれます。Spark でバッチジョブを実行するには、これらの手順を実行する必要があります。

  1. まだ設定していない場合は、Amazon EMR on EKS 用の Apache Livy を設定します。

  2. Amazon ECR レジストリに対し、Helm クライアントを認証します。リージョン別の 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、IAM roles for service accounts) でアクセス権限を設定する」を参照してください。

  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.name パラメータと sparkServiceAccount.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.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、IAM roles for service accounts) でアクセス権限を設定する」を参照してください。

Apache Livy は、Livy のインストール時に使用できる追加の設定をサポートしています。詳細については、「Amazon EMR on EKS リリースでの Apache Livy のインストールプロパティ」を参照してください。