面试题-Storm框架
前言
Storm框架在实际项目中已经平稳运行快一年了,也很好的支撑了海量读写器的数据处理需求,不过和RabbitMQ一样,为了项目进度,实际工作中只能尽快的调研,关注一些关键点,其他的细节就只能放一放。这次面试题总结也希望自己能够在关于提升我项目亮点的框架上多下一些功夫,被问到一些技术细节时,能够做到心中有数。
Storm实时流计算框架
-
Storm与hadoop对比?
- 应用场景:Storm专注于分布式实时流处理;Hadoop关注的是离线批处理
-
Storm集群架构是什么样的,简单介绍一下
Storm是master/slave架构,在传统的master/slave架构中,主节点一般负责任务的接受分配和监控,从节点负责具体任务的执行,Storn框架也类似,但是在其中有一些不同:
- nimbus主节点依然负责集群中分发任务以及监控
- supervisor从节点会启动一个worker来执行具体的任务,一个worker就是一个JVM进程
实际项目中,有四个服务器节点,选择了两台机器部署supervisor,防止单点问题;把nimbus和zookeeper部署在另外一台服务器上,只部署了一个实例,这个是根据Storm官方文档推荐部署的。因为对我们的业务系统来说,nimbus和zookeeper本身负载不算高。
-
Storm集群中的任务是什么样子的?简单介绍一下
Storm集群中的任务叫做拓扑,拓扑中包含两种类型的组件:
- Spoult:负责对接外部数据源,获取数据
- bolt:负责处理数据
我们实际项目中,有一个spoult对接RabbitMQ获取读写器实时数据,一个bolt组件进行去重分组以及相关统计信息的计算。处理完毕的数据,会继续传递到RabbitMQ中等待下层服务处理。
-
Topology在Storm集群中是如何分发的?
- storm jar命令上传jar包到storm的nimbus节点
- nimbus节点根据配置的信息查询空闲的worker
- 分配任务到具体的worker中,worker从nimbus下载待处理的jar包
-
具体的线程模型是怎样的?并发度如何设置?
Storm中多线程的设置叫做并发度,一个bolt或者spoult如果并发度设置大于1的话,就会实例多个,每一个对应一个线程去处理。
我们实际项目中,从RabbitMQ中获取数据使用了并发度为2的设置,一可以提高处理速度,二可以防止单点问题。bolt实际处理线程设置为10,分别对应了epc尾数0-9,可以并发的处理
-
消息是如何分发的?如何进行grouping分组设置?
storm中可以通过设置grouping分组,来自定义消息的分发细节。比如随机分组,按字段分组
我们实际项目中,使用的是按字段分组,分组字段是epc的后一位,相同epc尾数的可以被分到同一个线程处理,保证了线程安全问题。
-
Storm中是如何保证消息可靠性的?
Storm中消息链中的处理过消息的链条都会产生一个以数据源为tuple头的处理链,链上的每一个节点都需要显式的说明处理成功或者失败,如果有一个没有显式处理,那么这个消息就没有正确处理完毕。如果超时时间范围内没有处理完毕,就算处理失败。
如果成功处理或者处理失败,Storm框架会回调Spoult中的ack方法或者fail方法,可以在里面做可靠性的后续业务处理。