部署方案
spark官網(wǎng)下載基于hdp的Hadoop版本的pre-built的spark安裝包
-
在機(jī)器上解壓,并在spark-env中配置HADOOP_CONF_DIR回挽,SPARK_CONF_DIR趾娃,spark-defaults中添加相關(guān)配置
為方便使用扔水,設(shè)置HADOOP_CONF_DIR指向目錄為/usr/hdp/current/hadoop-client/conf目錄
異常
使用./spark-shell --master yarn 啟動(dòng)sparkshell終端舞骆,拋出異常ClassNotFound :com/sun/jersey/api/client/config/ClientConfig如下:
在jar目錄下搜索發(fā)現(xiàn)廷没,確實(shí)不存在該類
[ocsp@ocdt31 jars]$ pwd
/data/cyq/spark-2.3.0-bin-hadoop2.7/jars
[ocsp@ocdt31 jars]$ grep "ClientConfig" ./ -Rn
[ocsp@ocdt31 jars]$
于是網(wǎng)上查詢發(fā)現(xiàn)該類在jersey-client包1.9版本中存在糊饱,而spark當(dāng)前依賴的的jersery版本為2.2,jersey版本升級(jí)后颠黎,剔除了相關(guān)jar包另锋。然而此處的調(diào)用是初始化yarnclientimpl時(shí),調(diào)用狭归,顯然是yarn服務(wù)使用的夭坪。此處說明存在jar包沖突問題。只好將yarn服務(wù)中的jersey-client的jar包放在spark的jars目錄下过椎。
再次啟動(dòng)sparkshell命令室梅,拋出異常“com/sun/jersey/api/client/config/ClientConfig”疚宇,如下:
在jar目錄下搜索發(fā)現(xiàn)亡鼠,確實(shí)不存在該類
[ocsp@ocdt31 jars]$ pwd
/data/cyq/spark-2.3.0-bin-hadoop2.7/jars
[ocsp@ocdt31 jars]$ grep "FeaturesAndProperties" ./ -Rn
[ocsp@ocdt31 jars]$
只好將yarn服務(wù)中的jersey-core的jar包放在spark的jars目錄下。
再次啟動(dòng)./spark-shell --master yarn 啟動(dòng)成功敷待。然而查看spark應(yīng)用原生頁面時(shí)發(fā)現(xiàn)點(diǎn)擊executor頁面無法打開间涵,且在driver中拋出異常:
多次點(diǎn)擊則拋出空指針異常,如下:
分析后榜揖,發(fā)現(xiàn)jersery-core的1.9版本中存在ws相關(guān)j類勾哩,與javax.ws.rs-api-2.0.1.jar中的類類名一致抗蠢。classloader加載時(shí)加載了jerseyclient中的類,由于版本原因思劳,導(dǎo)致運(yùn)行異常迅矛。
沖突點(diǎn)
如果使用jersey-client,jersey-core的1.9版本敢艰,可以使應(yīng)用運(yùn)行起來诬乞,但由于jar包沖突,導(dǎo)致executors頁面無法查看钠导,這對(duì)分析應(yīng)用有較大麻煩震嫉。
如果不使用jersey-client,jersey-core 1.9版本,則應(yīng)用啟動(dòng)異常牡属。
尷尬了票堵。。逮栅。
問題再分析
基于如上分析悴势,spark應(yīng)用啟動(dòng)運(yùn)行有問題,還怎么好好的玩耍呢措伐。
可是特纤,我是直接取的spark社區(qū)2.3基于hadoop2.7版本編譯好的包,如果無法使用侥加,這還得了捧存。
于是使用社區(qū)的spark在社區(qū)的hadoop上運(yùn)行,運(yùn)行成功担败。于是懷疑問題出在配置上面昔穴。然而是哪個(gè)配置呢?分析堆椞崆埃可以發(fā)現(xiàn)吗货,yarnclientimpl初始化時(shí),調(diào)用的createTimelineClient服務(wù)時(shí)異常狈网,查看HADOOP_CONF_DIR下的yarn-site配置文件宙搬,果然有yarn.timeline-service.enabled參數(shù),且該值配置為true拓哺。 查看yarnclient的源碼發(fā)現(xiàn)害淤,確實(shí)通過讀取該值
if (conf.getBoolean(YarnConfiguration.TIMELINE_SERVICE_ENABLED,
YarnConfiguration.DEFAULT_TIMELINE_SERVICE_ENABLED)) {
timelineServiceEnabled = true;
timelineClient = createTimelineClient();
timelineClient.init(conf);
timelineDTRenewer = getTimelineDelegationTokenRenewer(conf);
timelineService = TimelineUtils.buildTimelineTokenService(conf);
}
于是將yarn.timeline-service.enabled值設(shè)置為false,并刪除之前copy到SPARK_HOME/jars目錄下的jersey1.9相關(guān)jar包拓售。啟動(dòng)./spark-shell --master yarn 啟動(dòng)成功窥摄,executor頁面可以正常查看。
至此spark on hdp 啟動(dòng)成功础淤。且頁面查看正常崭放。
PS : 最后一問
使用社區(qū)Spark在hdp的yarn中運(yùn)行起初設(shè)置的yarn.timeline-service.enable為ture時(shí)哨苛,由于jersey版本不兼容問題,啟動(dòng)是異常的币砂, 那使用hdp的spark2可以在yarn上運(yùn)行建峭,為何是正常的呢?
顯然在配置yarn.timeline-service.enable為ture時(shí)决摧,根據(jù)yarnclientimpl的代碼亿蒸,一定會(huì)走到createTImelineclient方法,此時(shí)初始化時(shí)也會(huì)遭遇類不存在的問題從而導(dǎo)致啟動(dòng)失敗掌桩, 然而現(xiàn)實(shí)是hdp的spark客戶端提交應(yīng)用時(shí)边锁,運(yùn)行是正常的。波岛。茅坛。。
于是開始懷疑hdp做過某種修改则拷,查看hdp的源碼發(fā)現(xiàn)在submitApp之前贡蓖,強(qiáng)制設(shè)置yarn.timeline-service.enable為false。
查看HDP的代碼和配置發(fā)現(xiàn)hdp專門為適配timeline-service服務(wù)針對(duì)tez和spark專門開發(fā)了插件煌茬。