使用阿里云弹性容器实例(Elastic Container Instance)调度Spark作业,可以不受限于ACK集群的节点计算容量,灵活动态地按需创建Pod(容器组),有效地降低计算成本。本文为您介绍如何使用ECI弹性调度Spark作业。
背景信息
如果您需要使用更多ECI的高级功能,可以通过设置更多的Annotation(注解)对ECI按需进行参数配置,详情请参见ECI Pod Annotation。
前提条件
- 已在E-MapReduce on ACK控制台创建Spark集群,详情请参见快速使用EMR on ACK。
已开通弹性容器实例服务,详情请参见使用流程。
操作步骤
在ACK集群中安装ECI所需的虚拟节点,详情请参见步骤一:在ACK集群中部署ack-virtual-node组件。
在EMR on ACK上提交Spark作业时,可以通过设置Label(标签)、Annotation或者Spark Conf来实现ECI调度Spark作业。
提交Spark作业详情,请参见提交Spark作业。
说明本文示例中版本以Spark 3.1.1(EMR-5.2.1-ack)为例,其他版本时请修改sparkVersion和mainApplicationFile的配置。示例中的参数描述,请参见spark-on-k8s-operator。
方式一:配置Pod Label。
设置参数alibabacloud.com/eci为true,将指定Pod调度到ECI上运行,参考示例如下。
apiVersion: "sparkoperator.k8s.io/v1beta2" kind: SparkApplication metadata: name: spark-pi-eci spec: type: Scala sparkVersion: 3.1.1 mainClass: org.apache.spark.examples.SparkPi mainApplicationFile: "local:////opt/spark/examples/jars/spark-examples_2.12-3.1.1.jar" arguments: - "1000000" driver: cores: 2 coreLimit: 2000m memory: 4g executor: cores: 4 coreLimit: 4000m memory: 8g instances: 10 # 通过配置Label,所有Executor使用ECI。 labels: alibabacloud.com/eci: "true" #(可选)配置ECI镜像缓存,提升性能 annotations: k8s.aliyun.com/eci-image-cache: "true"
方式二:配置Pod Annotation。
设置参数alibabacloud.com/burst-resource为eci,将指定Pod调度到ECI上运行,Annotation取值包含两种类型:
eci:当集群普通节点的资源不足时,使用ECI。
eci_only:只使用ECI。
参考示例如下。
apiVersion: "sparkoperator.k8s.io/v1beta2" kind: SparkApplication metadata: name: spark-pi-eci spec: type: Scala sparkVersion: 3.1.1 mainClass: org.apache.spark.examples.SparkPi mainApplicationFile: "local:////opt/spark/examples/jars/spark-examples_2.12-3.1.1.jar" arguments: - "1000000" driver: cores: 2 coreLimit: 2000m memory: 4g executor: cores: 4 coreLimit: 4000m memory: 8g instances: 10 # 通过配置Annotation,当Executor节点资源不足时使用ECI。 annotations: alibabacloud.com/burst-resource: "eci" #(可选)配置ECI镜像缓存,提升性能 k8s.aliyun.com/eci-image-cache: "true"
方式三:配置Spark Conf。
您也可以通过增加Spark Conf来配置Pod Annotation,从而实现ECI调度。Annotation取值与方式二:配置Pod Annotation相同。
进入spark-defaults.conf页签。
登录EMR on ACK。
在EMR on ACK页面,单击目标集群操作列的配置。
在配置页签,单击spark-defaults.conf。
配置Spark集群以启用ECI。
单击上方的新增配置项。
在新增配置项对话框中,添加以下配置。
参数
描述
spark.kubernetes.driver.annotation.alibabacloud.com/burst-resource
Spark Driver是否使用ECI,取值为eci或eci_only。
spark.kubernetes.driver.annotation.k8s.aliyun.com/eci-image-cache
Spark Driver是否使用ECI镜像缓存,建议填写为true。
spark.kubernetes.executor.annotation.alibabacloud.com/burst-resource
Spark Executor是否使用ECI,取值为eci或eci_only
spark.kubernetes.executor.annotation.k8s.aliyun.com/eci-image-cache
Spark Executor是否使用ECI镜像缓存,建议填写为true。
spark.kubernetes.driver.annotation.k8s.aliyun.com/eci-ram-role-name
用于指定创建Spark Driver Pod时应绑定的RAM角色名。填写为AliyunECSInstanceForEMRRole。
单击确定。
在弹出的对话框中,输入执行原因,单击保存。
生效配置。
单击部署客户端配置。
在弹出的对话框中,输入执行原因,单击确定。
在确认对话框中,单击确定。
可选:如果您的作业需要读写OSS数据,或者使用了DLF元数据,访问云服务时还需要额外授予ECI权限。授权方式如下:
方式一:通过角色授权ECI以实现免密访问。
方式二:配置OSS AccessKey或DLF AccessKey。
如果您的作业需要读写OSS数据,则需要在hadoopConf中额外增加AccessKey的配置。配置信息如下。
hadoopConf: fs.jfs.cache.oss.accessKeyId: <yourAccessKeyId> fs.jfs.cache.oss.accessKeySecret: <yourAccessKeySecret>
如果您的作业开启了DLF,则需要在hadoopConf中额外增加AccessKey的配置。配置信息如下。
hadoopConf: dlf.catalog.accessKeyId: <yourAccessKeyId> dlf.catalog.accessKeySecret: <yourAccessKeySecret> dlf.catalog.akMode: "MANUAL"