其实我也不懂。
但是我昨天发现了一个问题,由此展开了实现,具体结果如下。
试验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包发布。这样就能找到了,但是我没试验过。