使用阿里云弹性容器实例(Elastic Container Instance)调度Spark作业,可以不受限于ACK集群的节点计算容量,灵活动态地按需创建Pod(容器组),有效地降低计算成本。本文为您介绍如何使用ECI弹性调度Spark作业。
背景信息
如果您需要使用更多ECI的高级功能,可以通过设置更多的Annotation(注解)对ECI按需进行参数配置,详情请参见ECI Pod Annotation。
前提条件
操作步骤
- 在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调度。Annotaion取值与方式二:配置Pod Annotation相同。
- 进入spark-defaults.conf页签。
- 登录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-defaults.conf页签。
- 方式一:配置Pod Label。
- 可选:如果您的作业需要读写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"
- 如果您的作业需要读写OSS数据,则需要在hadoopConf中额外增加AccessKey的配置。配置信息如下。