提交Spark作业遇到的NoSuchMethodError问题总结
测试应用说明
测试的Spark应用实现了同步hive表到kafka的功能。具体处理流程:
- 从 ETCD 获取 SQL 语句和 Kafka 配置信息
- 使用 SparkSQL 读取 Hive 数据表
- 把 Hive 数据表的数据写入 Kafka
应用使用etcd来存储程序所需配置,通过拉取etcd的kv配置,来初始化sql语句和kafka配置的参数。
提交方式及相应的问题
- 使用
client
模式,提交无依赖的jar包
提交命令
/usr/local/spark-2.3.0-bin-2.8.2/bin/spark-submit \
--name hive2kafka \
--master yarn \
--deploy-mode client \
--driver-cores 1 \
--driver-memory 2g \
--num-executors 2 \
--executor-cores 1 \
--executor-memory 2g \
--queue hive \
--class com.ljh.spark.Hive2Kafka \
/data0/jianhong1/demo-v25/target/demo-1.0-SNAPSHOT.jar
应用运行失败,driver端报错:
Exception in thread "main" java.lang.NoClassDefFoundError: io/etcd/jetcd/Client
at com.ljh.spark.EtcdUtil.getClient(EtcdUtil.java:27)
at com.ljh.spark.EtcdUtil.get(EtcdUtil.java:46)
at com.ljh.spark.Hive2Kafka.main(Hive2Kafka.java:60)
...
Caused by: java.lang.ClassNotFoundException: io.etcd.jetcd.Client
at java.net.URLClassLoader.findClass(URLClassLoader.java:381)
at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
从报错信息可以看出,driver端没有查找到etcd的某个类,即没有加载到etcd 的jar包。说明spark应用driver进程的classpath不包含etcd 的jar包。因此考虑打包fat jar,把etcd的jar包打入用户提交的jar。
- 使用
client
模式,提交包含依赖的jar包
提交命令
/usr/local/spark-2.3.0-bin-2.8.2/bin/spark-submit \
--name hive2kafka \
--master yarn \
--deploy-mode client \
--driver-cores 1 \
--driver-memory 2g \
--num-executors 2 \
--executor-cores 1 \
--executor-memory 2g \
--queue hive \
--class com.ljh.spark.Hive2Kafka \
/data0/jianhong1/demo-v25/target/demo-1.0-SNAPSHOT-jar-with-dependencies.jar
应用运行失败,driver端报错:
Exception in thread "main" java.lang.NoSuchMethodError: com.google.common.base.Preconditions.checkArgument(ZLjava/lang/String;CLjava/lang/Object;)V
at io.grpc.Metadata$Key.validateName(Metadata.java:742)
at io.grpc.Metadata$Key.<init>(Metadata.java:750)
at io.grpc.Metadata$Key.<init>(Metadata.java:668)
at io.grpc.Metadata$AsciiKey.<init>(Metadata.java:959)
at io.grpc.Metadata$AsciiKey.<init>(Metadata.java:954)
at io.grpc.Metadata$Key.of(Metadata.java:705)
at io.grpc.Metadata$Key.of(Metadata.java:701)
at io.etcd.jetcd.ClientConnectionManager.<clinit>(ClientConnectionManager.java:69)
at io.etcd.jetcd.ClientImpl.<init>(ClientImpl.java:37)
at io.etcd.jetcd.ClientBuilder.build(ClientBuilder.java:401)
at com.ljh.spark.EtcdUtil.getClient(EtcdUtil.java:28)
at com.ljh.spark.EtcdUtil.get(EtcdUtil.java:46)
at com.ljh.spark.Hive2Kafka.main(Hive2Kafka.java:60)
...
从报错信息可以看出,应用没有找到guava包
的Preconditions类
的checkArgument方法
。说明程序找到了guava包
的Preconditions类
,但是这个类没有找到checkArgument的某个构造方法。这种问题一般是由于jar包冲突,即程序加载了低版本的jar包,但是程序需要调用高版本jar包的某个方法,而这个方法低版本中没有,就会出现上面的报错NoSuchMethodError
。
因此考虑把程序中冲突的低版本guava包
排除掉。通过检查程序pom文件的jar包依赖,明确添加适配etcd高版本的guava包
,并把冲突的低版本的guava包
排除掉。重新运行,发现依然出现上面的NoSuchMethodError
报错。
因此猜测低版本的guava包
不是由于程序代码引入的,而是由spark提交机的本地包引入的。通过检查spark提交机的本地包,查到引入了guava-14.0.1.jar
,而程序中etcd依赖的guava包需要的版本为20+
。说明应用使用了本地jar的低版本guava类,而没有使用fat-jar的高版本guava类。由此推测出,spark应用driver端的类加载优先级:本地jar > fat-jar。
- 使用
client
模式,提交包含依赖的jar包,并添加driver-class 类路径
提交命令
/usr/local/spark-2.3.0-bin-2.8.2/bin/spark-submit \
--name hive2kafka \
--master yarn \
--deploy-mode client \
--driver-class-path /data0/jianhong1/demo-v25/target/lib/guava-23.6-jre.jar:/data0/jianhong1/demo-v25/target/lib/protobuf-java-3.5.1.jar \
--driver-cores 1 \
--driver-memory 2g \
--num-executors 2 \
--executor-cores 1 \
--executor-memory 2g \
--queue hive \
--class com.ljh.spark.Hive2Kafka \
/data0/jianhong1/demo-v25/target/demo-1.0-SNAPSHOT-jar-with-dependencies.jar
程序正常运行,不再出现NoSuchMethodError
报错。由此推测出,spark应用driver端的类加载优先级:driver-class-path 配置 > 本地jar。
- 使用
cluster
模式,提交包含依赖的jar包
提交命令
/usr/local/spark-2.3.0-bin-2.8.2/bin/spark-submit \
--name hive2kafka \
--master yarn \
--deploy-mode cluster \
--driver-cores 1 \
--driver-memory 2g \
--num-executors 2 \
--executor-cores 1 \
--executor-memory 2g \
--queue hive \
--class com.ljh.spark.Hive2Kafka \
/data0/jianhong1/demo-v25/target/demo-1.0-SNAPSHOT-jar-with-dependencies.jar
应用运行失败,报错信息:
diagnostics: User class threw exception: java.lang.NoSuchMethodError: com.google.common.base.Preconditions.checkArgument(ZLjava/lang/String;CLjava/lang/Object;)V
at io.grpc.Metadata$Key.validateName(Metadata.java:742)
at io.grpc.Metadata$Key.<init>(Metadata.java:750)
at io.grpc.Metadata$Key.<init>(Metadata.java:668)
at io.grpc.Metadata$AsciiKey.<init>(Metadata.java:959)
at io.grpc.Metadata$AsciiKey.<init>(Metadata.java:954)
at io.grpc.Metadata$Key.of(Metadata.java:705)
at io.grpc.Metadata$Key.of(Metadata.java:701)
at io.etcd.jetcd.ClientConnectionManager.<clinit>(ClientConnectionManager.java:69)
at io.etcd.jetcd.ClientImpl.<init>(ClientImpl.java:37)
at io.etcd.jetcd.ClientBuilder.build(ClientBuilder.java:401)
at com.ljh.spark.EtcdUtil.getClient(EtcdUtil.java:28)
at com.ljh.spark.EtcdUtil.get(EtcdUtil.java:46)
at com.ljh.spark.Hive2Kafka.main(Hive2Kafka.java:66)
...
从报错信息可以看出,应用找到了guava包
的Preconditions类
,但是在这个类中没有找到checkArgument
的某个构造方法。
因此考虑在提交作业时明确指出etcd所依赖的高版本guava包
。于是提交参数添加了 --jars hdfs:/user/jianhong1/jars/guava-23.6-jre.jar,hdfs:/user/jianhong1/jars/protobuf-java-3.5.1.jar \
,重新运行后依然报上面的错。说明 --jar
参数只是负责把jar包拷贝到运行作业的服务器上,但是没把指定的jar包加到类路径。
- 使用
cluster
模式,提交包含依赖的jar包,并添加driver 和executor 类路径。
提交命令
/usr/local/spark-2.3.0-bin-2.8.2/bin/spark-submit \
--name hive2kafka \
--master yarn \
--deploy-mode cluster \
--driver-cores 1 \
--driver-memory 2g \
--num-executors 2 \
--executor-cores 1 \
--executor-memory 2g \
--queue hive \
--class com.ljh.spark.Hive2Kafka \
--conf spark.driver.extraClassPath=guava-23.6-jre.jar:protobuf-java-3.5.1.jar \
--conf spark.executor.extraClassPath=guava-23.6-jre.jar:protobuf-java-3.5.1.jar \
--jars hdfs:/user/jianhong1/jars/guava-23.6-jre.jar,hdfs:/user/jianhong1/jars/protobuf-java-3.5.1.jar \
/data0/jianhong1/demo-v25/target/demo-1.0-SNAPSHOT-jar-with-dependencies.jar
通过增加guava包的driver 和executor 类路径的配置后,应用成功运行!
总结
本文介绍了client 方式和cluster 方式提交Spark 应用时所遇到的NoSuchMethodError 问题,及相应的解决方案。通过实际测试得到结论: spark应用的类加载优先级:--driver-class-path
或--executor-class-path
配置 > 本地jar > fat-jar。
参考
The --jars argument only transports the jars to each machine in the cluster. It does NOT tell spark to use them in the class path search. The --driver-class-path (or similar arguments or config parameters) are also required.
--jars 参数只是用于传输 jar 包到集群的 Executor 和 Driver 的服务器上,它不会告知 spark 应用在哪个类路径下使用这些jar包。因此,--driver-class-path或--executor-class-path参数也是必需的,用于配置 driver 和 executor 的类路径。
- Spark on Yarn运行时加载的jar包 https://www.cnblogs.com/upupfeng/p/13544612.html
spark on yarn运行时会加载的jar包有如下:
spark-submit中指定的--jars
$SPARK_HOME/jars下的jar包
yarn提供的jar包
spark-submit通过参数spark.driver/executor.extraClassPath指定的jar包
提交Spark作业遇到的NoSuchMethodError问题总结的更多相关文章
- Spark作业提交至Yarn上执行的 一个异常
(1)控制台Yarn(Cluster模式)打印的异常日志: client token: N/A diagnostics: Application application_1584359 ...
- 数据倾斜是多么痛?spark作业调优秘籍
目录视图 摘要视图 订阅 [观点]物联网与大数据将助推工业应用的崛起,你认同么? CSDN日报20170703——<从高考到程序员——我一直在寻找答案> [直播]探究L ...
- 【转】数据倾斜是多么痛?spark作业/面试/调优必备秘籍
原博文出自于: http://sanwen.net/a/gqkotbo.html 感谢! 来源:数盟 调优概述 有的时候,我们可能会遇到大数据计算中一个最棘手的问题——数据倾斜,此时Spark作业的性 ...
- Spark学习(四) -- Spark作业提交
标签(空格分隔): Spark 作业提交 先回顾一下WordCount的过程: sc.textFile("README.rd").flatMap(line => line.s ...
- spark作业提交参数设置(转)
来源:https://www.cnblogs.com/arachis/p/spark_parameters.html 摘要 1.num-executors 2.executor-memory 3.ex ...
- Spark记录-Spark作业调试
在本地IDE里直接运行spark程序操作远程集群 一般运行spark作业的方式有两种: 本机调试,通过设置master为local模式运行spark作业,这种方式一般用于调试,不用连接远程集群. 集群 ...
- spark作业运行过程之--DAGScheduler
DAGScheduler--stage划分和创建以及stage的提交 本篇,我会从一次spark作业的运行为切入点,将spark运行过程中涉及到的各个步骤,包括DAG图的划分,任务集的创建,资源分配, ...
- Spark作业执行流程源码解析
目录 相关概念 概述 源码解析 作业提交 划分&提交调度阶段 提交任务 执行任务 结果处理 Reference 本文梳理一下Spark作业执行的流程. Spark作业和任务调度系统是其核心,通 ...
- spark-submit提交spark任务的具体参数配置说明
spark-submit提交spark任务的具体参数配置说明 1.spark提交任务常见的两种模式 2.提交任务时的几个重要参数 3.参数说明 3.1 executor_cores*num_execu ...
随机推荐
- VUE-router-跳转
跳转的 // 字符串 this.$router.push('/home/first') // 对象 this.$router.push({ path: '/home/first' }) // 命名的路 ...
- flutter 解决无法安装或者安装依赖慢的问题
配置以下两个系统环境变量 右击计算机 --> 属性 --> 高级系统设置 --> 环境变量 PUB_HOSTED_URL : https://pub.flutter-io.cn FL ...
- Discuz 7.x/6.x 全局变量防御绕过导致代码执行
地址 http://192.168.49.2:8080/viewthread.php?tid=13&extra=page%3D1 安装成功后,找一个已存在的帖子,向其发送数据包,并在Cooki ...
- etcd raft 处理流程图系列1-raftexample
最近在看raft相关的代码和实现,发现etcd的raft模块在实现上还是比较灵活的,但缺点就是需要用户实现比较多的功能,如存储和网络等,同时带来的优点就是不会对用户的存储和传输作限制.网上对该模块的描 ...
- 大数据学习(11)—— Hive元数据服务模式搭建
这一篇介绍Hive的安装及操作.版本是Hive3.1.2. 调整部署节点 在Hadoop篇里,我用了5台虚拟机来搭建集群,但是我的电脑只有8G内存,虚拟机启动之后卡到没法操作,把自己坑惨了. Hive ...
- SpringCloud升级之路2020.0.x版-6.微服务特性相关的依赖说明
本系列代码地址:https://github.com/HashZhang/spring-cloud-scaffold/tree/master/spring-cloud-iiford spring-cl ...
- Mongodb集成LDAP授权
一.环境简介 Mongodb enterprise v4.0.16 OpenLDAP v2.4.44 二.Mongodb集成LDAP的授权过程 客户端指定某种外部验证方式链接Mongodb: Mong ...
- Java on Visual Studio Code的更新 – 2021年7月
Nick zhu, Senior Program Manager, Developer Division at Microsoft 大家好,欢迎来到 7 月版的 Visual Studio Code ...
- Android音视频开发(1):H264 基本原理
前言 H264 视频压缩算法现在无疑是所有视频压缩技术中使用最广泛,最流行的.随着 x264/openh264 以及 ffmpeg 等开源库的推出,大多数使用者无需再对H264的细节做过多的研究,这大 ...
- java环境的配置——实现win10下双击直接运行jar文件
java环境的配置--实现win10下双击直接运行jar文件 在渗透测试的过程中很多工具的安装和使用需要java环境,下面我来介绍一下java环境配置的超详细步骤(包含怎样实现win10下双击直接运行 ...