1. 关于log
用storm jar ...将项目提交给storm集群后,想查看本项目的log信息,要到supervisor机器的:storm安装路径/logs/worker-number.log(其中的number视实际情况而定)中查看。
如果是用daemontools启动的storm,daemontools监控的目录是/service/storm,那么到/service/storm/logs中查看worker-number.log日志。
若要更改log的级别,是debug还是info等,在storm安装路径/log4j下有个配置文件,按需要修改即可。
程序代码中,log相关代码像这样:
public static Logger logger = org.apache.log4j.Logger.getLogger(ReadLogSpout.class);
...
logger.info("");
...
storm的debug模式下,它本身的log非常庞大,所以我觉得自己的代码中有些重要的信息,用info比较好,这样将storm的log级别调整为info比较方便查看。
2. 关于maven打成jar包的依赖们
a. 首先maven的pom文件中的storm依赖,要么加exclude storm的相关语句(github有说明),要么加<scope>,如下:
<dependency>
<groupId>storm</groupId>
<artifactId>storm</artifactId>
<scope>test</scope>
</dependency>
加scope可以使打jar包时,不包含storm。
如果包含了storm,那么提交到storm集群,会运行出错。官方要求打jar包时,要去除storm的依赖。
b. 使用maven插件,在打jar包时,包含依赖。在pom中加入:
<plugin>
<artifactId>maven-assembly-plugin</artifactId>
<configuration>
<descriptorRefs>
<descriptorRef>jar-with-dependencies</descriptorRef>
</descriptorRefs>
<archive>
<manifest>
<mainClass>com.path.to.main.Class</mainClass>
</manifest>
</archive>
</configuration>
</plugin>
打jar包时使用命令:mvn assembly:assembly
c. 依赖的jar冲突问题
如果本地依赖的jar依赖,与storm的lib下的jar有冲突,即都用了一个jar,但是版本不同,那么貌似目前只能改为跟storm保持统一。官方的讨论组是这样说的。。。
3. storm nimbus启动失败
在使用了storm一段时间后,需要重新部署storm的集群,主要是想将storm部署在其它机器上。做了以下错误操作:
1) 没有kill 正在运行的topology,kill nimbus和supervisor的storm进程
2) 删除了配置中"storm.local.dir"的文件夹内的内容
3) 启动storm nimbus
报错:
backtype.storm.daemon.nimbus
$fn__2692$exec_fn__945__auto____2693$this__2731@62135133
java.io.FileNotFoundException: File '/opt/apps-install/storm/
storm_local/nimbus/stormdist/appFailed-6-1325065153/stormconf.ser'
does not exist
at
org.apache.commons.io.FileUtils.openInputStream(FileUtils.java:137)
at
org.apache.commons.io.FileUtils.readFileToByteArray(FileUtils.java:
1135)
at backtype.storm.daemon.nimbus
$read_storm_conf.invoke(nimbus.clj:128)
at backtype.storm.daemon.nimbus
$compute_new_task__GT_node_PLUS_port.invoke(nimbus.clj:244)
at backtype.storm.daemon.nimbus
$mk_assignments.invoke(nimbus.clj:288)
at backtype.storm.daemon.nimbus
$fn__2692$exec_fn__945__auto____2693$this__2731.invoke(nimbus.clj:460)
at backtype.storm.event$event_manager
$fn__2068$fn__2069.invoke(event.clj:25)
at backtype.storm.event$event_manager
$fn__2068.invoke(event.clj:22)
at clojure.lang.AFn.run(AFn.java:24)
at java.lang.Thread.run(Thread.java:662)
2011-12-29 16:15:02 util [INFO] Halting process: ("Error when
processing an event")
之所以报这个错误,是因为没有先kill topology,所以在启动nimbus时,zookeeper中依然保留了上次运行着的topology的信息,解决办法是用zookeeper的zkCli.sh清理一下,我直接重装了zookeeper。但是据说在storm 0.6.1中解决了该bug。而我用的是storm 0.6.0
4. storm使用JVM参数
在配置文件storm.yaml中,有:
# to nimbus
nimbus.childopts: "-Xmx1024m"
# to supervisor
supervisor.childopts: "-Xmx1024m"
# 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 "