spark on yarn 使用自定义jdk
文章目錄
- 1. 背景
- 2. 使用自定義的jdk
1. 背景
??公司的hadoop集群默認使用的還是jdk1.7 我剛來不知道,用spark2.0+jdk1.8開發了應用程序。 提交到集群上面報錯
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當時內心有點崩潰,沒想到集群只支持jdk1.7, 最開始想到的方案是降低當前工程的jdk版本吧,于是在本地又裝了一個jdk1.7, 然后各種依賴的包都要處理,因為很多第三方包新一些的都是jdk1.8了,讓人欲哭無淚,我一頓操作,終于把大部分依賴都降低到了1.7, 結果發現有一個沒法繞過去的地方,這個spark任務最終要寫入Elasticsearch, ES的版本是7.+, 7.0之后ES的client對jdk1.7已經不再支持了,所以也決定了這個問題無法通過降低jdk來完成了,而且降低jdk的操作本來也不合我的想法,開歷史倒車。
2. 使用自定義的jdk
??上面的一頓操作猛如虎,一看結果啥用沒有,比較坑。也說明我的思維不夠靈活,遇到問題第一個想到的是適應,比如hadoop平臺說只支持1.7,我就去降低自己的代碼的jdk版本,沒有想過怎樣在集群中運行高版本的jdk。還好在經歷上面的失敗之后我并沒有放棄,想到有沒有其他方案呢,我就查了一下,結果真的有,就是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" \這個設置需要在hadoop集群中所有的機器上都安裝jdk1.8,其實就是解壓放上去就好,所以實際上不會對集群的穩定性造成影響。
設置master和executor的jdk。這個方案也是我從網上找到的一個方案,但是在我實際運行后不行,依然報上面的jdk的版本不支持的錯誤,有點頭大, 這個時候,我想有沒有可能是這些命令在將任務提交到其他executor的時候沒有分發過去呢(在使用集群的時候多少覺得這個集群哪里不對頭)?
于是在代碼里面增加了一些設置,就是把這個設置抄寫了一遍
這樣提交任務后終于不再報這個錯了。
總結
以上是生活随笔為你收集整理的spark on yarn 使用自定义jdk的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 一些资源链接
- 下一篇: logstash使用中遇到的问题