1. 工作中遇到 Supervisor 一直重启
K8S 里的 Supervisor 容器一直在重启,最终发现是因为 Bolt 组件里存储数据到 InfluxDB 的线程报错了,这是因为InfluxDB的RP设为2天,2天前的数据存储进来会报错。这个问题出现几次了,最终发现是客户那的服务器会时不时的停机1、2天,由于kafka和supervisor装在同一个K8S服务器上,停机时可能kafka里的部分数据还没被 storm消费完,这样等到第3天服务器开机时,storm就开始消费3天前的数据,处理完成后存储到 InfluxDB,此时就报错了。
2. Bolt 组件线程报错,为何导致 Supervisor 一直重启
Supervisor是个守护进程,负责启停Worker进程。Worker 进程负责创建Spout/Bolt任务(即线程)可以有很多个这种任务。Bolt则负责数据过滤、函数处理、聚合并保存数据等。如果在Bolt线程出错(保存到 InfluxDB 失败),则Worker进程就出错,此时 supervisor 会不会重启得看它的配置,在配置文件里有个 autorestart 属性,有三个选项,false,unexpected和true。
- 如果为 false,无论什么情况下,都不会重启。
- 如果为 unexpected,只有当程序退出时的退出码不是exitcodes中定义的时才会重启,
- 如果为 true,进程会无条件重启当退出的时候。
默认值为 unexpected,表示进程意外杀死后才重启。
3. Supervisor、Worker、Task 快速简介
3.1 Supervisor
定时从zookeeper获取拓补信息topologies、任务分配信息assignments及各类心跳信息,以此为依据进行任务分配。在supervisor同步时,会根据新的任务分配情况来启动新的worker或者关闭旧的worker并进行负载均衡。
3.2 Worker
Worker是具体处理 Spout/Bolt 逻辑的进程,根据提交的拓扑中 conf.setNumWorkers(2); 定义分配每个拓扑对应的worker数量,Storm会在每个Worker上均匀分配任务,一个Worker只能执行一个topology,但是可以执行其中的多个任务线程。
3.3 Task
任务是指Worker中每个Spout/Bolt线程,每个Spout和Bolt在集群中会执行许多任务,每个任务对应一个线程执行,可以通过TopologyBuilder类的setSpout()和setBolt()方法来设置每个Spout或者Bolt的并行度。