Storm基础(一)概念
本人原创翻译,转载请注明出处
之前翻译过Storm的Tutorial:http://www.jianshu.com/p/ea078dbd9958 所以这次不会再一字一句等翻译。
这篇文章列出了Storm的主要概念和相关的资源链接(可以获取更多信息)。讨论的概念包括:
- Topologies
- Streams
- Spouts
- Bolts
- Stream groupings
- Reliability
- Tasks
- Workers
Topologies
应用程序的逻辑被打包进了一个Storm topology。spouts和bolts以stream groupings相连,构成的图就是topology。
Streams
stream是Storm的核心抽象。stream是tuple的无限序列,tuple以分布式的方式并行的被创建和处理。默认情况下,tuples可以包含integers, longs, shorts, bytes, strings, doubles, floats, booleans, and byte arrays。你可以定义serializers,这样自定义的类型也可以在tuples中直接使用。
Spouts
spout是streams的源。spouts可以是可靠的,也可以是不可靠的。如果tuple处理失败,可靠的spout会重传它,不可靠的spout会在emit tuple后立即“忘掉”它。
Bolts
bolts是topology里真正负责处理tuple的单元。
Stream groupings
定义topology的一部分就是要定义bolt该接收哪个stream作为输入,Stream groupings就是用来做这件事。有8种内建的Stream groupings,你也可以实现CustomStreamGrouping 接口来自定义一个Stream groupings。
- Shuffle grouping: tuples随机分配给bolts,每个bolt收到的tuple数量相同。
- Fields grouping: stream被grouping中指定的字段分割。举个例子,如果一个stream以"user-id" 字段分组,"user-id" 相同的tuple将总是分配到相同的任务,"user-id" 不同的tuple可能分配到不同的任务。
- Partial Key grouping: 和Fields grouping一样以字段来分组,但是在下游的bolts之间做了负载均衡,当输入数据不均衡的时候可以更好的利用系统资源。这篇论文说明了它是如何工作的以及它的优点。
- All grouping: 流将被复制到所有bolts,使用这种分组的时候要特别小心。
- Global grouping: 整个流都将被分配到唯一一个bolt任务,通常是id最小的那个。
- None grouping:这种分组方式意味着你不关心如何分组。目前,这种方式等价于shuffle groupings。
- Direct grouping: 这是一种特殊的分组,由tuple的生产者来决定谁来消费这个tuple。Direct groupings只能搭配direct streams使用,也就是说tuple必须通过emitDirect方法发出。bolt可以通过TopologyContext 或 跟踪emit的返回值(返回值就是接收tuple的任务ids)来得到消费者的任务ids。
- Local or shuffle grouping: 如果目的bolt在相同的worker进程中有一个或多个任务,tuples就会被随机发送给这些同进程的任务。否则就按普通shuffle grouping处理。
Reliability
这部分专门翻译了一篇文章:http://www.jianshu.com/p/a51167bab444
Tasks
每个spout和bolt都以集群中任务的形式执行。每个任务对应一个线程,setSpout和setBolt用来设置任务的并发度。
Workers
topology在一个或多个worker进程中执行。每个worker进程是一个物理JVM,负责执行topology中所有任务的一个子集。举个例子,如果topology总的并发是300,worker数时50,那么每个worker执行6个任务。