spark on yarn 使用自定义jdk
文章目錄
- 1. 背景
- 2. 使用自定義的jdk
1. 背景
??公司的hadoop集群默認(rèn)使用的還是jdk1.7 我剛來不知道,用spark2.0+jdk1.8開發(fā)了應(yīng)用程序。 提交到集群上面報錯
Job aborted due to stage failure: Task 1 in stage 37.0 failed 4 times, most recent failure: Lost task 1.3 in stage 37.0 (TID 10960, hadoop37): java.lang.UnsupportedClassVersionError: com/chen/search//task/IndexBuilder$1 : Unsupported major.minor version 52.0當(dāng)時內(nèi)心有點崩潰,沒想到集群只支持jdk1.7, 最開始想到的方案是降低當(dāng)前工程的jdk版本吧,于是在本地又裝了一個jdk1.7, 然后各種依賴的包都要處理,因為很多第三方包新一些的都是jdk1.8了,讓人欲哭無淚,我一頓操作,終于把大部分依賴都降低到了1.7, 結(jié)果發(fā)現(xiàn)有一個沒法繞過去的地方,這個spark任務(wù)最終要寫入Elasticsearch, ES的版本是7.+, 7.0之后ES的client對jdk1.7已經(jīng)不再支持了,所以也決定了這個問題無法通過降低jdk來完成了,而且降低jdk的操作本來也不合我的想法,開歷史倒車。
2. 使用自定義的jdk
??上面的一頓操作猛如虎,一看結(jié)果啥用沒有,比較坑。也說明我的思維不夠靈活,遇到問題第一個想到的是適應(yīng),比如hadoop平臺說只支持1.7,我就去降低自己的代碼的jdk版本,沒有想過怎樣在集群中運行高版本的jdk。還好在經(jīng)歷上面的失敗之后我并沒有放棄,想到有沒有其他方案呢,我就查了一下,結(jié)果真的有,就是hadoop集群的多版本jdk的方案。這里需要提交的時候做更多的配置。整個的提交命令是這樣的:
spark-submit --deploy-mode client --master yarn --class com.xxxx.task.RebuildStarter \ --driver-memory 2G \--num-executors 80 \--queue aaa \--conf spark.default.parallelism=60 \--executor-cores 4 \--executor-memory 16G \user-1.0-SNAPSHOT.jar \--conf "spark.yarn.appMasterEnv.JAVA_HOME=/opt/jdk1.8.0_181" \--conf "spark.executorEnv.JAVA_HOME=/opt/jdk1.8.0_181" \--conf "spark.yarn.executor.memoryOverhead=2048" 2>&1其中比較重要的是
--conf "spark.yarn.appMasterEnv.JAVA_HOME=/opt/jdk1.8.0_181" \--conf "spark.executorEnv.JAVA_HOME=/opt/jdk1.8.0_181" \這個設(shè)置需要在hadoop集群中所有的機器上都安裝jdk1.8,其實就是解壓放上去就好,所以實際上不會對集群的穩(wěn)定性造成影響。
設(shè)置master和executor的jdk。這個方案也是我從網(wǎng)上找到的一個方案,但是在我實際運行后不行,依然報上面的jdk的版本不支持的錯誤,有點頭大, 這個時候,我想有沒有可能是這些命令在將任務(wù)提交到其他executor的時候沒有分發(fā)過去呢(在使用集群的時候多少覺得這個集群哪里不對頭)?
于是在代碼里面增加了一些設(shè)置,就是把這個設(shè)置抄寫了一遍
這樣提交任務(wù)后終于不再報這個錯了。
總結(jié)
以上是生活随笔為你收集整理的spark on yarn 使用自定义jdk的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 一些资源链接
- 下一篇: logstash使用中遇到的问题