本文為您介紹如何在Windows作業系統下搭建Spark on MaxCompute開發環境。
如果您安裝了Linux作業系統,請前往搭建Linux開發環境。
前提條件
搭建Spark開發環境前,請確保您已經在Windows作業系統中安裝如下軟體:
本文採用的軟體版本號碼及軟體安裝路徑僅供參考,請根據您的作業系統下載合適的軟體版本進行安裝。
JDK
本文採用JDK 1.8.0_361,JDK官網下載地址請參見JDK官網。
Python
本文採用Python 3.7,Python官網下載地址請參見Python官網。
說明本文採用Spark-2.4.5,如採用其他版本Spark請下載安裝對應版本Python,詳情請參見https://pypi.org/project/pyspark/。
Maven
本文採用Apache Maven 3.8.7,Maven官網下載地址請參見Maven官網。
Git
本文採用git version 2.39.1.windows.1,Git官網下載地址請參見Git官網。
Scala
本文採用Scala 2.13.10,Scala官網下載地址請參見Scala官網。
下載Spark on MaxCompute用戶端包
Spark on MaxCompute發布包整合了MaxCompute認證功能。作為用戶端工具,它通過Spark-Submit方式提交作業到MaxCompute專案中運行。MaxCompute提供了面向Spark1.x、Spark2.x和Spark3.x發布包,下載路徑如下(本文採用Spark-2.4.5):
Spark-1.6.3:適用於Spark1.x應用的開發。
Spark-2.3.0:適用於Spark2.x應用的開發。
Spark-2.4.5:適用於Spark2.x應用的開發。使用Spark-2.4.5的注意事項請參見Spark 2.4.5使用注意事項。
Spark-3.1.1:適用於Spark3.x應用的開發。使用Spark-3.1.1的注意事項請參見Spark 3.1.1使用注意事項。
設定環境變數
您需要在Windows作業系統中單擊
配置如下環境變數資訊,配置方法及資訊如下。配置Java環境變數。
擷取Java安裝路徑。
編輯Java環境變數資訊。
在系統變數中新增
JAVA_HOME
的變數,變數值輸入Java安裝路徑。系統變數
Path
中增加%JAVA_HOME%\bin
。
確認Java已配置成功。
驗證方式
通過鍵盤快速鍵Win+R開啟運行對話方塊,輸入cmd,單擊確定。在命令運行介面輸入
java -version
,若返回的結果符合預期,則Java配置成功。預期結果樣本
java version "1.8.0_361" Java(TM) SE Runtime Environment (build 1.8.0_361-b09) Java HotSpot(TM) 64-Bit Server VM (build 25.361-b09, mixed mode)
配置Spark環境變數。
擷取Spark用戶端包解壓後的路徑。
編輯Spark環境變數資訊。
新增
SPARK_HOME
系統變數,變數值中輸入Spark用戶端包解壓後的路徑。系統變數
Path
中增加%SPARK_HOME%\bin
。
配置Scala環境變數。
確認Scala已配置成功。
驗證方式
通過鍵盤快速鍵Win+R開啟運行對話方塊,輸入cmd,單擊確定。在命令運行介面輸入
scala
,若返回的結果符合預期,則Scala配置成功。預期結果樣本
Welcome to Scala 2.13.10 (Java HotSpot(TM) 64-Bit Server VM, Java 1.8.0_361). Type in expressions for evaluation. Or try :help. scala>
配置Python環境變數。
擷取Python安裝路徑。
編輯Python環境變數資訊。
在系統變數
Path
中增加Python和子目錄Scripts的安裝路徑。確認Python已配置成功。
驗證方式
通過鍵盤快速鍵Win+R開啟運行對話方塊,輸入cmd,單擊確定。在命令運行介面輸入
python --version
,若返回的結果符合預期,則Python配置成功。預期結果樣本
Python 3.10.6
配置Maven環境變數。
擷取Maven包解壓後的路徑。
編輯Maven環境變數資訊。
新增
MAVEN_HOME
系統變數,變數值中輸入Maven包解壓後的路徑。系統變數
Path
中增加%MAVEN_HOME%\bin
。
確認Maven已配置成功。
驗證方式
通過鍵盤快速鍵Win+R開啟運行對話方塊,輸入cmd,單擊確定。在命令運行介面輸入
mvn --version
,若返回的結果符合預期,則Maven配置成功。預期結果樣本
# ***表示Maven包解壓後的部分路徑。 Apache Maven 3.8.7 (b89d5959fcde851dcb1c8946a785a163f14e1e29) Maven home: D:\***\apache-maven-3.8.7-bin\apache-maven-3.8.7 Java version: 1.8.0_361, vendor: Oracle Corporation, runtime: C:\Program Files\Java\jdk1.8.0_361\jre Default locale: zh_CN, platform encoding: GBK OS name: "windows 10", version: "10.0", arch: "amd64", family: "windows"
配置Git環境變數。
確認Git已配置成功。
驗證方式
通過鍵盤快速鍵Win+R開啟運行對話方塊,輸入cmd,單擊確定。在命令運行介面輸入
git --version
,若返回的結果符合預期,則Git配置成功。預期結果樣本
git version 2.39.1.windows.1
配置spark_defaults.conf
第一次使用Spark on MaxCompute用戶端時,請在Spark用戶端包的解壓路徑下,將conf檔案夾下的spark-defaults.conf.template檔案重新命名為spark-defaults.conf後再進行相關配置。如果spark-defaults.conf.template和spark-defaults.conf檔案都存在,則不需要重新命名操作,只需要配置spark-defaults.conf檔案即可。程式碼範例如下。
# 直接進入到Spark用戶端包的解壓路徑,並進入conf檔案夾。請以實際路徑為準。 # 開啟spark-defaults.conf檔案配置資訊 # 在設定檔末尾添加如下配置資訊。 spark.hadoop.odps.project.name = <MaxCompute_project_name> spark.hadoop.odps.access.id = <AccessKey_id> spark.hadoop.odps.access.key = <AccessKey_secret> spark.hadoop.odps.end.point = <Endpoint> # Spark用戶端串連訪問MaxCompute專案的Endpoint,您可以根據自己情況進行修改。 # spark 2.3.0請將spark.sql.catalogImplementation設定為odps,spark 2.4.5請將spark.sql.catalogImplementation設定為hive。 spark.sql.catalogImplementation={odps|hive} # 如下參數配置保持不變 spark.hadoop.odps.task.major.version = cupid_v2 spark.hadoop.odps.cupid.container.image.enable = true spark.hadoop.odps.cupid.container.vm.engine.type = hyper spark.hadoop.odps.moye.trackurl.host = http://jobview.odps.aliyun.com
MaxCompute_project_name:待訪問MaxCompute專案的名稱。
此處為MaxCompute專案名稱,非工作空間名稱。您可以登入MaxCompute控制台,左上方切換地區後,在左側導覽列選擇工作區 > 專案管理,查看具體的MaxCompute專案名稱。
AccessKey_id:具備目標MaxCompute專案存取權限的AccessKey ID。
您可以進入AccessKey管理頁面擷取AccessKey ID。
AccessKey_secret:AccessKey ID對應的AccessKey Secret。
您可以進入AccessKey管理頁面擷取AccessKey Secret。
Endpoint:MaxCompute專案所屬地區的外網Endpoint。
各地區的外網Endpoint資訊,請參見各地區Endpoint對照表(外網串連方式)。
VPC_endpoint:MaxCompute專案所屬地區的VPC網路的Endpoint。
各地區的VPC網路Endpoint資訊,請參見各地區Endpoint對照表(阿里雲VPC網路連接方式)。
準備專案工程
Spark on MaxCompute提供了專案工程模板,建議您下載模板複製後直接在模板裡開發。
模板工程裡的關於spark依賴的scope為provided,請不要更改,否則提交的作業無法正常運行。
準備專案工程樣本如下:
下載Spark-1.x模板並編譯
#開啟已經下載好的git用戶端(Git Bash),進入到需要下載專案工程的目錄,執行 git clone https://github.com/aliyun/MaxCompute-Spark.git #進入到工程檔案夾中 cd MaxCompute-Spark/spark-1.x #編譯該工程包 mvn clean package
下載Spark-2.x 模板並編譯
#開啟已經下載好的git用戶端(Git Bash),進入到需要下載專案工程的目錄,執行 git clone https://github.com/aliyun/MaxCompute-Spark.git #進入到工程檔案夾中 cd MaxCompute-Spark/spark-2.x #編譯該工程包 mvn clean package
下載Spark-3.x 模板並編譯
#開啟已經下載好的git用戶端(Git Bash),進入到需要下載專案工程的目錄,執行 git clone https://github.com/aliyun/MaxCompute-Spark.git #進入到工程檔案夾中 cd MaxCompute-Spark/spark-3.x #編譯該工程包 mvn clean package
上述命令執行完畢後,如果顯示建立失敗,說明環境配置有誤,請按照上述配置指導仔細檢查並修正環境配置資訊。
配置依賴說明
在準備的Spark on MaxCompute專案下,配置依賴資訊。命令樣本如下(您可在Git用戶端繼續執行,也可直接開啟該檔案進行修改)。
配置訪問MaxCompute表所需的依賴。
使用Spark-1.x模板情境
# 進入spark-1.x檔案夾。 cd MaxCompute-Spark/spark-1.x # 編輯Pom檔案,添加odps-spark-datasource依賴。 <dependency> <groupId>com.aliyun.odps</groupId> <artifactId>odps-spark-datasource_2.10</artifactId> <version>3.3.8-public</version> </dependency>
使用Spark-2.x模板情境
# 進入spark-2.x檔案夾。 cd MaxCompute-Spark/spark-2.x # 編輯Pom檔案,添加odps-spark-datasource依賴。 <dependency> <groupId>com.aliyun.odps</groupId> <artifactId>odps-spark-datasource_2.11</artifactId> <version>3.3.8-public</version> </dependency>
配置訪問OSS所需的依賴。
如果作業需要訪問OSS,直接添加以下依賴即可。
<dependency> <groupId>com.aliyun.odps</groupId> <artifactId>hadoop-fs-oss</artifactId> <version>3.3.8-public</version> </dependency>
更多Spark-1.x、Spark-2.x以及Spark-3.x的依賴配置資訊,請參見Spark-1.x pom檔案、Spark-2.x pom檔案和Spark-3.x pom檔案。
煙霧測試 (Smoke Test)
完成以上的工作之後,執行煙霧測試 (Smoke Test),驗證Spark on MaxCompute是否可以端到端連通。
SparkPi煙霧測試 (Smoke Test)
以Spark-2.x為例,您可以提交一個SparkPi驗證功能是否正常,提交命令如下。
# 通過鍵盤快速鍵Win+R開啟運行對話方塊,輸入cmd。
# 進入到需要執行作業的D:\PC\spark\spark-2.4.5-odps0.33.2\bin目錄下。
cd D:\PC\spark\spark-2.4.5-odps0.33.2\bin
#輸入如下命令。
spark-submit \
--class com.aliyun.odps.spark.examples.SparkPi \
--master yarn \
--deploy-mode cluster \
/path/to/your/spark-examples_2.11-1.0.0-SNAPSHOT-shaded.jar
# 當看到以下日誌表明冒煙作業成功。
19/06/11 11:57:30 INFO Client:
client token: N/A
diagnostics: N/A
ApplicationMaster host: 11.222.166.90
ApplicationMaster RPC port: 38965
queue: queue
start time: 1560225401092
final status: SUCCEEDED
IDEA本地煙霧測試 (Smoke Test)
在IDEA中開啟已下載的專案工程代碼,並手動將Spark on MaxCompute用戶端下的
Jars
目錄添加至IDEA專案工程中,詳情請參見IDEA本地執行注意事項。在本地IDEA中添加如下代碼,進行調試。
val spark = SparkSession .builder() .appName("SparkPi") .config("spark.master", "local[4]") // 需要設定spark.master為local[N]才能直接運行,N為並發數。 .getOrCreate()
Local不能直接引用spark-defaults.conf裡的配置,需要手動指定相關配置,即在
main
下建立resource
>odps.conf
目錄,並在odps.conf
中指定相關配置。配置樣本如下:說明Spark 2.4.5及以上版本需要在
odps.conf
中指定配置項。dops.access.id="" odps.access.key="" odps.end.point="" odps.project.name=""
Spark 2.4.5使用注意事項
使用Spark 2.4.5提交作業
直接使用Yarn-cluster模式在本地提交任務。詳情請參見Cluster模式。
Spark 2.4.5使用變化
如果使用Yarn-cluster模式在本地提交任務,需要新增環境變數
HADOOP_CONF_DIR=$SPARK_HOME/conf
。如果使用Local模式進行調試,需要在
$SPARK_HOME/conf
目錄下建立odps.conf檔案,並添加如下配置。odps.project.name = odps.access.id = odps.access.key = odps.end.point =
Spark 2.4.5參數配置變化
spark.sql.catalogImplementation
配置為hive
。spark.sql.sources.default
配置為hive
。spark.sql.odps.columnarReaderBatchSize
,向量化讀每個batch包含的行數,預設值為4096。spark.sql.odps.enableVectorizedReader
,開啟向量化讀,預設值為True。spark.sql.odps.enableVectorizedWriter
,開啟向量化寫,預設值為True。spark.sql.odps.split.size
,該配置可以用來調節讀MaxCompute表的並發度,預設每個分區為256 MB。
Spark 3.1.1使用注意事項
使用Spark 3.1.1提交作業
直接使用Yarn-cluster模式在本地提交任務。詳情請參見Cluster模式。
Spark 3.1.1使用變化
如果使用Yarn-cluster模式在本地提交任務,需要新增環境變數
HADOOP_CONF_DIR=$SPARK_HOME/conf
。如果使用Yarn-cluster模式提交PySpark作業,需要在spark-defaults.conf設定檔添加以下參數使用Python3。
spark.hadoop.odps.cupid.resources = public.python-3.7.9-ucs4.tar.gz spark.pyspark.python = ./public.python-3.7.9-ucs4.tar.gz/python-3.7.9-ucs4/bin/python3
如果使用Local模式進行調試:
需要在
$SPARK_HOME/conf
目錄下建立odps.conf檔案,並添加如下配置。odps.project.name = odps.access.id = odps.access.key = odps.end.point =
需要在代碼中添加
spark.hadoop.fs.defaultFS = file:///
,樣本如下。val spark = SparkSession .builder() .config("spark.hadoop.fs.defaultFS", "file:///") .enableHiveSupport() .getOrCreate()
Spark 3.1.1參數配置變化
spark.sql.defaultCatalog
配置為odps
。spark.sql.catalog.odps
配置為org.apache.spark.sql.execution.datasources.v2.odps.OdpsTableCatalog
。spark.sql.sources.partitionOverwriteMode
配置為dynamic
。spark.sql.extensions
配置為org.apache.spark.sql.execution.datasources.v2.odps.extension.OdpsExtensions
。spark.sql.odps.enableVectorizedReader
,開啟向量化讀,預設值為True。spark.sql.odps.enableVectorizedWriter
,開啟向量化寫,預設值為True。spark.sql.catalog.odps.splitSizeInMB
,該配置可以用來調節讀MaxCompute表的並發度,預設每個分區為256 MB。