Storm note

  31 Mar 2018


storm

Storm特点:
1.编程简单:开发人员只需要关注应用逻辑,而且跟Hadoop类似,Storm提供的编程原语也很简单
2.高性能,低延迟:可以应用于广告搜索引擎这种要求对广告主的操作进行实时响应的场景。
3.分布式:可以轻松应对数据量大,单机搞不定的场景
4.可扩展: 随着业务发展,数据量和计算量越来越大,系统可水平扩展
5.容错:单个节点挂了不影响应用
6.消息不丢失:保证消息处理

#使用Storm时你需要关注以下几点:
1.如果使用的是自己的消息队列,需要加入消息队列做数据的来源和产出的代码
2.需要考虑如何做故障处理:如何记录消息队列处理的进度,应对Storm重启,挂掉的场景
3.需要考虑如何做消息的回退:如果某些消息处理一直失败怎么办?

概念
Nimbus:storm集群主节点,负责资源分配与任务调度,一个storm集群只有一个主节点;
Supervisor:storm集群工作节点,接收Nimbus分配的任务,管理所有的worker;

Topology:计算拓扑,定义一个storm任务的必要原件,包括spout、bolt以及spout和bolt之间的流向关系;
Spout:消息的源头,topology的生产者;
Bolt:消息处理单元;
Worker:是一个JVM进程,由Supervisor启动和关闭,并根据Topology的配置启动若干Worker,实际任务由Worker进行;

executor:是一个线程,由worker进程派生,负责根据配置派生task线程,默认一个executor创建一个task,其将实例化后的spout/bolt传给task;
task:是topology的实际任务执行者,每个task承载一个spout和bolt的实例,调用spout.nextTuple()和bolt.execute()执行相关内容;

tuple:元组;一次消息传递的基本单元;Bolt.execute(Tuple tuple);
streams:流,由无限tuple序列组成;

storm并行度
1.一个topology指定多个worker进程并行运行;
2.一个worker进程指定多个executor线程并行运行;
3.一个executor线程指定多个task并行运行;

ack/fail
1.BaseRichBolt
>   发布Tuple至流:collector.emit(Collection<Tuple> anchors, List<Object> tuple);
>   执行成功:collector.ack(Tuple input);
>   执行失败:collector.fail(Tuple input);

2.BaseBasicBolt
>  BasicOutputCollector在emit数据的时候和输入的Tuple自动关联;
>  在execute方法结束后,输入的Tuple自动ack;

流分组
1.Shuffle grouping:随机分组;随机分配元组到Bolt的某个task上,保证每个task均匀获取元组;
2.Fields grouping:按字段分组;按照数据field值分组,相同的field值分配到相同的task;
3.All Grouping:广播分组;每一个tuple将会复制到每一个bolt下的每一个task中处理;
4.Global Grouping:全局分组;每一个tupe将会复制到每一个bolt下的某一个task中处理;
5.Non Grouping:不分组;不太关心如何分组,类似Shuffle groupin;
6.Direct Grouping:直接分组;
7.Local or Shuffle Grouping:本地/随机分组;