Storm里的jave类加载问题

其实我也不懂。大笑


但是我昨天发现了一个问题,由此展开了实现,具体结果如下。


试验1:一个工程里边2个主函数,分别启动成2个服务

我的storm服务器,我每次把打包好的程序放上,发布了以后都要等一会才能运行。大概1分钟左右。

我这里的做法是

一个工程,其中有2个类都是主函数,A.java与B.Java

然后再A与B里我都调用了C.java与D.java。

然后我把工程打包成a.jar与b.jar

这个时候,我放到strom上,先启动a.jar,然后卡住了。

然后我又启动b.jar

如果我只启动a.jar,那么卡一分钟左右会执行。

但是当我启动a.jar以后马上改成启动b.jar

就会出现b.jar马上就执行了,但是a.jar就再也不执行了。

我目前的猜想是A与B都调用了C类。而B先加载了C类。所以A执行等待B释放C。所以A就卡住不懂了这只是我的猜想。



试验2:我要试验试验1里的猜想。看看是否存在2个jar会互相加载对方的class就因为路径一样。

环境同上,但是这次,我对D.java进行了修改。D不对数据库进行修改,上边的a.jar与b.jar里,D.java都会插入记录到数据库

然后我把工程再次打包成c.jar,这次我只启动c.jar这个时候问题来了!

c.jar启动以后,数据库里仍然被插入了数据,但是我的c.jar里的D.java是已经不往数据库里插数据了。

那么说明strom加载的是我a.jar或者b.jar里的D.java这个类。

于是我删除了服务器上在试验1里已经上传的a.jar与b.jar,只留下c.jar,再次启动c.jar,OK这次启动后不再往数据库里插入记录了。

得出结论就是不懂的jar包会加载其他jar包里与自己jar包里地址完全相同的类,引起程序错误,所以如果在strom上,跑2个任务,最好JAVA类都别重复。


试验3:strom加载的jar包到底应该放在哪里。

试验之前遇到的问题。

我的需求是在strom里从kafka里取数据出来然后插入到HBase里。

上边能够在strom里正常跑的任务已经有了,Hbase操作类我也写好了。

于是,我在strom的D.java里实例化了Hbase操作类。其中D.java是一个strom正常的Bolt

public class SimpleBolt2 extends BaseBasicBolt

Hbase操作类,正常在本地用主函数调用是没有问题的,能够正常插入数据,建表,删表等操作。

我这种写法在本地跑StromTopology也是没问题的,能够正常插入Hbase.

但是当我放到storm服务器上跑,问题来了。

主要是2个提示,第一个是

Hbase操作类不能被初始化  Could not initialize class HbaseUtil

第二个是HbaseUtil里加载的类,就是Hbase相关的类,不能被找到。classNofound

所以我怀疑是我的依赖包放的位置不对,没被加载,那么究竟应该怎么办。


试验具体步骤

我这里主要是要确定我的jar包应该放在什么位置,因为Hbase依赖包太多所以这里我做个别的试验。

首先我新建一个工程T1,里边只有一个类,CCC.java

然后打包成ccc.jar,我这里CCC.jar,实现了序列化接口。(其实实现接口与没实现接口我都试验了)。

然后我把ccc.jar加入我原来的工程,之后我在我的Bolt1里边调用了A.java,这个A.java就在我的Topology包里

然后AAA.java里实例化了CCC.java。

程序发布运行以后,就会报错,说是A.java里找不到CCC.java.我把ccc.jar放在storm安装目录的lib里

放在JDK里lib里,放在JRE的lib里,放在/usr/share/java里,都不行。

所以这个问题最后没解决!

在aboutyun里有人建议我把ccc.jar利用maven跟我的Topology打成一个jar包发布。这样就能找到了,但是我没试验过。














猜你喜欢

转载自blog.csdn.net/lwb314/article/details/47040699