鱼喃

听!布鲁布鲁,大鱼又在那叨叨了

基于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集群

假定三个zk节点的 host 分别是 zookeeper_node1, zookeeper_node2, zookeeper_node3

建立 Apache 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

然后分发到所有节点的 /data/storm/config 目录。

启动3个nimbus节点

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

执行3次,需要替换${i}为1,2,3

必须要挂载主机/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
9
docker service create \
--name storm_supervisor \
--hostname storm_supervisor_{{.Task.ID}} \
--network swarm-net \
--replicas 5 \
--endpoint-mode dnsrr \
--mount type=bind,src=/data/storm/config/storm.yaml,dst=/conf/storm.yaml \
--user 1000:1000 \
storm:1.1 storm supervisor

启动1个ui节点

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

完整脚本: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
2
docker exec -it storm_supervisor.1.xxxxxxxxx
bin/storm logviewer