Storm组件介绍

(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是defaultOutputFieldsDeclarer类负责输出标识 单个流声明: 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);

本文分享自微信公众号 - 我是攻城师(woshigcs),作者:woshigcs

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2016-08-12

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • Storm的wordcount实战示例

    我是攻城师
  • Spark如何在一个SparkContext中提交多个任务

    我是攻城师
  • ES-Hadoop插件介绍

    我是攻城师
  • 使用交互式地图和动画可视化伦敦的自行车流动性(上)

    近年来,自行车共享系统已经成为流行的出行方式,为大都市地区的市民提供了一种绿色、灵活的交通方式。世界上许多国家的政府都认为这是一种创新战略,可能会带来许多社会效...

    AiTechYun
  • Python进行远程视频监控

    專 欄 ❈小丸子,网络工程专业在读。希望通过将自己学到的知识分享出来可以发现自己某个知识的薄弱点,更加有利于学习,喜欢将自己所学到的知识运用在生活中。乐于分享...

    Python中文社区
  • iOS学习——布局利器Masonry框架源码深度剖析

      iOS开发过程中很大一部分内容就是界面布局和跳转,iOS的布局方式也经历了 显式坐标定位方式 --> autoresizingMask --> iOS 6....

    mukekeheart
  • BizTalk 新增/修改/删除 XmlDocument 名字空间的高效方法

    新增一个名字空间 public class AddXmlNamespaceStream : XmlTranslatorStream { private ...

    阿新
  • TCP/IP 选项TcpTimedWaitDelay设置

    当TCP连接被关闭时,{ Protocol, Local IP, Local Port, Remote IP, Remote Port}五元组就进入TIME_W...

    张善友
  • 括号配对问题描述输入输出样例输入样例输出解析代码实现运行结果参考链接

    括号配对问题-题目链接 描述 现在,有一行括号序列,请你检查这行括号是否配对。 输入 第一行输入一个数N(0<N<=100),表示有N组测试数据。后面的N行输入...

    致Great
  • 2.25 VR扫描:Oasis完成千万元人民币A轮融资;美军IVAS AR头显更多细节曝光

    近日,VR社交平台Oasis宣布完成千万元人民币的A轮融资,本轮融资由晨兴资本和BAI(贝塔斯曼亚洲投资基金)共同投资,回音资本担任独家财务顾问。据悉,Oasi...

    VRPinea

扫码关注云+社区

领取腾讯云代金券