1. Storm启动命令
我启动Strom命令以后就卡在那了,Ctrl+C或者关闭SSH都会导致服务关闭。
正确的启动命令是
storm ui &
然后敲
exit
退出以后,再关闭SSH服务就不会关闭了。
2.Storm发布命令
我将我本地运行正常的StromTopology工程,打成jar包
放到了storm的安装目录下的lib下
我的目录是
/usr/local/apache-storm-0.9.3/lib
然后把a.jar包复制到这个目录下,然后敲命令
storm jar a.jar test.SimpleTopology lwb_1
其中,黑色的'storm jar'是strom命令;红色的是我工程的jar包;蓝色的是我jar包里的主函数;最后lwb_1是我给服务起的名字。
3.Storm加载问题
我用一个工程打了2个jar包名字不一样,其中a.jar里边用的主函数是A;b.jar主函数是B
当然,A与B在a.jar和b.jar都有。
然后在A类和B类里,我都调用了C类。
这个时候,我放到strom上,先启动a.jar,然后卡住了。不知道为什么,我这个strom每次发布服务以后,都得卡半天,大概一分钟左右的时间,才能开始执行。
然后我又启动b.jar
如果我只启动a.jar,那么卡一分钟左右会执行。
但是当我启动a.jar以后马上改成启动b.jar
就会出现b.jar马上就执行了,但是a.jar就再也不执行了。
我目前的猜想是A与B都调用了C类。而B先加载了C类。所以A执行等待B释放C。所以A就卡住不懂了这只是我的猜想。
所以我要说的是,如果在strom上,跑2个任务,最好类别重复。
4.Storm里Executor跟Task的关系
之前一直没怎么想网上跟资料上说的他们2的关系是什么意思。直到我写了下边的代码。
topologyBuilder.setBolt("simple-bolt", new SimpleBolt(), 3).setNumTasks(2).shuffleGrouping("simple-spout");
这里可以看见我在代码里显示的设置了Executor为3,Task的数量为2.
然后运行的时候我发现storm UI监控里Executor跟Task的数量都是2个。但是我程序里明明设置的是3个。
这个时候再回去想书上写的东西,我就明白了,Task是在Executor线程里边跑的,而且一个
Executor必须要有一个Task,这个时候,因为我的程序只设置了2个Task,所以有一个Executor根本没有Task可以跑,所以这个不是没有了,就是没跑。
所以在监控页看见的Executor跟Task的数量才都是2个。
5.storm多线程导致数据不对的问题。
这几天一直在做试验,我是从在strom的spout里从kafka里取数据出来,然后在bolt里插入到Hbase里。有的时候用多线程以后就会出现数据对不上的问题,找了半天。
最后发现是插入的时候,记录rowkey我用的是bolt里的一个Long型的静态变量,导致出现数据条数不对的情况,我把数据的rowkey保证唯一以后,问题不再出现。
5.storm的Bolt与Bolt之间可以直接传递对象因为Values就是继承了一下ArrayList,但是这个对象要传递就必须序列化,否则会报错。
public void execute(Tuple input) {
try {
A a = new A();
String mesg = input.getString(0);
Integer aaa = 1;
if (mesg != null) {
collector.emit(new Values( mesg+"mesg is processed!",mesg,a));
// System.out.println("Bolt"+this.hashCode()+":"+mesg);
}
} catch (Exception e) {
e.printStackTrace(); // To change body of catch statement use File |
collector.fail(input); // Settings | File Templates.
}
collector.ack(input);
}
在下个bolt里,直接取就可以,或者直接getValue也行,这里的"obj"是在declareOutputFields里声明的
A a = (A)input.getValueByField("obj");
A.java
public class A implements Serializable{
/**
*
*/
private static final long serialVersionUID = -6812487879564685130L;
public void aaa(String a) {
HashMap<String, String> map = new HashMap<String, String>();
System.out.println(a+map);
}
}