storm面试小题
Posted juncaoit
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了storm面试小题相关的知识,希望对你有一定的参考价值。
1.大纲
Storm工作原理是什么?
流的模式是什么?默认是什么?
对于mapreduce如何理解?
Storm的特点和特性是什么?
Storm组件有哪些?
2.Storm工作原理是什么?
相对于hadoop而言,strom的优势在于对于应对大数据两的实时数据处理上,因为hadoop在处理大数据过程中高延时的特点使得其面对实时数据缺乏足够的应对策略,目前strom已经被广泛的应用在诸如金融系统,实时推送系统,预警系统,网站统计等多个场景中,他可伸缩性高,不存在数据丢失,高容错性,高健壮性等特点都使得他在未来拥有更广阔的天地。
以消息队列作为核心技术,使用消息队列作为实时处理系统的数据源,而在消费者那端,使用死循环对消息队列进行监控,使得数据得以实时的被处理和存储。
1)集群是基于zookeeper集群存在的,Nimbus和Supervisor都是依赖于zookeeper建立的
2)主节点和工作节点的具体状态都保存在zookeeper中,主节点通过查看工作节点的状态文件是否存在判断工作节点的连接状态
3)主节点和工作接待点之间通过zookeeper集群进行协调,这使得Nimbus和Supervisor之间没有耦合,同时也提高了系统的健壮性
bolt是作为一个消息处理者的角色存在的,它存在的主要作用有两个:接收处理数据和发送数据给下一个bolt。
Bolt处理Stream内部的tuple,bolt可以消费任意数量的输入流,只要将流的方向导入到该blot,同时他也可以发送新的流给其他的bolt。
Bolts处理一个输入tuple,然后调用ack通知strom自己已经处理过这个tuple了,Storm提供一个IBasicBolt会自动调用ack。
Bolts使用OutputCollector来发射tuple到下一级Bolt。
Tuple:Strom将stream中的元素抽象为tuple,每一个tuple都是一个Key List形式的值列表,每一个key都有一个名称name,并且这个可以是一个任意可序列化的类型
3.流的模式是什么?默认是什么?
流是Storm中的核心抽象。一个流由无限的元组序列组成,这些元组会被分布式并行地创建和处理。通过流中元组包含的字段名称来定义这个流。
每个流声明时都被赋予了一个ID。只有一个流的Spout和Bolt非常常见,所以OutputFieldsDeclarer
提供了不需要指定ID来声明一个流的函数(Spout和Bolt都需要声明输出的流)。这种情况下,流的ID是默认的“default”。
4.Storm Group分类
-
Shuffle Grouping
随机分组, 随机派发stream里面的tuple, 保证bolt中的每个任务接收到的tuple数目相同.(它能实现较好的负载均衡)
-
Fields Grouping
按字段分组, 比如按userid来分组, 具有同样userid的tuple会被分到同一任务, 而不同的userid则会被分配到不同的任务
-
All Grouping
广播发送,对于每一个tuple,Bolts中的所有任务都会收到.
-
Global Grouping
全局分组,这个tuple被分配到storm中的一个bolt的其中一个task.再具体一点就是分配给id值最低的那个task.
-
Non Grouping
随机分派,意思是说stream不关心到底谁会收到它的tuple.目前他和Shuffle grouping是一样的效果,
-
Direct Grouping
直接分组,这是一种比较特别的分组方法,用这种分组意味着消息的发送者具体由消息接收者的哪个task处理这个消息.只有被声明为Direct Stream的消息流可以声明这种分组方法.而且这种消息tuple必须使用emitDirect方法来发射.消息处理者可以通过TopologyContext来或者处理它的消息的taskid (OutputCollector.emit方法也会返回taskid)
-
localOrShuffleGrouping
是指如果目标Bolt 中的一个或者多个Task 和当前产生数据的Task 在同一个Worker 进程里面,那么就走内部的线程间通信,将Tuple 直接发给在当前Worker 进程的目的Task。否则,同shuffleGrouping。(在工作中使用的频率还是比较高的)
-
CustomStreamGrouping
自定义流式分组。
5.对于mapreduce如何理解?
- 编程简单:开发人员只需要关注应用逻辑,而且跟Hadoop类似,Storm提供的编程原语也很简单
- 高性能,低延迟:可以应用于广告搜索引擎这种要求对广告主的操作进行实时响应的场景。
- 分布式:可以轻松应对数据量大,单机搞不定的场景
- 可扩展: 随着业务发展,数据量和计算量越来越大,系统可水平扩展
- 容错:单个节点挂了不影响应用
- 消息不丢失:保证消息处理
不过Storm不是一个完整的解决方案。使用Storm时你需要关注以下几点:
- 如果使用的是自己的消息队列,需要加入消息队列做数据的来源和产出的代码
- 需要考虑如何做故障处理:如何记录消息队列处理的进度,应对Storm重启,挂掉的场景
- 需要考虑如何做消息的回退:如果某些消息处理一直失败怎么办?
7.Storm组件有哪些?
Nimbus(主节点):负责资源分配和任务调度。
Supervisor(从节点):负责接受nimbus分配的任务,启动和停止属于自己管理的worker进程。---通过配置文件设置当前supervisor上启动多少个worker。worker的数量根据端口号来的!
Worker(进程):运行具体处理组件逻辑的进程(其实就是一个JVM)。Worker运行的任务类型只有两种,一种是Spout任务,一种是Bolt任务。
Task(线程):worker中每一个spout/bolt的线程称为一个task. 在storm0.8之后,task不再与物理线程对应,不同spout/bolt的task可能会共享一个物理线程,该线程称为executor。task=线程=executor
Zookeeper(分布式协调服务) :保存任务分配的信息、心跳信息、元数据信息。
8.编程模型
Topology:Storm中运行的一个实时应用程序的名称。(拓扑)
Spout:在一个topology中获取源数据流的组件。 通常情况下spout会从外部数据源中读取数据,然后转换为topology内部的源数据。
Bolt:接受数据然后执行处理的组件,用户可以在其中执行自己想要的操作。
Tuple:一次消息传递的基本单元,理解为一组消息就是一个Tuple。
Stream:表示数据的流向。
以上是关于storm面试小题的主要内容,如果未能解决你的问题,请参考以下文章