(1)Topologies 拓扑 解释: 拓扑相似一个集装箱,全部的货物都会存储在集装箱里面最后被托运走,storm里面全部的代码和文件最终会被打包在一个拓扑中,而后提交在storm集群中运行,相似于Hadoop中的一个MapReduce的做业,最大的区别在于MapReduce最终会主动中止,Storm的Topologies不会主动中止,除非你强制kill掉它 相关拓展: TopologyBuilder : Java里面构造Topology工具类 生产模式 Config conf = new Config(); conf.setNumWorkers(20); conf.setMaxSpoutPending(5000); StormSubmitter.submitTopology("mytopology", conf, topology); 本地模式 import org.apache.storm.LocalCluster; LocalCluster cluster = new LocalCluster(); (2)Streams 数据流 Stream是Storm里面的核心抽象模型,在分布式环境下一个数据流是由无限的tuple序列组成,这些经过数据源并行的源源不断的被建立出来,Stream的schema是由一个字段名标识,值类型能够是integer,long,shot,bytes,string,double,float,boolean,byte array固然咱们能够自定义序列化类型。 每一个流在声明时会被指定一惟一标识id,若是输出的流只有一个能够不用标识,默认指定的id是default OutputFieldsDeclarer类负责输出标识 单个流声明: declarer.declare(new Fields("single") 多个流声明: declarer.declareStream("a", new Fields("data", "time", "countyId") declarer.declareStream("b", new Fields("data", "time", "countyId") declarer.declareStream("c", new Fields("data", "time", "countyId") 相关拓展: Tuple:streams由一系列tuple组成 OutputFieldsDeclarer:用于声明流和他们的schema Serialization:动态tuple类型和声明自定义序列化 (3)Spouts (喷嘴比喻数据源) 一个spout是由流组成的数据源在storm的拓扑里,一般状况下会读取外部的数据源 而后emit(发射)到拓扑里面,好比是kafka,MySQL或者redis等等,Spout有两种实现一种是可靠的消息实现,若是发送失败则会重试,另一种是不可靠的消息实现可能会出现消息丢失,spout能够一次声明多个数据流经过OutputFieldsDeclarer类的declareStream方法,固然前提是你的SpoutOutputCollector里的emit也是多个流 Spout里面主要的方法是nextTuple,它里面能够发射新的tuple到拓扑,或者当没有消息的时候就return,须要注意,这个方法里面不能阻塞,由于storm调用spout方法是单线程的,其余的主要方法是ack和fail,若是使用了可靠的spout,可使用ack和fail来肯定消息发送状态 相关扩展: IRichSpout:spout类必须实现的接口 BaseRichBolt :可靠的spout有ack确保 BaseBasicBolt :不可靠的spout (4)Bolts 业务处理单元 全部的拓扑处理都会在bolt中进行,bolt里面能够作任何etl,好比过滤,函数,聚合,链接,写入数据库系统或缓存等,一个bolt能够作简单的事件流转换,若是是复杂的流转化,每每须要多个bolt参与,这就是流计算,每一个bolt都进行一个业务逻辑处理,bolt也能够emit多个流到下游,经过declareStream方法声明输出的schema。 Bolt里面主要的方法是execute方法,每次处理一个输入的tuple,bolt里面也能够发射新的tuple使用OutputCollector类,bolt里面每处理一个tuple必须调用ack方法以便于storm知道某个tuple什么时候处理完成。Strom里面的IBasicBolt接口能够自动 调用ack。 相关拓展: IRichBolt:bolts的通用接口 IBasicBolt:扩展的bolt接口,能够自动处理ack OutputCollector:bolt发射tuple到下游bolt里面 (5)Stream grouping 流分组 分组定义了那个bolt能够收到上游的数据流,流分组定义了stream应该怎样在全部的bolt task中进行分区 目前storm内置8中分组接口能够知足大多数应用开发,你也能够经过 CustomStreamGrouping来自定义分组接口 (5.1)Shuffle grouping 随机的分发数据流,保证每一个bolt能够获得相等数量的tuple (5.2)Fields grouping 在grouping中stream经过字段进行分区分发,好比按照userid分组,那么storm能保证在同一个task中收到的userid是同样的,可是在不一样的task中,他们的userid也是不同的 (5.3)Partial Key grouping 同Fields grouping相似,可是这个流分组能在数据有倾斜的状况下作负载均衡 (5.4)All grouping 全部的bolt task都会收到此分组下的消息 (5.5)Global grouping 全部的stream都会发射到多个bolt task中的其中一个 (5.6)None grouping 等同于Shuffle grouping (5.7)Direct grouping 由生产者控制把tuple直接发送到那个消费者的bolt中,须要在代码里面控制 (5.8)Local or shuffle grouping 若是目标bolt有一个或多个task,在一个worker工做进程中,tuple仅仅会分发 到在同一个进程的task中,分发方式相似shuffle grouping 扩展: TopologyBuilder:使用这个类定义拓扑 InputDeclarer: 声明那些声明的流能够被指定的bolt接受 (6)Reliability 可靠性 使用ack保证,消息能够超时和重试 (7)Tasks 任务 每一个spout和bolt会执行多个task横跨整个集群,每一个task会在一个线程中执行 stream grouping定义了每一个task送到到那个下游的task中,在使用TopologyBuilder时,可经过setSpout 和 setBolt方法进行设置 (8)Workers 工做者 Topologies执行会横跨在一个或多个worker上,每一个worker是一个独立的jvm,会执行全部task里面的其中一部分task,好比一个拓扑的并行度是300而且有50个worker,那么每一个worker上会执行6个task(6个线程在worker内部),storm会确保 全部的task尽可能均衡的分布在全部worker中。 相关扩展: 设置worker数 conf..setNumWorkers(workNums);