Amazon EMR on EKS での Apache Livy の使用開始
Apache Livy をインストールするには、次の手順を実行します。これには、パッケージマネージャーの設定、Spark ワークロード実行用の名前空間の作成、Livy のインストール、負荷分散の設定、検証ステップが含まれます。Spark でバッチジョブを実行するには、これらの手順を実行する必要があります。
まだ設定していない場合は、Amazon EMR on EKS 用の Apache Livy を設定します。
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.rproxy.goskope.com-
Livy を設定すると、Livy サーバーのサービスアカウントと Spark アプリケーション用にもう一つのアカウントが作成されます。サービスアカウントの IRSA を設定するには、「サービスアカウント用 IAM ロール (IRSA、IAM roles for service accounts) でアクセス権限を設定する」を参照してください。
-
Spark ワークロードを実行する名前空間を作成します。
kubectl create ns
<spark-ns>
次のコマンドを使用して Livy をインストールします。
この Livy エンドポイントは、EKS クラスターの VPC でのみ内部的に使用できます。VPC 以外のアクセスを有効にするには、Helm インストールコマンドで
—-set loadbalancer.internal=false
を設定します。注記
デフォルトでは、SSL はこの Livy エンドポイント内で有効ではなく、エンドポイントは 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.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-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 チャートをインストールしたことを確認します。
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
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
-
VPC の外部からのアクセスを可能にするように
internalALB=true
を設定した場合は、Amazon EC2 インスタンスを作成し、Network Load Balancer が EC2 インスタンスからのネットワークトラフィックを許可していることを確認します。インスタンスが Livy エンドポイントにアクセスするには、これが必要となります。VPC の外部にエンドポイントを安全に公開する方法の詳細については、「TLS/SSL を使用した安全な Apache Livy エンドポイントの設定」を参照してください。 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 のインストールプロパティ」を参照してください。