Storm经验总结

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);
	}

}



猜你喜欢

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