Storm 基础知识
分布式的实时计算框架,storm对于实时计算的意义类似于hadoop对于批处理的意义。
Storm的适用场景:
1.流数据处理:storm可以用来处理流式数据,处理之后将结果写到某个存入中去。
2.持续计算:连续发送数据到客户端,使它们能够实时更新并显示结果,如网站指标
3.分布式RPC:由于storm的处理组件是分布式的,而且处理延迟极低,所以可以作为一个通用的分布式rpc框架来使用。
我们的搜索引擎本身也是一个分布式rpc系统。
storm关注的是数据的一次写入多次处理,storm的job运行起来是持续不断的。
Hadoop关注的是数据的一次写入,多次查询,使用。job执行完就结束了。
hadoop | storm | |
组件角色 | jobtracker tasktracker child | Nimbus Supervisor Worker |
应用名称 | Job | Topology |
组件接口 | Map/Reduce | Spout/Bolt |
Storm的特点:
- 编程模型简单
- 可扩展
- 高可靠性
- 高容错性
- 支持多种语言编程
支持本地模式运行和远程模式。
Storm集群架构:
Topology(拓扑)
storm中运行的一个实时应用程序,因为各个组件间的消息流动形成逻辑上的一个拓扑结构,一个Topology是由Spouts和bolts组成的图。
Topology的定义是一个Thrift结构,幵且Nimbus就是一个Thrift服务, 你可以提交由
任何询言创建的topology。
Tuple
可以认为是一个Map,但要求此数据类型是可以序列化的,这点和Hadoop的一样,其实分布式开发都需要注意这点。
Field1:String | Filed2:int | field3:string | Filed:customerobj |
一个没有边界的,源源不断的连续的Tuple序列就组成了Stream.
Spout
这是storm中消息的生产者,它会有一个NextTuple方法,一直产生Tuple形成流,它可以读成取文件生成Tuple,也可以从Kafka里面读取消息生成Tuple.
通常会从外部数据源(消息队列,数据库)读取数据,封闭成Tuple,发送到Stream中。
Bolt
Topology中所有的处理都是由它完成,即所有的消息处理逻辑都封装在里面。可以完成:过滤,聚合,访问文件数据库等。
它有一个Execute(Tuple Input)方法,处理spout或其他bolt传过来的数据,处理完并输出到下游。
Stream Grouping
定义了tuple如何被传送。从spout到bolt或bolt2bolt之间的传送方式。
1.随机分组(shuffle grouping)随机分发tuple到bolt,保证每个任务获得相等数量的tuple.
2.字段分组(Fields grouping)根据指定的字段分割数据流,并分组。例如,wordcount任务中,根据word进行分组计算。
3.全部分组(All grouping):tuple被复制到bolt的所有任务。这种类型要慎用。
4.全局分组(Global grouping):全部流都分配到bolt的同一个任务。分配给ID最小的那个Task.
5.无分组(None Grouping)暂时等于随机分组
6.直接分组(Direct grouping)由tuple生产者决定去哪里。
7.本地或随机分组(Local or Shuffle grouping)如果目标bolt有一个某多个任务在同一个worker进程中,tuples会随机分发给这些任务,否则就随机分组。
自定义分组,实现CustomStreamGrouping接口来定制自己需要的分组。
运行中的topology主要三个组件组成:
worker process(进程)Executors (线程)和tasks
Worker:
运行具体处理组件的进程。一个拓扑可能会在一个或多个worker里面执行,每一个worker是一个物理JVM并且执行整个拓扑的一部分,Storm会尽量均匀地将工作分配给所有的worker.
Executor:每一个executor对应一个线程,一个executor是一个worker进程生成的一个线程。它可能运行着一个相同的组件的一个或多个Task.
Task:每一个spout或bolt会被当作很多task在整个集群中运行。