最具影响力的数字化技术在线社区

168大数据

 找回密码
 立即注册

QQ登录

只需一步,快速开始

1 2 3 4 5
打印 上一主题 下一主题
开启左侧

[综合] Storm流计算开发

[复制链接]
跳转到指定楼层
楼主
发表于 2018-12-27 17:17:18 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式

马上注册,结交更多数据大咖,获取更多知识干货,轻松玩转大数据

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
    Storm是一个分布式、高容错、高可靠性的实时计算系统,它对于实时计算的意义相当于hadoop对于批处理的意义。Hadoop提供了Map和Reduce原语。同样,Storm也对数据的实时处理提供了简单的
  spout和bolt原语。Storm集群表面上看和Hadoop集群非常像,但Hadoop上面运行的是MapReduce的Job,而Storm上面运行的是topology(拓扑),它们非常不一样,比如一个MapReduce的Job最终会结束,
  而一个Storm topology永远运行(除非显式杀掉它)
1、Storm集群的整体架构
2、Storm关键概念
    topology
 一个事实应用程序在Storm中称为一个拓扑(topology), Storm中的拓扑类似于Hadoop的MapReduce任务,不同之处是,一个MapReduce任务总会运行完成,而拓扑如果不显式结束则一直运行。
    一个Storm拓扑一般由一个或者多个spout(负责发送消息)以及一个或者多个bol(负责处理消息)做组成。
    tuple
      Storm处理的基本消息单元为tuple(元组),Tuple是一个明明值列表,元组中的字段可以是任何类型的对象。Storm用元组作为其数据模型,元组支持所有基本类型、字符串和字节数组作为字段值,
    只要实现类型的序列化接口,就可以使用该类型的对象。元组是一个值的列表。
    
流(Stream)在Storm中是一个核心抽象概念。一个流是由无数个元组序列构成,这些元组并行、分布式的被创建和执行。在stream的许多元组中,Streams被定义为以Fields区域命名的一种模式。
    默认情况下,元组支持:Integers,longs,shorts,bytes,strings,doubles,floats,booleans,and byte arrays.
      每一个Stream在声明的时候都会赋予一个id,单个Stream--spouts和bolts,可以使用OutputFieldsDeclarer的convenience方法声明一个stream.而不用指定一个id,但是这种方法会给一个模式的id:  default。
    spout
      spout(喷口)是topology的流的来源,是一个topology中产生源数据流的组件。通常情况下,spout会从外表数据源(例如kafak队列或Tiwitter API)中读取数据,然后转为为topology 内部的源数据。
    spout可以是可靠是,也可以是不可靠的。如果Storm处理元组失败,可靠的spout能够重新发射,不可靠的spout无法重新发射已经发出的元组。spout是一个主动的角色,其接口中有一个nextTuple()函数,
    Storm框架会不停的调用此函数,用户只要在其中生成源数据即可。
      spout可以发出超过一个的流。为此,使用OutputFieldsDeclarer类的declareStream方法来声明多个流,使用SpoutOutputCollector类的emit执行方法来进行流的提交。
      spout的主要方法是nextTuple(),nextTuple()会发出一个新的tuple到拓扑,如果没有新的元组发出,则简单地返回。nextTuple()方法不阻止任何的spout的实现,因为stream在同一个线程调用所有
    spout方法。
      spout的其它主要方法是ack()和fail(). 当Storm监测到一个tuple从spout发出时,ack()和fail()会被调用,要么成功完成通过拓扑,要么未能完成。ack()和fail()仅被可靠的spout调用。IRichSpout是 spout
    必须实现的接口。
    bolt
拓扑中所有处理逻辑都在bolt(螺栓)中完成,bolt是流的处理节点,从一个拓扑接收数据后执行进行出来的 组件。bolt可以完成过滤(filter)、业务处理。连接运算(join)、连接与访问数据库的等任何操作。
    bolt是一个被动的角色,其接口中只有一个execute()方法,此方法在接收到消息后会被调用,用户可以在其中执行自己希望的操作。
      bolt可以完成简单的流的转换,而完成复杂的流的转换通常需要多个步骤,因此需要多个bolt。此外,bolt也可以发出超过一个的流。
      bolt的主要方法是execute()方法,该方法将一个元组作为输入。bolt使用 OutputCollector对象发射新tuple。bolt必须为他们处理的每个元组调用OutputCollector类的ack()方法,以便Storm只是什么
    时候元组会完成。
    流分组
定义一个topology的步骤之一是定义每个bolt接收什么样的流作为输入。流分组(stream grouping)用来定义一个Strream应该如何分配数据给bolts上的多个任务。
      在Storm中,有8种内置流分组方式,通过实现CustomStreamGrouping接口,用户可以实现自己的流分组方式。
      shuffle grouping(随机分组):这种方式会随机分发tuple给bolt的各个任务,每个bolt实例接收相同数量的tuple。
      fields grouping(字段分组):根据指定字段的值进行分组,例如,一个数据流根据“word”字段进行分组,所有具有相同"word"字段值的(tuple)会路由到同一个(bolt)的task中。
      all grouping(全复制分组):将所有的tuple复制后分发给所有bolt task, 每个订阅数据流的task都会接收到所有的tuple的一份备份。
      globle grouping(全局分组):这种分组方式将所有的tuples路由到唯一的任务上,Storm按照最小的taskID来接收数据的task,注意,当使用全局分组方式时,设置bolt的task并发度是没有意义的(spout并发有意义),
      因为所有的tuple都转发到一个task上了,此外,因为所有的tuple都转发到一个JVM实例上,可能会引起Storm集群中某个JVM或服务器出现性能瓶颈或崩溃。
      none grouping(不分组):在功能上和随机分组相同,是为将来预留的。
      direct grouping(指向性分组):数据源会调用emitDirect()方法来判断一个tuple应该由哪个Storm组件来接收。
      local or shuffle grouping(本地或随机分组):和随机分组类似,但是会将tuple分发给同一个worker内的bolt task(如果workder内有接收数据的bolt task),其它情况下,则采用随机分组的方式。本地或随机分组取决于
      topology的并发度,可以减少网络传输,从而提高topology性能。
      partial key grouping:与按字段分组类似,根据指定字段的一部分进行分组分发,能够很好的实现负载均衡,将元组发送给下游的bolt对应的任务,特别是存在数据倾斜的情况下,使用partial key grouping能够很好的
      提高资源利用率。
  3、Storm并发
      Storm集群中真正运行topology的主要有三个实体:worker(工作进程),executor(线程)和task(任务)。
    参考资料:《离线和实时大数据开发实战》


楼主热帖
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 转播转播 分享分享 分享淘帖 赞 踩

168大数据 - 论坛版权1.本主题所有言论和图片纯属网友个人见解,与本站立场无关
2.本站所有主题由网友自行投稿发布。若为首发或独家,该帖子作者与168大数据享有帖子相关版权。
3.其他单位或个人使用、转载或引用本文时必须同时征得该帖子作者和168大数据的同意,并添加本文出处。
4.本站所收集的部分公开资料来源于网络,转载目的在于传递价值及用于交流学习,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。
5.任何通过此网页连接而得到的资讯、产品及服务,本站概不负责,亦不负任何法律责任。
6.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源,若标注有误或遗漏而侵犯到任何版权问题,请尽快告知,本站将及时删除。
7.168大数据管理员和版主有权不事先通知发贴者而删除本文。

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关闭

站长推荐上一条 /1 下一条

关于我们|小黑屋|Archiver|168大数据 ( 京ICP备14035423号|申请友情链接

GMT+8, 2024-5-19 09:46

Powered by BI168大数据社区

© 2012-2014 168大数据

快速回复 返回顶部 返回列表