spark on yarn 使用自定义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的时候没有分发过去呢(在使用集群的时候多少觉得这个集群哪里不对头)?
于是在代码里面增加了一些设置,就是把这个设置抄写了一遍

  SparkConf sparkConf = new SparkConf()
                    .setAppName(JOB_NAME)
                    .set(ConfigurationOptions.ES_NODES, esHost)
                    .set(ConfigurationOptions.ES_PORT, esPort)
                    .set(ConfigurationOptions.ES_NET_HTTP_AUTH_USER, esUser)
                    .set(ConfigurationOptions.ES_NET_HTTP_AUTH_PASS, esPass)
                    .set(ConfigurationOptions.ES_BATCH_SIZE_ENTRIES, "1000")
                    .set(ConfigurationOptions.ES_MAPPING_ID, ES_MAPPING_ID)
                    .set(ConfigurationOptions.ES_BATCH_WRITE_REFRESH, "false")
                    .set("spark.sql.warehouse.dir", "/user/hive/warehouse")
                    .set("spark.executorEnv.JAVA_HOME","/opt/jdk1.8.0_181")
                    .set("spark.default.parallelism","60")
                    .set("spark.yarn.executor.memoryOverhead","2048")                    ;
            SparkSession session = SparkSession.builder().appName(JOB_NAME).config(sparkConf).enableHiveSupport().getOrCreate();

这样提交任务后终于不再报这个错了。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值