Spark on MaxCompute作業可通過Local模式、Cluster模式執行,此外,您也可在DataWorks中運行Spark on MaxCompute離線作業(Cluster模式),以便與其它類型執行節點集成和調度。本文為您介紹如何通過DataWorks實現Spark on MaxCompute作業的配置與調度。
前提條件
已創建ODPS Spark節點,詳情請參見創建并管理MaxCompute節點。
使用限制
當ODPS Spark節點選擇Spark3.x版本時,若提交節點報錯,請提交工單聯系技術支持人員升級獨享調度資源組的版本。
背景信息
Spark on MaxCompute是MaxCompute提供的兼容開源Spark的計算服務。它在統一的計算資源和數據集權限體系基礎上,提供Spark計算框架,支持您以熟悉的開發使用方式提交運行Spark作業,滿足更豐富的數據處理分析需求。在DataWorks中,您可通過ODPS Spark節點實現Spark on MaxCompute任務的調度運行,以及與其他作業的集成操作。
Spark on MaxCompute支持使用Java、Scala和Python語言進行開發,并通過Local、Cluster模式運行任務,在DataWorks中運行Spark on MaxCompute離線作業時采用Cluster模式執行。更多關于Spark on MaxCompute運行模式的介紹,詳情請參見運行模式。
準備工作
ODPS Spark節點支持使用Java/Scala
和Python
語言運行Spark on MaxCompute離線作業,不同語言開發步驟及配置界面存在差異,您可根據業務需要選擇使用。
Java/Scala
在ODPS Spark節點執行Java或Scala語言類型代碼前,您需先在本地開發好Spark on MaxCompute作業代碼,再通過DataWorks上傳為MaxCompute的資源。步驟如下:
準備開發環境。
根據所使用系統類型,準備運行Spark on MaxCompute任務的開發環境,詳情請參見搭建Linux開發環境、搭建Windows開發環境。
開發Java/Scala代碼。
在ODPS Spark節點執行Java或Scala語言類型代碼前,需先在本地或已有環境開發好Spark on MaxCompute代碼,建議使用Spark on MaxCompute提供的項目示例工程模板進行開發。
打包代碼并上傳至DataWorks。
代碼開發完成后,需將其打包,并通過DataWorks上傳為MaxCompute資源,詳情請參見創建并使用MaxCompute資源。
Python(使用默認Python環境實現)
DataWorks可通過將代碼在線寫入DataWorks Python資源的方式,實現PySpark作業開發,并通過ODPS Spark節點提交運行該代碼邏輯。DataWorks上創建Python資源,詳情請參見創建并使用MaxCompute資源;PySpark開發示例,詳情請參見PySpark開發示例。
該方式使用DataWorks提供的默認Python環境,可直接依賴的三方包有限,若默認環境無法滿足PySpark作業第三方依賴包的需求,可參考下文《開發語言:Python(使用自定義Python環境實現)》方式,自行準備Python環境執行任務。當然,您也可選擇對Python資源支持性更好的PyODPS 2節點和PyODPS 3節點。
Python(使用自定義Python環境實現)
若平臺提供的默認Python環境無法滿足您的業務需求,則可根據如下步驟自定義Python環境,執行Spark on MaxCompute任務。
本地準備Python環境。
您可參考PySpark Python版本和依賴支持,根據業務需要配置可用的Python環境。
打包環境并上傳至DataWorks。
將Python環境壓縮為一個Zip包,并通過DataWorks上傳為MaxCompute資源,作為后續運行Spark on MaxCompute任務的執行環境。詳情請參見創建并使用MaxCompute資源。
配置項說明
DataWorks運行Spark on MaxCompute離線作業采用Cluster模式,在Cluster模式中,您需指定自定義程序入口main
。main
運行結束(即狀態為Success
或Fail
)時,對應的Spark作業便會結束。此外,spark-defaults.conf
中的配置需逐條加到ODPS Spark節點配置項中。例如,Executor
的數量、內存大小和spark.hadoop.odps.runtime.end.point
的配置。
您無需上傳spark-defaults.conf
文件,而是需將spark-defaults.conf
文件中的配置都逐條加到ODPS Spark節點的配置項中。
參數 | 描述 | 對應的spark-submit命令 |
spark版本 | 包括Spark1.x、Spark2.x、Spark3.x版本。 說明 當ODPS Spark節點選擇Spark3.x版本時,若提交節點報錯,請提交工單聯系技術支持人員升級獨享調度資源組的版本。 | — |
語言 | 此處選擇Java/Scala或Python。請根據實際Spark on MaxCompute開發語言進行選擇。 | — |
選擇主資源 | 指定任務所使用的主JAR資源文件或主Python資源。 此處的資源文件需提前上傳至DataWorks并已提交,詳情請參見創建并使用MaxCompute資源。 |
|
配置項 | 指定提交作業時的配置項。其中:
|
|
Main Class | 配置主類名稱。當開發語言為 |
|
參數 | 您可根據需要添加參數,多個參數之間用空格分隔。DataWorks支持使用調度參數,此處參數配置格式為${變量名}。配置完成后需在右側導航欄 處給變量賦值。 說明 調度參數支持的賦值格式請參見調度參數支持的格式。 |
|
選擇其他資源 | 您可根據需要,選擇使用如下資源。
此處的資源文件需提前上傳至DataWorks并已提交,詳情請參見創建并使用MaxCompute資源。 | 不同資源分別對應如下命令:
|
編輯代碼:簡單示例
以下以一個簡單示例為您介紹ODPS Spark節點的使用:判斷一個字符串是否可以轉換為數字。
創建資源。
在數據開發頁面新建Python類型的資源,并命名為spark_is_number.py,詳情請參見創建并使用MaxCompute資源。代碼如下:
# -*- coding: utf-8 -*- import sys from pyspark.sql import SparkSession try: # for python 2 reload(sys) sys.setdefaultencoding('utf8') except: # python 3 not needed pass if __name__ == '__main__': spark = SparkSession.builder\ .appName("spark sql")\ .config("spark.sql.broadcastTimeout", 20 * 60)\ .config("spark.sql.crossJoin.enabled", True)\ .config("odps.exec.dynamic.partition.mode", "nonstrict")\ .config("spark.sql.catalogImplementation", "odps")\ .getOrCreate() def is_number(s): try: float(s) return True except ValueError: pass try: import unicodedata unicodedata.numeric(s) return True except (TypeError, ValueError): pass return False print(is_number('foo')) print(is_number('1')) print(is_number('1.3')) print(is_number('-1.37')) print(is_number('1e3'))
保存并提交資源。
在已創建的ODPS Spark節點中,根據配置項說明配置節點參數和調度配置參數,并保存提交節點。
配置項
說明
spark版本
Spark2.x
語言
Python
選擇主python資源
在下拉列表中選擇上述已創建的python資源spark_is_number.py
進入開發環境的運維中心,執行補數據,具體操作請參見執行補數據并查看補數據實例(新版)。
說明由于數據開發中的ODPS Spark節點沒有運行入口,因此您需要在開發環境的運維中心執行Spark任務。
查看返回結果。
待補數據實例運行成功后,進入其運行日志的tracking URL中查看運行結果,如下:
False True True True True
編輯代碼:進階示例
更多場景的Spark on MaxCompute任務開發,請參考:
后續步驟
當您完成當前節點的任務開發后,通常您可進行以下操作。
調度配置:配置節點的周期性調度屬性。任務需要周期性調度運行時,您需要設置節點后續實際運行過程中的重跑屬性、調度依賴關系等,操作詳情請參見任務調度屬性配置概述。
任務調試:對當前節點的代碼進行測試運行,確認代碼邏輯符合預期,操作詳情請參見任務調試流程。
任務發布:完成所有開發相關操作后,您需要將所有任務節點進行發布,發布后節點即會根據調度配置結果進行周期性運行,操作詳情請參見發布任務。