java.lang.NoSuchMethodError和kafka.common.OffsetOutOfRangeException(Spark)

来源:互联网 发布:百度竞价数据分析案例 编辑:程序博客网 时间:2024/06/01 08:15


一、关于 java.lang.NoSuchMethodError这个异常类型,其实如果遇到次数比较多了,大概可以判断是什么样的情况:


如在有一次在自己电脑上放一个spark的测试环境的时候,报了如下的异常:

 java.lang.NoSuchMethodError:
org.apache.hadoop.hive.conf.HiveConf$ConfVars.getDefaultExpr()Ljava/lang/String;

遇到这种NoSuchMethodErro(没有这样的方法的异常),差不多就是如下的三种情况:

1、依赖包相互冲突,程序运行的时候不知道运行哪个类?


2、导错包,没有这样的方法?


3、maven项目jar包没下载全,可能由于网络不好等等原因(我就是这个原因,这个原因的可能性比较大)

因此重新刷新了下pom,重新下载了下jar包,就不报这个错了!

二、SparkStreaming报错
Caused by: kafka.common.OffsetOutOfRangeException

具体报错:

Caused by: kafka.common.OffsetOutOfRangeException
at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:57)
at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
at java.lang.reflect.Constructor.newInstance(Constructor.java:526)
at java.lang.Class.newInstance(Class.java:374)
at kafka.common.ErrorMapping$.exceptionFor(ErrorMapping.scala:86)
或者:
Exception in thread "main" java.lang.IllegalArgumentException: requirement failed: numRecords must not be negative
at scala.Predef$.require(Predef.scala:233)

第一个问题:

简单来看是因为streaming使用direct方式连接kafka,手动给定的偏移量超出范围,偏移量超出范围会有两种情况,要么是太大,要么是太小。

但是其实我是传入了0(也就是从头开始消费数据),居然还超出范围,应该不可能!后来我想到了,我使用的topic是测试topic,就是说我很久之前是用过的,然后偏移量为0的数据(存在本地磁盘)已经被自动删除掉了!所以当然就超出范围了,那么你可以把偏移量的值设置大点,大到能够够到你现在输入的数据(反正只是测试)

那么实际开发中如果遇到这样的问题,可以通过参数设置,让kafka储存数据时间增长

(1)、直接在配置文件 

kafka/config/server.properties 

log.retention.hours=24(定义保留日志的小时)

(2)、或者可以在不关闭kafka服务的情况下,直接更改kafka的topic服务的配置:

./kafka-topics.sh --zookeeper zk1:2181 -topic topicname --alter --config retention.ms=86400

(retention.ms该参数单位是毫秒,官网上默认是7days,修改的命令版本不同,可能会有所区别,请以官方为准)

官网地址:http://kafka.apache.org/082/documentation.html

修改完成后重启kafka。
使用zk shell 命令得到解析器所保存的zk_offset
停止spark streaming kafka DirectStream job
发送数据到kafka topic,等待一段时间(超过两分钟)
启动streaming job,复现该异常。


第二个问题:
numRecords must not be negative这个是说传入的偏移量是负数,但是其实我并没有传负数进去。。
不知道为什么,应该是做判断的时候这个数字取值的时候出了问题,所以。。。(有可能是默认值是-1的原因)

阅读全文
0 0
原创粉丝点击