Storm 学习笔记 (二)菜鸟乐园
Storm计算模型
Topology DAG有向无环图的实现
----对于storm实时计算逻辑的一种封装
由一系列通过 数据流 相互关联的spout,Bolt组成的拓扑结构
生命周期:此拓扑只要启动,一直会在集群中运行直到手动kill(区别于MapReduce当中的job,job在计算完成后就会终止)
Tuple 元组
Storm中最小数据组成单元
Stream--数据流
从spout中不断传递数据给Bolt,以及一个Bolt传递给下一个Bolt,所形成的这些数据通道叫作stream
stream 声明时候需要给一个id,默认为default
实际使用时候大多使用单一数据流,此时不需要单独指定Stream1 id
Spout---数据源
图中数据源的来源,一般指定外部的数据源 读取 元组 Tuple 发送到 Topology中
一个Spout可以发送多个数据源
含有3个重要方法
1 OutputFieldsDeclarer中的declare方法声明定义所发送数据流的类型,便于bolt接收
2 SpoutOutputCollector中的emit方法指定stream id 后 发送到bolt
3 Spout最核心的方法 nextTuple,这个方法会被storm线程不断调用,主动从数据源拉取数据在通过emit方法生成Tuple发送给下一个Bolt计算
Bolt---数据流处理组件
所有的数据处理都由Bolt完成 ,一个到多个。一个Bolt也可以发送多个数据流stream。
Bolt里最核心的方法是 execute 方法,这个方法负责接收到一个Tulp数据然后实现核心的业务逻辑
Stream Grouping ---数据流分组 (即数据分发策略)
一共8种,但是我一般就用过1和2,其他不太常用
1 Shuffle Grouping
轮询,平均分配
随机派发Stream里的tuple,保证每个bolt task 接收到的tuple数量大致相同
2 Fields Grouping 个人感觉非常有用,常用于ETL Extract-Transform-Load
按字段分组,比如。按照“user_id”字段分组,具有相同的user_id的Tuple会被分到同一个Bolt中处理
3 All Grouping
广播发送,对于每一个tuple,所有的Bolts都会收到
4 Global Grouping
全局分组,把tuple分散给task id最低的task,其实可以实现间接的HA
5 None Grouping
不分组,目前看这个效果和shuffle grouping差不多,不同的一点是storm会把使用none grouping
的这个Bolt放到这个Bolt的订阅者同一个线程里去执行
6 Direct Grouping
指向性分组,使用这种分组意味着tuple的发送者指定消息的接受者,指定哪个task处理tuple。
只有被声明为Direct Stream的消息流可以声明这种分组方法。
7 Local or shuffle grouping
本地或者随机分组。如果目标bolt有一个或者多个task与源bolt的task在同一个工作进程中,tuple
将会被随机发送给这些同进程中的tasks。否则和普通的Shuffle Grouping一样
8 CustomGrouping
自定义,相当于MapReduce那里自己去实现一个partition。
未完待续!!!!!!!