# to worker
worker.childopts: "-Xmx768m"
如果worker在运行时,需要用指定的JVM参数,那么可以像这样配置:
worker.childopts: "-Dworker=worker -Xmx768m -Xdebug –Xnoagent-Djava.compiler=NONE-Xrunjdwp:transport=dt_socket,address=8111,suspend=y,server=y"
11关于spout/bolt的生命周期
一般来说spout/bolt的生命周期如下:
1 在提交了一个topology之后(在nimbus所在的机器),创建spout/bolt实例(spout/bolt在storm中统称为component)并进行序列化;
2 将序列化的component发送给所有的任务所在的机器;
3 在每一个任务上反序列化component;
4 在开始执行任务之前, 先执行component的初始化方法(bolt是prepare, spout是open);
因此component的初始化操作应该在prepare/open方法中进行,而不是在实例化component的时候进行。
12关于storm与spring框架集成问题
首先声明一下,这个问题是当时有考虑到是否可以将storm与spring集成时,在网上看到的一点介绍,只是为了日后做参考。
在进行storm与spring集成时,本来想着一次就能成功,抱着很大的希望可是运行时竟然报了个java.io.NotSerializableException的异常。该异常要求被依赖注入的jar包实现序列化接口,但那些jar包都是别人开发的你不能一个一个都改掉源码才能用到项目里。
再网上找一下还真有人遇到类似的问题,具体原因是对storm的spout和bolt的生命周期理解的不够深刻。
一般来说spout/bolt的生命周期如下:
1.在提交了一个topology之后(在nimbus所在的机器),创建spout/bolt实例(spout/bolt在storm中统称为component)并进行序列化.
2.将序列化的component发送给所有的任务所在的机器
3.在每一个任务上反序列化component.
4.在开始执行任务之前, 先执行component的初始化方法(bolt是prepare, spout是open).
因此component的初始化操作应该在prepare/open方法中进行,而不是在实例化component的时候进行.
按照这种说法进行改造,结构该问题消失了。但接下来又有了新的问题:
Caused by: org.xml.sax.SAXParseException: Content is not allowedin prolog.
这个异常网上搜索之后发现原来是由于*.xml文件编码的问题。原因是在从其他项目里或者编辑工具编辑时,在文件编码中加入了BOM头的原因,于是用notePad++打开xml文件选择去掉BOM头信息,重新进行保存即可。
13关于java.lang.NoClassDefFoundError: clojure.core.protocols$
原因:JDK版本不匹配,安装虚拟机时系统自带一个jdk.1.5.0。
解决办法:检查jdk版本,卸载系统自带的JDK,使用自己安装的JDK版本。
# rpm –qa | grep java
# rpm –e –nodeps java-*
配置环境变量,vi /etc/profile
重新执行一遍试试,貌似问题解决了。
14关于storm连接Mysql
连接远程mysql是报如下错误:
message from server:"Host FILTER" is not allowed to connect tothis MySQL server
解决方案:
很可能是你没有给其他IP访问你数据库的权限,你可以试试:
在MySql数据库的主机上,在mysql命令行中输入以下命令:
grant all on *.* to root@'%' identified by "111111" ;
这样,给任何IP都赋予了访问的权限,
任何IP都能以,用户名:root ,密码:111111
来进行局域网的访问!
(命令中*.*是通配任何IP,你也可以指定IP)
15关于metaq启动的出现服务拒绝连接的问题
解决办法:在metaq安装目录下,删掉之前的日志文件,测试网络是否正常连接。将之前的服务的metaq进程kill掉,然后重启。
16 关于topology的spout与bolt
之前有问到,一个topology中可不可以有多个spout?这个问题貌似很幼稚啊,呵呵。关于这个问题,我是这样考虑的:实际应用中,如果我们每一条应用都创建一个topology的话,未免也太夸张了。如果是同一个应用,同一个数据来源,但是你想分几种方式对这个数据做处理的话,这时候就应该是建多个spout了,让这些spout并行去读数据,然后交给订阅这个spout的bolt去处理就行,没必要一种处理方式建一个topology。
17关于shell脚本编码格式问题
这是我在写启动storm集群的shell脚本时遇到的一个实际问题。shell脚本运行时报错误:/bin/bash^M: badinterpreter
出现原因:windows上写的脚本,直接拷贝到Linux系统上运行由于格式不兼容导致。
17.1解决方案(一):
1. 比如文件名为myshell.sh,vim myshell.sh
2. 执行vim中的命令 : set ff?查看文件格式,如果显示fileformat=dos,证明文件格式有问题。
3. 执行vim中的命令 :set fileformat=unix将文件格式改过来就可以了,然后:wq保存退出就可以了。
17.2解决方案(二)
或者使用最笨的方法:将windows下编辑好的脚本通过txt文本格式转换,然后在拷贝到linux下。
如果是使用Notepad编辑器进行编辑的话,可以在菜单栏上选择“编辑”—“档案���式转换”—“转换为 UNIX 格式”。