EMR支持CRD、spark-submit和控制臺終端三種方式提交作業。本文為您介紹如何通過這三種方式提交Spark作業。
前提條件
已在EMR on ACK控制臺創建Spark集群,詳情請參見創建集群。
注意事項
在本文的示例中,JAR包已經直接打包在了鏡像中。如果您使用的是自己的JAR包,您可以將其上傳到阿里云OSS。上傳操作請參見簡單上傳。
此時,需要您修改命令中的local:///opt/spark/examples/spark-examples.jar
為您OSS上存放JAR包的真實路徑,路徑格式為oss://<yourBucketName>/<path>.jar
。
提交作業
方式一:使用CRD方式提交作業
通過kubectl連接Kubernetes集群,詳情請參見獲取集群KubeConfig并通過kubectl工具連接集群。
新建spark-pi.yaml文件,文件內容如下。
apiVersion: "sparkoperator.k8s.io/v1beta2" kind: SparkApplication metadata: name: spark-pi-simple spec: type: Scala sparkVersion: 3.2.1 mainClass: org.apache.spark.examples.SparkPi mainApplicationFile: "local:///opt/spark/examples/spark-examples.jar" arguments: - "1000" driver: cores: 1 coreLimit: 1000m memory: 4g executor: cores: 1 coreLimit: 1000m memory: 8g memoryOverhead: 1g instances: 1
本文示例中的參數描述,請參見spark-on-k8s-operator。
說明文件名您可以自定義,本文以spark-pi.yaml為例介紹。
本文以Spark 3.2.1(EMR-5.6.0)版本為例,其他版本時請修改sparkVersion的配置。
執行如下命令,提交作業。
kubectl apply -f spark-pi.yaml --namespace <集群對應的namespace>
本文示例代碼中的
<集群對應的namespace>
,需要替換為集群的命名空間,您可以登錄E-MapReduce on ACK控制臺,在集群詳情頁面查看。返回如下信息。
sparkapplication.sparkoperator.k8s.io/spark-pi-simple created
說明spark-pi-simple
為本示例提交任務后的作業名。可選:您可以在作業詳情頁面查看已創建的作業信息。
方式二:使用spark-submit方式提交作業
通過kubectl連接Kubernetes集群,詳情請參見獲取集群KubeConfig并通過kubectl工具連接集群。
執行以下命令,安裝阿里云EMR提供的emr-spark-ack工具并授權。
wget https://ecm-repo-cn-hangzhou.oss-cn-hangzhou.aliyuncs.com/emr-on-ack/util/emr-spark-ack chmod 755 emr-spark-ack
使用emr-spark-ack工具提交作業。
提交作業的語法如下。
./emr-spark-ack -n <集群對應的namespace> <spark命令>
說明語法中的
<spark命令>
支持spark-submit、spark-sql、spark-shell和pyspark四種,語法和Spark本身完全一致。Cluster模式示例
通過spark-submit提交spark-pi作業。
./emr-spark-ack -n <集群對應的namespace> spark-submit \ --name spark-pi-submit \ --deploy-mode cluster \ --class org.apache.spark.examples.SparkPi \ local:///opt/spark/examples/spark-examples.jar \ 1000
Client模式示例
spark-sql命令方式
# 本地準備sql文件 echo "select 1+1">test.sql # 提交作業 ./emr-spark-ack -n <集群對應的namespace> spark-sql -f test.sql
在Spark 3及以上集群版本(EMR-5.X版本)中,emr-spark-ack工具支持本地依賴自動上傳,提交命令里面的本地文件依賴,包括
--jars
,--files
和-f
等參數中傳入的本地文件,會自動上傳到EMR on ACK集群內,用于K8s環境的作業提交。代碼示例及返回信息見下圖。
spark-shell命令方式
./emr-spark-ack -n <集群對應的namespace> spark-shell
代碼示例及返回信息見下圖。
可選:您可以在作業詳情頁面,查看已創建的作業信息。
可選:使用emr-spark-ack工具終止作業。
終止作業的語法如下。
./emr-spark-ack -n <集群對應的namespace> kill <Spark_app_id>
說明語法中的
<Spark_app_id>
是emr-spark-ack工具在提交作業時生成的,您可以在輸出日志中查看。
方式三:使用控制臺終端方式提交作業
進入訪問鏈接與端口頁面。
登錄EMR on ACK。
在EMR on ACK頁面,單擊目標集群的集群名。
單擊上方的訪問鏈接與端口頁簽。
在訪問鏈接與端口頁面,單擊SparkSubmitGateway UI對應的鏈接。
即可進入Shell終端。
在Shell終端中,可以通過以下兩種方式運行Spark命令。
spark-sql命令方式
spark-sql
進入spark-sql后,您可以直接運行Spark命令進行交互式查詢。
spark-submit命令方式
spark-submit \ --name spark-pi-submit \ --deploy-mode cluster \ --class org.apache.spark.examples.SparkPi \ local:///opt/spark/examples/spark-examples.jar \ 1000
可選:您可以在作業詳情頁面查看已創建的作業信息。
相關文檔
通過kubectl管理Spark作業詳情,請參見使用kubectl管理作業。
通過阿里云日志服務收集Spark作業的日志詳情,請參見使用日志服務收集Spark作業日志。
在EMR on ACK中設置Spark集群的元數據詳情,請參見為Spark集群設置元數據。
使用ECI彈性調度Spark作業詳情,請參見使用ECI彈性調度Spark作業。