逍遥游

基于Docker Swarm搭建Apache Storm集群

Storm介绍

Apache Storm是一种侧重于极低延迟的流处理框架,也许是要求近实时处理的工作负载的最佳选择。该技术可处理非常大量的数据,通过比其他解决方案更低的延迟提供结果。
(http://www.infoq.com/cn/articles/hadoop-storm-samza-spark-flink)

搭建Zookeeper集群

Apache Storm集群需要Zookeeper集群来管理节点,所以需要先建立Zookeeper集群。
可以参考:基于Docker Swarm搭建Zookeeper集群

建立Storm集群

以搭建具有3个nimbus节点、5个supervisor节点、1个ui节点的storm集群为例

有两种方式来配置storm集群,一种是通过启动时参数的方式,另一种是配置文件。本文使用第二种配置文件的方式。

编写配置文件

创建文件storm.yaml

1
2
3
4
5
6
7
8
storm.zookeeper.servers:
- "zookeeper_node1"
- "zookeeper_node2"
- "zookeeper_node3"
nimbus.seeds: ["storm_nimbus1", "storm_nimbus2", "storm_nimbus3"]
client.jartransformer.class: "org.apache.storm.hack.StormShadeTransformer"
storm.local.dir: "/data"

storm配置文件见defaults.yaml

启动3个nimbus节点

1
2
3
4
5
6
7
8
9
docker service create \
--name storm_nimbus${i} \
--network swarm-net \
--hostname storm_nimbus${i} \
--endpoint-mode dnsrr \
--mount type=bind,src=/mnt/data/storm/data/nimbus${i},dst=/data \
--mount type=bind,src=/mnt/data/storm/config,dst=/conf \
--user 1000:1000 \
storm:1.1 storm nimbus

执行3次,需要替换${i}
完整脚本:start_storm_nimbus.sh

必须要挂载主机/data目录,storm集群会将提交的jar文件等放在这里,如果持久化,nimbus节点重启后就会找不到文件,无法加入集群,并抛出以下错误

1
2
3
2017-05-02 07:43:25.280 o.a.s.b.BlobStoreUtils timer [ERROR] Could not download blob with keyStreamSpider-1-1493707712-stormjar.jar
2017-05-02 07:43:25.282 o.a.s.b.BlobStoreUtils timer [ERROR] Could not download blob with keyStreamSpider-1-1493707712-stormconf.ser
2017-05-02 07:43:25.283 o.a.s.b.BlobStoreUtils timer [ERROR] Could not download blob with keyStreamSpider-1-1493707712-stormcode.ser

启动5个supervisor节点

1
2
3
4
5
6
7
8
docker service create \
--name storm_supervisor \
--network swarm-net \
--replicas ${SUPERVISOR_NUM} \
--endpoint-mode dnsrr \
--mount type=bind,src=/mnt/data/storm/config,dst=/conf \
--user 1000:1000 \
storm:1.1 storm supervisor

完整脚本:start_storm_supervisor.sh

启动1个ui节点

1
2
3
4
5
6
7
docker service create \
--name storm_ui \
--network swarm-net \
--publish 8080:8080 \
--endpoint-mode vip \
--mount type=bind,src=/mnt/data/storm/config,dst=/conf \
storm:1.1 storm ui

完整脚本:start_storm_ui.sh

访问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
2
docker exec -it storm_supervisor.1.xxxxxxxxx
bin/storm logviewer


多说停止服务,disqus引导注册太过分,暂时不上评论系统了。有机会自己造轮子吧。邮箱:input@newnius.com