在本节中,我们将学习如何使用 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.podTemplateFile
和 spark.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
使用 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"
}
}'
使用 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 实例上启动。