Skip to content
This repository has been archived by the owner on Jun 16, 2023. It is now read-only.

常见问题

Cody edited this page Mar 30, 2016 · 16 revisions

性能问题

参考性能优化

资源不够

当报告 ”No supervisor resource is enough for component “, 则意味着资源不够 如果是仅仅是测试环境,可以将supervisor的cpu 和memory slot设置大,

在jstorm中, 一个task默认会消耗一个cpu slot和一个memory slot, 而一台机器上默认的cpu slot是(cpu 核数 -1), memory slot数(物理内存大小 * 75%/1g), 如果一个worker上运行task比较多时,需要将memory slot size设小(默认是1G), 比如512M, memory.slot.per.size: 535298048

 #if it is null, then it will be detect by system
 supervisor.cpu.slot.num: null

 #if it is null, then it will be detect by system
 supervisor.mem.slot.num: null

# support disk slot
# if it is null, it will use $(storm.local.dir)/worker_shared_data
 supervisor.disk.slot: null

提交topology时报:org.apache.thrift.transport.TTransportException: Frame size (17302738) larger than max length (16384000)!

这个问题的原因是序列化后的topology对象过大导致的,通常可能是你在spout/bolt中创建了一个大对象(比如bitmap, 大数组等),导致序列化后对象的大小超过了thrift的max frame size(thrift中16384000这个值是写死的,只能调小不能调大)。在JStorm中,如果需要在spout/bolt中创建大对象,建议是在open/prepare方法中来做,延迟对象的创建时间。参见:https://github.com/alibaba/jstorm/issues/230

序列化问题

所有spout,bolt,configuration, 发送的消息(Tuple)都必须实现Serializable, 否则就会出现序列化错误.

如果是spout或bolt的成员变量没有实现Serializable时,但又必须使用时, 可以对该变量申明时,增加transient 修饰符, 然后在open或prepare时,进行实例化

seriliazble_error

日志冲突

JStorm 0.9.x系列使用log4j作为日志系统,2.x系列使用logback作为日志系统。 但是不管使用哪个版本的jstorm,都需要注意的是不能使用冲突的日志依赖。比如log4j-over-slf4j和slf4j-log4j12是冲突的,它们是肯定不能共存的,否则会出现类似这个错误:

SLF4J: Detected both log4j-over-slf4j.jar AND slf4j-log4j12.jar on the class path, preempting StackOverflowError. 
SLF4J: See also 
http://www.slf4j.org/codes.html#log4jDelegationLoop for more details.
Exception in thread "main" java.lang.ExceptionInInitializerError
        at org.apache.log4j.Logger.getLogger(Logger.java:39)
        at org.apache.log4j.Logger.getLogger(Logger.java:43)
        at com.alibaba.jstorm.daemon.worker.Worker.<clinit>(Worker.java:32)
Caused by: java.lang.IllegalStateException: Detected both log4j-over-slf4j.jar AND slf4j-log4j12.jar on the class path, preempting StackOverflowError. See also 
http://www.slf4j.org/codes.html#log4jDelegationLoop for more details.
        at org.apache.log4j.Log4jLoggerFactory.<clinit>(Log4jLoggerFactory.java:49)
        ... 3 more
Could not find the main class: com.alibaba.jstorm.daemon.worker.Worker.  Program will exit.

具体地来说,jstorm 0.9.x依赖了log4j, slf4j-log4j12,因此如果使用了0.9.x版本,你的应用代码中必须要排除掉log4j-over-slf4j的依赖。 同样地,jstorm 2.x依赖了logback, log4j-over-slf4j,如果使用了这个版本,你的应用代码中需要排除掉slf4j-log4j12的依赖。

类冲突

如果应用程序使用和JStorm相同的jar 但版本不一样时,建议打开classloader, 修改配置文件

topology.enable.classloader: true

或者

ConfigExtension.setEnableTopologyClassLoader(conf, true);

JStorm默认是关掉classloader,因此JStorm会强制使用JStorm依赖的jar

提交任务后,等待几分钟后,web ui始终没有显示对应的task

有3种情况:

用户程序初始化太慢

如果有用户程序的日志输出,则表明是用户的初始化太慢或者出错,查看日志即可。 另外对于MetaQ 1.x的应用程序,Spout会recover ~/.meta_recover/目录下文件,可以直接删除这些消费失败的问题,加速启动。

通常是用户jar冲突或初始化发生问题

打开supervisor 日志,找出启动worker命令,单独执行,然后检查是否有问题。类似下图:

fail_start_worker

检查是不是storm和jstorm使用相同的本地目录

检查配置项 ”storm.local.dir“, 是不是storm和jstorm使用相同的本地目录,如果相同,则将二者分开

#提示端口被绑定 有2种情况:

多个worker抢占一个端口

假设是6800 端口被占, 可以执行命令 “ps -ef|grep 6800” 检查是否有多个进程, 如果有多个进程,则手动杀死他们

系统打开太多的connection

Linux对外连接端口数限制,TCP client对外发起连接数达到28000左右时,就开始大量抛异常,需要

 # echo "10000 65535" > /proc/sys/net/ipv4/ip_local_port_range

其他问题,可以入QQ群进行咨询228374502

Clone this wiki locally