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環境的作業提交。程式碼範例及返回資訊如下。
# xxx @ B xxx -1949 in ~ xxx [16:16:47] $ echo "select 1+1">test.sql # xxx @ xxx -1949 in ~ xxx [16:17:16] $ ./emr-spark-ack -n c-xxx xxx spark-sql -f test.sql uploading test.sql to c-xxx b/spark-submit-gateway-865bbf56f6-sfb95:/opt/spark/work-dir/test.sql cmd: kubectl exec spark-submit-gateway-865bbf56f6-sfb95 -i -n c-xxx xxx -- /bin/bash spark-sql -f test.sql Warning: Ignoring non-Spark config property: ack.clusterid.for.rss.linked Setting default log level to "WARN". To adjust logging level use sc.setLogLevel(newLevel). For SparkR, use setLogLevel(newLevel). Spark master: k8s://https://kubernetes.default:443, Application Id: spark-application-1653639654376 Time taken: 4.738 seconds, Fetched 1 row(s) 2 22/05/27 16:21:04 WARN [shutdown-hook-0] ExecutorPodsWatchSnapshotSource: Kubernetes client has been closed. -
spark-shell命令方式
./emr-spark-ack -n <叢集對應的namespace> spark-shell程式碼範例及返回資訊如下。
$ ./emr-spark-ack -n c-xxx spark-shell cmd: kubectl exec spark-submit-gateway-865bbf56f6-sfb95 -it -n xxx -- /bin/bash spark-shell Warning: Ignoring non-Spark config property: ack.clusterid.for.rss.linked Setting default log level to "WARN". To adjust logging level use sc.setLogLevel(newLevel). For SparkR, use setLogLevel(newLevel). Spark context Web UI available at http://10.210.xxx.xxx:4041 Spark context available as 'sc' (master = k8s://https://kubernetes.default:443, app id = spark-application-16536387xxx). Spark session available as 'spark'. Welcome to ____ __ / __/__ ___ _____/ /__ _\ \/ _ \/ _ `/ __/ '_/ /___/ .__/\_,_/_/ /_/\_\ version 3.2.1 /_/ Using Scala version 2.12.15 (OpenJDK 64-Bit Server VM, Java 1.8.0_332) Type in expressions to have them evaluated. Type :help for more information. scala>
-
-
-
可選:您可以在作业详情頁面,查看已建立的作業資訊。
-
可選:使用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命令進行互動式查詢。
[root@spark-submit-gateway-865bb xxx work-dir]# spark-sql Warning: Ignoring non-Spark config property: ack.clusterid.for.rss.linked Setting default log level to "WARN". To adjust logging level use sc.setLogLevel(newLevel). For SparkR, use setLogLevel(newLevel). Spark master: k8s://https://kubernetes.default:443, Application Id: spark-application-1654656192425 spark-sql> select 1+1; 2 Time taken: 5.277 seconds, Fetched 1 row(s) spark-sql> -
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管理作業。
-
通過阿里雲Log Service收集Spark作業的日誌詳情,請參見使用Log Service收集Spark作業日誌。
-
在EMR on ACK中設定Spark叢集的中繼資料詳情,請參見為Spark叢集設定中繼資料。
-
使用ECI彈性調度Spark作業詳情,請參見使用ECI彈性調度Spark作業。