文章目录
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();
这样提交任务后终于不再报这个错了。