java.lang.IncompatibleClassChangeError 错误分析

    最近帮助同事把之前给他搭建的Hadoop2.2集群升级到2.4,并将之前我们做的实时应用程序迁移部署到Hadoop2.4上。

       在迁移的过程中,他发现之前通过Scribe客户端向Scribe中继发送日志的程序总是报错,异常日志是:

java.lang.IncompatibleClassChangeError: com/sina/mis/calligraphus/thrift/CalligraphusService$Client
	at com.sina.mis.client.ClientMulti.connect(ClientMulti.java:176)
	at com.sina.mis.client.ClientMulti.access$100(ClientMulti.java:37)
	at com.sina.mis.client.ClientMulti$1.run(ClientMulti.java:156)
	at java.util.TimerThread.mainLoop(Timer.java:512)
	at java.util.TimerThread.run(Timer.java:462)

      看一场应该是接口或者类的实现改变,导致的IncopatibleClassChangeError。 仔细检查了一下出错的代码为  inco1       分析一下Client一直是个抽象类,没有问题,Iface一直是接口也没有问题,出问题的就在TServiceClient接口上,联想到之前也是遇到过这个问题,Thrift在0.7以后这个接口就变成了抽象类,导致了implements报错,仔细的查看了一下集群上面使用这个累的jar包,确定是hive-exec.jar,反编译以后得到了印证:

col1

      最后解决方法,目前想到的是修改程序,明天查看一下是否可以通过选项将用户提交的jar包覆盖父类继承的CLASSPATH。

Jvm 参数选取顺序

      Jvm会选取最右侧的参数作为有效参数,当参数重复的时候,比如在Hadoop中修改启动的Jvm内存大小,需要将-Xmx或者-Xms放在最右侧,才能生效。

JVMTI Agent MANNIFEST.MF问题

      使用JVMTI对线上环境注射一个Agent用于对某些异常现象进行捕捉,这个过程后面会专门写一篇blog。对于Agent需要手动指定MANNIFEST.MF。今天在打包的时候一直出错,明明指定了Agent-Class: com.sina.cao.ProbeScheduler。但是打包后就消失了,解压后这行就丢了。经过检查发现,MANNIFEST.MF需要最后是一个空行。

line1:Manifest-Version: 1.0

line2:Agent-Class: com.sina.cao.ProbeScheduler

line3:

    这样打包以后就不会出问题了。