[Storm] No data flows into bolt
最近在HDP2.1的HBase环境中安装了一个Storm测试机器(单节点,JDK8),遇到了几个问题,记录下来。
尝试步骤
1. 使用和HBase一样HDP版本,直接安装Storm
yum install storm
顺利安装完了。nimbus, supervisor and ui都能顺利起来。一个小插曲是,中途需要修改UI使用的端口,默认的8080被占用。所幸只需要添加配置 ui.port 就解决了。
然后提交topology后,怎么都跑不起来。查看version,蒙逼了,Storm的版本是0.9.1。而我需要的至少0.9.3
教训一:做之前,需要弄清楚做完后是否满足自己的需求。绕了一大圈,才发现安装的版本不对。
2. 重新安装Storm 0.9.3
由于目前机器上只有HDP2.1的配置,可查看 /etc/yum.repo.d/,后来找了一个HDP2.2的repo配置,放在了 /etc/yum.repo.d/下面,所幸什么都不需要重启,yum install直接就发现这个repo 了。就这样storm安装完成了。不可漏掉的是,使用HDP安装Storm前,需要手动先 adduser storm。因为Storm安装不会帮我们安装(坑,明明其他的都不需要特意创建用户)
3. 配置Storm运行参数
1)首先需要配置Storm JDK8环境。配置 conf/storm-env.sh + storm用户下的 ~/.bash_profile
2) 配置 conf/storm.yaml。这个就不用多说了
4. Storm跑起来
nohup storm nimbus/supervisor/ui &
一切似乎很顺利。然后接下来发生了事情,坑了我整整一天的时间。
提交完Topology,check log 发现Spout emitting数据似乎没有进到下一个Bolt。NO DATA flows into Bolt,而且UI上bolt的input stats是empty,即Bolt连input stream都没有detect到!从代码上看这是不可能发生的事。
5. 接下来开始了漫漫的DEBUG之路...
TRY1: 想到之前自己改过 ui.port。当时发现有个配置storm.exhibitor.port和ui.port都使用8080,开始怀疑是不是修改ui.port,是不是应该修改一下也storm.exhibitor.port。修改并重启storm所有服务。然并卵。
storm.exhibitor.port:the port Storm will use to connect to each of the exhibitor servers. Apache Exhibitor is a supervisor system for ZooKeeper.
ui.port与storm.exhibitor.port是否有直接关系,不得而知了。但是至少它不是问题的根本原因
TRY2: 修改topology的并发度,即修改bolt的tasks个数。然并卵。
TRY3: Enable Storm debug模式。因为checkout log,看到很多异常log,比如 Spout Failing,Timeout之类的。但是就是基本看不到任何Exception,ERROR。
所以想到大概是我没有把DEBUG模式打开吧。回去看代码发现
stormConf.put(stormConf.TOPOLOGY_DEBUG, true);
赫然在目。恩,肯定是开的还不够,check网上的说明,看见了
// When set to true, Storm will log every message that's emitted. stormConf.put(stormConf.TOPOLOGY_DEBUG, true); // same to above stormConf.setDebug(true);
人家还加了 stormConf.setDebug(true)。病急乱投医,修改后还是没什么用。现在想来那是当然的,我也是脑子被驴踢了,set storm debug直接的效果导致log泛滥, every message级别的;而且 setDebug(true)也不是啥特别的,只不过是上面set debug的另一种写法。
TRY4: Disable spout/bolt 吐message这种log,太烦了。Disable Topology Debug功能。Topology LOG顿时清楚了,Exception无比清晰、醒目的出现在log中。
asm.4.0啥的没有加载到。想到听人说过Storm0.9.3不支持JDK8,问题就处在asm的版本上。最后把 asm 4.0换成 asm-all 5.0,重启storm集群(不重启,虽然storm classpath里面就能检测到变化,然后那只是假象)。OVER。
总结
Storm topology debug害人不浅。
数据不能从Spout流向Bolt,原来是asm出问题了。