全部产品
Search
文档中心

开源大数据平台E-MapReduce:使用ECI弹性调度Spark作业

更新时间:Mar 26, 2024

使用阿里云弹性容器实例(Elastic Container Instance)调度Spark作业,可以不受限于ACK集群的节点计算容量,灵活动态地按需创建Pod(容器组),有效地降低计算成本。本文为您介绍如何使用ECI弹性调度Spark作业。

背景信息

如果您需要使用更多ECI的高级功能,可以通过设置更多的Annotation(注解)对ECI按需进行参数配置,详情请参见ECI Pod Annotation

前提条件

操作步骤

  1. 在ACK集群中安装ECI所需的虚拟节点,详情请参见步骤一:在ACK集群中部署ack-virtual-node组件

  2. 在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相同。

      1. 进入spark-defaults.conf页签。

        1. 登录EMR on ACK

        2. 在EMR on ACK页面,单击目标集群操作列的配置

        3. 配置页签,单击spark-defaults.conf

      2. 配置Spark集群以启用ECI。

        1. 单击上方的新增配置项

        2. 新增配置项对话框中,添加以下配置。

          参数

          描述

          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

        3. 单击确定

        4. 在弹出的对话框中,输入执行原因,单击保存

      3. 生效配置。

        1. 单击部署客户端配置

        2. 在弹出的对话框中,输入执行原因,单击确定

        3. 确认对话框中,单击确定

  3. 可选:如果您的作业需要读写OSS数据,或者使用了DLF元数据,访问云服务时还需要额外授予ECI权限。授权方式如下:

    • 方式一:通过角色授权ECI以实现免密访问。

      1. RAM控制台,创建可信实体为阿里云服务的RAM角色,详情请参见创建普通服务角色

        说明

        受信服务选择为云服务器。

      2. 为创建的RAM角色授权,权限策略为AliyunOSSFullAccess和AliyunDLFFullAccess。

        为RAM角色授权详情,请参见为RAM角色授权

      3. 在Spark作业中,按照如下方式添加Annotations,指定创建好的RAM角色即可。

        annotations:
          k8s.aliyun.com/eci-ram-role-name: <创建的角色名>
    • 方式二:配置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"