storm--基础面试题2

  • 1.提高storm并发度?

并行度就是多线程,主要是调整三个实体
1.worker进程
2.exectors(线程)
3.Task(线程)
在worker下可以可以采用多线程的方式运行程序。task是运行在exector里面的
storm--基础面试题2
文章图片

worker运行在从节点里面,从节点可以启动多个worker。灰色的是exectors.一个work下多个exector。exector下可以运行一个task也可以运行两个task.task是最小的处理单元。spout和bolt都是运行在task之上。
一个worker进程执行的是一个topo的子集。
一个worker进程会启动1…n个executor线程来执行一个topo的component
一个运行topo就是由集群多台物理机上的多个worker进程组成。
executor是一个被worker进程启动的单独线程,每个executor只会运行一个topo的一个component.
task是spout或者bolt代码的最小执行单元。
ack会占用一个task。
supervisor节点上可以运行多个worker进程,一个进程可以启动多个线程的,所以我们可以在worker多个executor,在executor中运行task。默认情况下task的数目等于executor线程数目,即1个executor线程只运行1个task。
worker --默认是1个
storm--基础面试题2
文章图片

调整
worker>executor(执行线程)>task
增加worker进程,增加executor 增加task
setNumberworker setnumbertasks 来提高并行度。
  • 2.当Nimbus或Supervisor守护进程死亡时会发生什么?

Nimbus和Supervisor守护进程设计为快速失败(遇到任何意外情况时进程自毁)和无状态(所有状态保存在Zookeeper或磁盘上)
Nimbus或supervisor的死亡不会影响worker流程。这与Hadoop形成鲜明对比,如果JobTracker死亡,所有正在运行的作业都将丢失.
  • 3.Nimbus是单点故障吗?

如果丢失了Nimbus节点,worker仍将继续运行.如果worker死掉,nimbus将继续重新worker。但是,如果没有Nimbus,worker将不会在必要时重新分配给其他计算机(例如,如果您丢失了工作机器)
storm可以配置HA
  • 4.Storm如何保证数据处理?

Storm提供了保证数据处理的机制,即使节点死亡或消息丢失也是如此。
worker死了
nimbus可以启动worker.如果它在启动时连续失败并且无法接受Nimbus的心跳,Nimbus将重新安排worker。
节点死了
分配给该计算机的任务将超时,Nimbus会将这些任务重新分配给其他计算机。
  • 5.storm的可靠性如何实现,包括spout和bolt两部分?

storm的可靠性由Ispout接口定义三个可靠性api:nexttuple,ack,fail
spout端:
对于tuple树上的每个bolt进行确认应答,spout才会调用ack来表明这个消息被完全处理,如果任何一个bolt处理的tuple报错。调用ack.
ack机制与fail机制
在编写spout的nextTuple时,最终你必须要emit一个Tuple,记住,要这么做:
//发射出去的是数据信息和数据唯一编号。
this.collector.emit(new Values(…), msgID);
一定要有msgID这个参数,一定要有!否则Storm便不会跟踪这个Tuple。
collector.emit(tuple, new Values(…));
而不是:
collector.emit(new Values(…));
为了保证数据能正确的被处理, 对于spout产生的每一个tuple, storm都会进行跟踪, 这里面涉及到ack/fail的处理, 如果一个tuple处理成功, 会调用spout的ack方法, 如果失败, 会调用fail方法. 而在处理tuple的每一个bolt都会通过OutputCollector来告知storm, 当前bolt处理是否成功. 为了了解OutputCollector的ack/fail与Spout的ack/f ail之间的关系, 我调试跟踪了一下storm代码.
bolt的可靠性:bolt也是一样,通过ack和fail机制。
  • 6.storm的如何处理反压机制?

1.storm之前是对于开启ack,可以设置conf.setmaxspoutpending参数设置实现反压效果。当下游bolt跟不上上游的spout发送的tuple时,会停止发送。这个不是很好。
2.最新版本是自动反压机制,监控bolt中的接收队列,当超过高水位时专门的线程把反压信息写入到zookeeper中。zookeeper上watch会通知所有worker进程反压,降低spout发送速度。
  • 7.storm分组策略方式?

1.Shuffle Grouping:随机分组,轮询,平均分配。随机派发stream里面的tuple,保证每个bolt接收到的tuple数目大致相同
2.Fields Grouping:按字段分组,比如按userid来分组,具有同样userid的tuple会被分到相同的Bolts里的一个task,而不同的userid则会被分配到不同的bolts里的task。
3.All Grouping:广播发送,对于每一个tuple,所有的bolts都会收到–同一份数据可能被处理三次。
  • 8.storm怎么实现对单词的计数?可靠的单词计数?

【storm--基础面试题2】单词计数topology由一个spout和三个bolt组成。
spout 动态的接受数据源信息。
语句分割bolt:将每个句子分割成单词
单词技术bolt:把语句分割的bolt的输出作为输入,统计每个单词的数量。
上报bolt.当收到一个tuple时,上报bolt会更新表中的计数数据,并且将值在终端打印。

    推荐阅读