Strom学习随笔

来源:互联网 发布:淘宝发货地址自动填写 编辑:程序博客网 时间:2024/06/06 12:33

最近产品需要做实时报表统计,需要用到Strom这个数据处理框架,在这里随笔记录下。

1、什么是Storm

Storm是一种分布式处理内存流数据的一套框架,主要是处理数据实时性的场景。简单的说就是把数据处理的场景拆分成多个不同的逻辑片段放到一个计算机集群中去执行(当然单机模式也可以玩)不过处理这些程序的时候我们不须要考虑多线程的问题Storm帮我们很好的处理了多线程的问题。

2、核心概念

Topologies(拓扑): topologies是一个流处理逻辑的一个整体称呼 是由 消息源(spouts)和消息处理逻辑(bolts)通过内存流(stream groupings)将数据源和消息处理逻辑连接起来。

Streams(消息流):一个消息流是一个tuple的序列对象,tuple序列会以一种分布式的方式并行创建和处理。

Spouts(消息源):为topology提供消息,一般来说是从一个外部的数据源里读取数据,如:消息队列中读取。

Bolts(处理消息的逻辑封装):对于传递来的消息做聚合,过滤,保存数据库等等操作。

Stream groupings:定义Bolts上面多个tasks的分配逻辑。

Storm里面有7种类型的stream grouping
1)Shuffle Grouping: 随机分组,随机派发stream里面的tuple,保证每个bolt接收到的tuple数目大致相同。
2)Fields Grouping:按字段分组,比如按userid来分组,具有同样userid的tuple会被分到相同的Bolts里的一个task而不同的userid则会被分配到不同的bolts里的task。
3)All Grouping:广播发送对于每一个tuple,所有的bolts都会收到。
 
4)Global Grouping:全局分组,这个tuple被分配到storm中的一个bolt的其中一个task。再具体一点就是分配给id值最低的那个task。
5)Non Grouping:不分组这个分组的意思是说stream不关心到底谁会收到它的tuple。目前这种分组和Shuffle grouping是一样的效果, 有一点不同的是storm会把这个bolt放到这个bolt的订阅者同一个线程里面去执行。
6)Direct Grouping: 直接分组,这是一种比较特别的分组方法,用这种分组意味着消息的发送者指定由消息接收者的哪个task处理这个消息。 只有被声明为Direct Stream的消息流可以声明这种分组方法。而且这种消息tuple必须使用emitDirect方法来发射。消息处理者可以通过TopologyContext来获取处理它的消息的task的id (OutputCollector.emit方法也会返回task的id)。
7)Local or shuffle grouping:如果目标bolt有一个或者多个task在同一个工作进程中,tuple将会被随机发生给这些tasks。否则,和普通的Shuffle Grouping行为一致。

Tasks:每一个spout和bolt会被当做很多的task在整个集群里执行,每一个executor对应到一个线程,在这个线程上运行多个task,而stream grouping则是定义怎么从一堆task发射tuple到另外一堆task。你可以调用TopologyBuilder类的setSpout和setBolt来设置并行度(也就是多少个task)

Workers(工作进程):一个topology可能会在一个或多个worker里执行,worker个数可以在创建topology时设置。

0 0