项目中storm下发的bolt有2层:
首先编写一个topology:
public class HomeBandToplogy {
private static final String TOPOLOGY_NAME = "HomeBandToplogy"
private static final String KAFKA_SPOUT = "kafkaSpout"
private static final String KAFKA_BOLT = "kafkaBolt"
private static final String ANYNASIS_BOLT = "AnynasisBolt"
private static final Log log = LogFactory.getLog(HomeBandToplogy.class)
}
然后编写一个kafkabolt和一个AnynasisBolt,如下:
kafkabolt:
public class KafkaBolt extends BaseRichBolt {
OutputCollector collector
Log logger
}
AnynasisBolt:
public class AnynasisBolt extends BaseRichBolt {
private OutputCollector collector
Log logger
}
工厂类:
public class BoxFactory {
}
接口类:
public interface BoxService extends Serializable {
}
抽象类:
**
@override
public Boolean executeRedis( return null)
@override
public Boolean executeHbase( return null)
}
storm程序启动以后,小批量数据运行正常。
继续加大数据测试,数据量达到几十万的时候,出现异常,异常如下:
[ERROR] connection attempt 9 to Netty-Client-node5/172.16.1.100:6700 failed: java.net.ConnectException: Connection refused: node5/172.16.1.100:6700
2018-11-16 17:46:11.533 o.a.s.u.StormBoundedExponentialBackoffRetry client-boss-1 [WARN] WILL SLEEP FOR 420ms (MAX)
同时storm程序大量ack失败。
开始以后是线程数过多,以及环境资源紧张导致此种异常。
后来经过重重排查,将接口去掉,将抽象类中的方法变为抽象方法后,程序运行正常。
为何出现这样的异常呢?
原因在于,storm在处理的时候只会处理当前进程下的任务,跨进程的调度是无法实现的,故产生这样的故障。
最近频繁遇到一个问题,storm在提交运行jar程序时,子进程supervisor总是挂机,导致无法运行jar项目,之前以为是环境的问题或是ZK的版本问题,后来查看supervisor.log的日志信息才发现问题所在。先来看看错误
这里多说一点,那么我们应该怎样关闭storm才不会出现这种错误能,最简单的就是jps查看进程后杀死,先从在主。(kill -9 进程ID)
解决办法
1:先检测storm配置文件storm.yaml,是否配置属性storm.local.dir;
2:若配置了storm.local.dir属性,在配置的路径下删除supervisor和workers两个文件夹即可;
3:若没有配置storm.local.dir属性,则添加配置即可;
4:重新启动;
这里要说的是,storm的日志在storm的logs目录下,它分为ui.log、nimbus.log、supervisor.log等等,当那个进程出现问题就查看对应日志即可
以下是几个shell脚本供参考
(1)批量启动ZK脚本:zookeeperStart.sh
(2)批量关闭ZK脚本:zookeeperShutdown.sh
(3)启动storm集群脚本:stormStart.sh
(4)关闭storm集群脚本:stormShutdown.sh
安装Storm软件分五步: 安装Zookeeper。 安装Storm的依赖环境:Java和Python。 下载并解压Storm安装包。 修改必要的Storm配置文件。 启动Storm程序。欢迎分享,转载请注明来源:内存溢出
评论列表(0条)