Storm介绍
Apache Storm是一种侧重于极低延迟的流处理框架,也许是要求近实时处理的工作负载的最佳选择。该技术可处理非常大量的数据,通过比其他解决方案更低的延迟提供结果。
(http://www.infoq.com/cn/articles/hadoop-storm-samza-spark-flink)
搭建Zookeeper集群
Apache Storm集群需要Zookeeper集群来存储元数据,所以需要先建立Zookeeper集群。
可以参考:基于Docker Swarm搭建Zookeeper集群
假定三个zk节点的 host 分别是 zookeeper_node1
, zookeeper_node2
, zookeeper_node3
建立 Apache Storm 集群
以搭建具有3个nimbus节点、5个supervisor节点、1个ui节点的storm集群为例
有两种方式来配置storm集群,一种是通过启动时参数的方式,另一种是配置文件。本文使用第二种配置文件的方式。
编写配置文件
创建文件storm.yaml
1 | storm.zookeeper.servers: |
storm 默认配置文件见defaults.yaml
然后分发到所有节点的 /data/storm/config 目录。
启动3个nimbus节点
1 | docker service create \ |
执行3次,需要替换${i}为1,2,3
必须要挂载主机/data目录,storm集群会将提交的jar文件等放在这里,如果不持久化,nimbus节点重启后就会找不到文件,无法加入集群,并抛出以下错误
1 | 2017-05-02 07:43:25.280 o.a.s.b.BlobStoreUtils timer [ERROR] Could not download blob with keyStreamSpider-1-1493707712-stormjar.jar |
启动5个supervisor节点
1 | docker service create \ |
启动1个ui节点
1 | docker service create \ |
完整脚本:scripts/storm
访问web,测试
打开浏览器,输入 IP:8080。 不出意外,就可以看到集群已经正确建立了,所有的节点都显示在UI上。
关于web UI无法查看日志
我在使用的过程中发现,无法通过web UI来查看末各节点产生的日志。
两个原因导致:
1、web UI上的url地址是 hostname:8000 这种形式,外部网络无法解析
2、没有启动logviewer
第1个问题可以采用 无需端口映射,实现外部网络访问Docker集群内部服务 里的方案解决。
注意:因为docker目前无法解析自定义hostname,所以要么取消启动supervisor脚本中的指定hostname行为,要么把5个supervisor拆成5个service,就像nimbus那样
第2个问题可以进入容器之后开启
1 | docker exec -it storm_supervisor.1.xxxxxxxxx |