簡介: 本文將就MaxCompute Spark開發環境搭建、經常使用配置、做業遷移注意事項以及常見問題進行深刻介紹。
MaxCompute Spark是MaxCompute提供的兼容開源的Spark計算服務。它在統一的計算資源和數據集權限體系之上,提供Spark計算框架,支持用戶以熟悉的開發使用方式提交運行Spark做業,以知足更豐富的數據處理分析場景。java
支持原生多版本Spark做業python
社區原生Spark運行在MaxCompute裏,徹底兼容Spark的API,支持多個Spark版本同時運行mysql
統一的計算資源git
像MaxCompute SQL/MR等任務類型同樣,運行在MaxCompute項目開通的統一計算資源中github
統一的數據和權限管理redis
遵循MaxCompute項目的權限體系,在訪問用戶權限範圍內安全地查詢數據sql
與開源系統相同的使用體驗apache
提供原生的開源實時Spark UI和查詢歷史日誌的功能windows
目前MaxCompute Spark支持如下適用場景:安全
離線計算場景:GraphX、Mllib、RDD、Spark-SQL、PySpark等
Streaming場景
讀寫MaxCompute Table
引用MaxCompute中的文件資源
讀寫VPC環境下的服務,如RDS、Redis、HBase、ECS上部署的服務等
讀寫OSS非結構化存儲
使用限制
不支持交互式類需求Spark-Shell、Spark-SQL-Shell、PySpark-Shell等
不支持訪問MaxCompute外部表,函數和UDF
只支持Local模式和Yarn-cluster模式運行
經過Spark客戶端提交
Local模式
本質上也是Yarn-Cluster模式,提交任務到MaxCompute集羣中
下載MC Spark客戶端
Spark 1.6.3
Spark 2.3.0
環境變量配置
## JAVA_HOME配置 # 推薦使用JDK 1.8 export JAVA_HOME=/path/to/jdk export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar export PATH=$JAVA_HOME/bin:$PATH ## SPARK_HOME設置 # 下載上文提到的MaxCompute Spark客戶端並解壓到本地任意路徑 # 請不要直接設置SPARK_HOME等於如下路徑下述路徑僅作展現用途 # 請指向正確的路徑 export SPARK_HOME=/path/to/spark_extracted_package export PATH=$SPARK_HOME/bin:$PATH ## PySpark配置Python版本 export PATH=/path/to/python/bin/:$PATH
參數配置
參數配置參考下文
準備項目工程
git clone https://github.com/aliyun/MaxCompute-Spark.git cd spark-2.x mvn clean package
任務提交
// bash環境 cd $SPARK_HOME bin/spark-submit --master yarn-cluster --class com.aliyun.odps.spark.examples.SparkPi /path/to/MaxCompute-Spark/spark-2.x/target/spark-examples_2.11-1.0.0-SNAPSHOT-shaded.jar // 在windows環境提交的命令 cd $SPARK_HOME/bin spark-submit.cmd --master yarn-cluster --class com.aliyun.odps.spark.examples.SparkPi pathtoMaxCompute-Sparkspark-2.xtargetspark-examples_2.11-1.0.0-SNAPSHOT-shaded.jar
IDEA調試注意
IDEA運行Local模式是不能直接引用spark-defaults.conf裏的配置,須要手動在代碼裏指定相關配置
必定要注意須要在IDEA裏手動添加MaxCompute Spark客戶端的相關依賴(jars目錄),不然會出現如下報錯:
the value of spark.sql.catalogimplementation should be one of hive in-memory but was odps
ODPS SPARK節點spark-submit主Java、Python資源app jar or python file配置項--conf PROP=VALUEMain Class--class CLASS_NAME參數[app arguments]選擇JAR資源--jars JARS選擇Python資源--py-files PY_FILES選擇File資源--files FILES選擇Archives資源
--archives
上傳資源:
0~50MB:能夠直接在DataWorks界面建立資源並上傳
50MB~500MB:能夠先利用MaxCompute客戶端(CMD)上傳,而後在DataWorks界面添加到數據開發,參考文檔
資源引用:
任務運行時:資源文件默認會上傳到Driver和Executor的當前工做目錄
除此以外,須要將spark-default.conf中的配置逐條加到dataworks的配置項中
首先在調度->參數中添加參數,而後在Spark節點「參數」欄引用該參數。多個參數用空格分隔
該參數會傳給用戶主類,用戶在代碼中解析該參數便可
用戶使用Maxcompute Spark一般會有幾個位置能夠添加Spark配置,主要包括:
位置1:spark-defaults.conf,用戶經過客戶端提交時在spark-defaults.conf文件中添加的Spark配置
位置2:dataworks的配置項,用戶經過dataworks提交時在配置項添加的Spark配置,這部分配置最終會在位置3中被添加
位置3:配置在啓動腳本spark-submit --conf選項中
位置4:配置在用戶代碼中,用戶在初始化SparkContext時設置的Spark配置
Spark配置的優先級
用戶代碼 > spark-submit --選項 > spark-defaults.conf配置 > spark-env.sh配置 > 默認值
一種是必需要配置在spark-defaults.conf或者dataworks的配置項中才能生效(在任務提交以前須要),而不能配置在用戶代碼中,這類配置主要的特徵是:
與Maxcompute/Cupid平臺相關:通常參數名中都會帶odps或者cupid,一般這些參數與任務提交/資源申請都關係:
顯而易見,一些資源獲取(如driver的內存,core,diskdriver,maxcompute資源),在任務執行以前就會用到,若是這些參數設置在代碼中,很明顯平臺沒有辦法讀到,因此這些參數必定不要配置在代碼中
其中一些參數即便配置在代碼中,也不會形成任務失敗,可是不會生效
其中一些參數配置在代碼中,可能會形成反作用:如在yarn-cluster模式下設置spark.master爲local
訪問VPC的參數:
這類參數也與平臺相關,打通網絡是在提交任務時就進行的
一種是在以上三種位置配置均可以生效,可是在代碼配置的優先級最高
推薦把任務運行與優化相關的參數配置在代碼中,而與資源平臺相關的配置都配置在spark-defaults.conf或者dataworks的配置項中。
Master以及Worker的StdErr打印的是spark引擎輸出的日誌,StdOut中打印用戶做業輸出到控制檯的內容
若是Driver中出現類或者方法找不到的問題,通常是jar包打包的問題
若是Driver中出現鏈接外部VPC或者OSS出現Time out,這種狀況通常要去排查一下參數配置
根據Latency作排序,Latency表明了Executor的存活的時間,存活時間越短的,越有多是根因所在
Spark UI的使用與社區原生版是一致的,能夠參考文檔
注意
Spark UI須要鑑權,只有提交任務的Owner才能打開
Spark UI僅在做業運行時才能打開,若是任務已經結束,那麼Spark UI是沒法打開的,這時候須要查看Spark History Server UI
================
緣由在於用戶沒有正確地按照文檔將Maxcompute Spark的jars目錄添加到類路徑,致使加載了社區版的spark包,須要按照文檔將jars目錄添加到類路徑
問題二:IDEA Local模式是不能直接引用spark-defaults.conf裏的配置,必需要把Spark配置項寫在代碼中
問題三:訪問OSS和VPC:
Local模式是處於用戶本機環境,網絡沒有隔離。而Yarn-Cluster模式是處於Maxcompute的網絡隔離環境中,必需要要配置vpc訪問的相關參數
Local模式下訪問oss的endpoint一般是外網endpoint,而Yarn-cluster模式下訪問vpc的endpoint是經典網絡endpoint
=============
java/scala程序常常會遇到Java類找不到/類衝突問題:
類沒有找到:用戶Jar包沒有打成Fat Jar或者因爲類衝突引發
打包須要注意:
依賴爲provided和compile的區別:
provided:代碼依賴該jar包,可是隻在編譯的時候須要用,而運行時不須要,運行時會去集羣中去尋找的相應的jar包
compile:代碼依賴該jar包,在編譯、運行時候都須要,在集羣中不存在這些jar包,須要用戶打到本身的jar包中。這種類型的jar包通常是一些三方庫,且與spark運行無關,與用戶代碼邏輯有關
用戶提交的jar包必須是Fat jar:
必需要把compile類型的依賴都打到用戶jar包中,保證代碼運行時能加載到這些依賴的類
須要設置爲provided的jar包
groupId爲org.apache.spark的Jar包
平臺相關的Jar包
cupid-sdk
hadoop-yarn-client
odps-sdk
須要設置爲compile的jar包
oss相關的jar包
hadoop-fs-oss
用戶訪問其餘服務用到的jar包:
如mysql,hbase
用戶代碼須要引用的第三方庫
===============
不少時候用戶須要用到外部Python依賴
首先推薦用戶使用咱們打包的公共資源,包含了經常使用的一些數據處理,計算,以及鏈接外部服務(mysql,redis,hbase)的三方庫
## 公共資源python2.7.13 spark.hadoop.odps.cupid.resources = public.python-2.7.13-ucs4.tar.gz spark.pyspark.python = ./public.python-2.7.13-ucs4.tar.gz/python-2.7.13-ucs4/bin/python ## 公共資源python3.7.9 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
做者:亢海鵬
原文連接本文爲阿里雲原創內容,未經容許不得轉載