使用阿里云彈性容器實例(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"