Pod Template

在本节中,我们将学习如何使用 Spark on Kubernetes 的 Pod Template功能提交作业。

从 Amazon EMR 版本 5.33.0 及更高版本开始,Amazon EMR on EKS 支持 Spark 的 pod template功能。使用 pod template文件来定义 Spark 配置不支持的driver或executor pod 的配置。

通过指定 spark 属性 spark.kubernetes.driver.podTemplateFilespark.kubernetes.executor.podTemplateFile 来指向S3 中的 pod template文件,然后 Spark 将加载 pod template文件并使用它来构建executor和driver pod。

有关 Spark 的 pod template功能的更多信息,参考 https://spark.apache.org/docs/3.0.0-preview/running-on-kubernetes.html#pod-template

注意: Spark 使用作业执行的Role来加载 pod 模板,因此作业执行角色必须有权访问 Amazon S3的权限才能加载 pod template。

示例

我们将运行一个示例,其中Driver Pod 始终在 ON-DEMAND 实例上创建,而 executor pod 在 SPOT 实例上启动。

注意: 模板文件已经可在 S3 中,下面的示例可以直接运行。

driver template

apiVersion: v1
kind: Pod
spec:
  nodeSelector:
    eks.amazonaws.com/capacityType: ON_DEMAND

executor template

apiVersion: v1
kind: Pod
spec:
  nodeSelector:
    eks.amazonaws.com/capacityType: SPOT

示例 1: 在 SparkSubmitParameters 中指定

使用 SparkSubmitParameters指定S3 路径到 pod template:

aws emr-containers start-job-run \
--virtual-cluster-id ${EMR_EKS_CLUSTER_ID} \
--name spark-pi-pod-template \
--execution-role-arn ${EMR_EKS_EXECUTION_ARN} \
--release-label emr-5.33.0-latest \
--job-driver '{
    "sparkSubmitJobDriver": {
        "entryPoint": "s3://aws-data-analytics-workshops/emr-eks-workshop/scripts/pi.py",
        "sparkSubmitParameters": "--conf spark.kubernetes.driver.podTemplateFile=s3://aws-data-analytics-workshops/emr-eks-workshop/scripts/driver_template.yaml --conf spark.kubernetes.executor.podTemplateFile=s3://aws-data-analytics-workshops/emr-eks-workshop/scripts/executor_template.yaml --conf spark.executor.instances=2 --conf spark.executor.memory=2G --conf spark.executor.cores=2 --conf spark.driver.cores=1"
        }
    }'

示例 2: 在 ApplicationConfiguration 中指定

使用 configurationOverrides 指定 S3 路径到 pod 模板,如下面的示例所示:

aws emr-containers start-job-run \
--virtual-cluster-id ${EMR_EKS_CLUSTER_ID} \
--name spark-pi-pod-template \
--execution-role-arn ${EMR_EKS_EXECUTION_ARN} \
--release-label emr-5.33.0-latest \
--job-driver '{
    "sparkSubmitJobDriver": {
        "entryPoint": "s3://aws-data-analytics-workshops/emr-eks-workshop/scripts/pi.py",
        "sparkSubmitParameters": "--conf spark.executor.instances=2 --conf spark.executor.memory=2G --conf spark.executor.cores=2 --conf spark.driver.cores=1"
        }
    }' \
--configuration-overrides '{
    "applicationConfiguration": [
      {
        "classification": "spark-defaults", 
        "properties": {
          "spark.driver.memory":"2G",
          "spark.kubernetes.driver.podTemplateFile":"s3://aws-data-analytics-workshops/emr-eks-workshop/scripts/driver_template.yaml",
          "spark.kubernetes.executor.podTemplateFile":"s3://aws-data-analytics-workshops/emr-eks-workshop/scripts/executor_template.yaml"
         }
      }
    ]   
}'

转到 CloudWatch 日志并检查调度程序日志,以验证driver是否在 ON_DEMAND 实例上运行,executor是否在 SPOT 实例上启动。