1.什么是storm
Storm是推特开源分布式实时大数据处理框架,在业界被称为实时版Hadoop。 随着Hadoop MapReduce高延迟的不可接受性增加,大数据实时处理解决方案(例如,网站统计、推荐系统、预警系统和金融系统(高频交易、股票) )的应用也越来越广泛
storm作者表示,storm对实时计算的意义类似于Hadoop对批处理的意义。 Hadoop提供了map、reduce原语,使批处理过程简单高效。 同样,Storm为实时计算提供了简单高效的基元。 Storm trident与基于Hadoop的Pig框架一样,是一个基于storm基元的更高级抽象框架,使开发更加方便高效。
2.storm应用场景
推荐系统(根据实时推荐、订单或购物车的加入推荐相关商品)、金融系统、报警系统、网站统计)实时销量、流量统计(如淘宝双11效果图)、交通路况实时系统
3.storm的一些特性
1. 适用场景广泛: storm实时处理消息,更新数据库,对单个数据量进行连续查询,然后返回(连续计算)到客户端,对占用资源的查询进行实时查询
2. 可伸缩性高: Storm的可伸缩性使storm每秒可以处理的消息量非常高。 要扩展实时计算任务,必须添加计算机并提高该计算任务的并行度。 Storm使用ZooKeeper调整群集中的各种配置,以便于扩展Storm群集。
3. 保证无数据丢失:实时系统必须保证所有数据都能正常处理。 丢失数据的系统的应用场景非常狭窄,storm确保所有消息都得到处理。 这与S4相比有很大的对比度。
4. 异常健壮: storm群集非常易于管理,按顺序重新启动节点不会影响APP应用程序。
5. 容错性好:如果在处理消息时出现异常,storm将重试
6.http://www.Sina.com/:任何人都可以使用storm,因为storm的topology和消息处理组件(Bolt )可以用任何语言定义。
语言无关性
Nimbus和Supervisors之间的所有协调工作都是通过一个Zookeeper集群。 Nimbus和Supervisors进程不能直接连接,所有无状态状态都将保持在Zookeeper或存储在本地磁盘上。
这意味着可以在不进行备份的情况下运行kill -9 Nimbus或Supervisors进程。
由于这种设计,storm群集具有难以置信的稳定性,并且不结合。
4.storm集群结构
Nimbus负责在群集上分发的代码,topo只能在Nimbus计算机上提交,不能将任务分配给其他计算机或监视故障。
Supervisor监听分配给它的节点,并根据Nimbus委托根据需要启动和终止工作流程。 每个工作进程运行拓扑的子集。 正在运行的topology由许多计算机上运行的许多工作进程组成。
Storm具有对流的抽象,流是不间断的、无边界的连续tuple。 当对事件流进行建模时,注意Storm将流中的事件抽象为tuple,即元组
Storm认为每个流都有一个称为“喷嘴”的原始元组的源
当处理流中的tuple并将其抽象为Bolt时,Bolt可以消耗任意数量的输入流,只要将流的方向引导到该Bolt,就可以同时将新的流发送到其他Bolt进行使用。 这样,只需要将打开特定的spout后从spout流出的tuple导入特定的Bolt,Bolt就可以在处理导入的流之后导入到其他的Bolt
spout可以被认为是水龙头。 而且,水龙头流出的水各不相同。 我们想得到哪个水就拧哪个水龙头,用管子把水龙头里的水引到一个水处理装置(bolt ),水处理装置处理后,用管子引到另一个处理装置,或者放入容器里。
为了提高水处理效率,自然可以通过在同一水源连接多个水龙头,使用多个水处理器来提高效率。
这是有向无环图,Storm将此图抽象为拓扑,Topo是Storm的作业抽象概念,拓
扑就是一个流转换图图中每个节点是一个spout或者bolt,每个spout或者bolt发送元组到下一级组件。
而Spout到单个Bolt有6种流分组策略。
6.Topology
Storm将流中元素抽象为tuple,一个tuple就是一个值列表value list,list中的每个value可以是任意可序列化的类型。拓扑的每个节点都要说明它所发射出的元组的字段的name,其他节点只需要订阅该name就可以接收处理。
7.storm相关概念
Streams:消息流
消息流是一个没有边界的tuple序列,而这些tuples会被以一种分布式的方式并行创建和处理。 每个tuple可以包含多列,字段类型可以是: integer, long, short, byte, string, double, float, boolean和byte array。 你还可以自定义类型 — 只要你实现对应的序列化器。
Spouts:消息源
Spouts是topology消息生产者。Spout从一个外部源(消息队列)读取数据向topology发出tuple。 消息源Spouts可以是可靠的也可以是不可靠的。一个可靠的消息源可以重新发射一个处理失败的tuple, 一个不可靠的消息源Spouts不会。
Spout类的方法nextTuple不断发射tuple到topology,storm在检测到一个tuple被整个topology成功处理的时候调用ack, 否则调用fail。
storm只对可靠的spout调用ack和fail。
Bolts:消息处理者
消息处理逻辑被封装在bolts里面,Bolts可以做很多事情: 过滤, 聚合, 查询数据库等。
Bolts可以简单的做消息流的传递。复杂的消息流处理往往需要很多步骤, 从而也就需要经过很多Bolts。第一级Bolt的输出可以作为下一级Bolt的输入。而Spout不能有一级。
Bolts的主要方法是execute(死循环)连续处理传入的tuple,成功处理完每一个tuple调用OutputCollector的ack方法,以通知storm这个tuple被处理完成了。当处理失败时,可以调fail方法通知Spout端可以重新发送该tuple。
流程是: Bolts处理一个输入tuple, 然后调用ack通知storm自己已经处理过这个tuple了。storm提供了一个IBasicBolt会自动调用ack。
Bolts使用OutputCollector来发射tuple到下一级Blot。
一组形象的对比: