【一】storm理论+数据分组策略

目录:

一、storm的技术网站

二、简介

三、storm和hadoop的比较

四、storm和spark streaming的比较

五、storm核心概念

六、storm架构

七、容错性

八、ack和fail机制

正文:

一、storm的技术网站:

官网:http://storm.apache.org/

官网可以订阅邮件

Github:  github.com/apache/storm

wiki:  https://en.wikipedia.org/wiki/Storm_(event_processor)

二、简介

诞生于backtype,被twitter收购,后在apache开源。

storm是一个免费、开源、分布式的实时计算系统。它可靠的处理无界数据流。

常用于:实时分析、在线机器学习、持续计算、分布式RPC、ETL等等。

特点:快、可扩展、容错性保证数据都能够被处理

它能集成常用消息队列和数据库,实现高频、大规模数据的实时处理。

三、storm和hadoop的比较

处理领域:hadoop是做离线批处理的,数据存放在HDFS之上。storm是做实时处理的,延时性很低。

处理过程:hadoop通常一个作业是拆分成map和reduce来处理的。storm是由spout(数据源)、bolt(业务逻辑)组成最终通过一个拓扑图拼起来。

进程是否结束:hadoop和spark的离线作业处理,都是在启动的时候去申请资源,作业跑完后资源会释放。进程要结束。storm没有结束状态,进程和作业一直不会停。

四、storm和spark streaming的比较

spark streaming是小批处理,近似于实时。storm是实时的。

五、storm核心概念

http://storm.apache.org/releases/1.1.2/Concepts.html

    1.Topology 计算拓扑,将整个流程串起来,调度。实时应用程序的逻辑会被打包成一个Topology。一个storm的Topology和mapreduce的job有些类似,不同之处在于mapreduce的作业最终是要完成的(进程结束),但是storm的Topology会一直运行(进程不结束)。它是一个有向无环图,由被streams groups连接着的spouts和bolts组成。

    2.Streams    数据流,抽象概念,由多个无边界、有序的tuple构成。它将被以并行、分布式的方式处理。 Streams are defined with a schema that names the fields in the stream's tuples. By default, tuples can contain integers, longs, shorts, bytes, strings, doubles, floats, booleans, and byte arrays.可以自定义。每个stream会有个ID。

    3.Spouts     产生数据(水龙头),在一个Topology中,一个spouts是一个stream的源头。通常情况下spout会从外部数据源读取tuple(数据),然后发射到Topology里去。可以选择可靠或者不可靠。可靠的,能保证数据被处理掉,而且一个数据只处理一次。当处理数据失败的时候,可靠的,可以再回放(重发)一次数据处理。不可靠的,不保证发出去的数据一定会被处理。

      Spouts中有三个重要的方法nextTuple、ack、fail。ack、fail保证了数据是否正常被处理,这两个方法不是手工调用的,只有在可靠的中,这两个方法会被storm自动调用。

    4.Bolts      处理数据(业务逻辑),可以做过滤、聚会、读写数据库操作。Bolts有一个重要的方法execute。当bolt发送数据给下一个bolt的时候,要调用ack方法让storm知道下游是否正确处理了数据。Bolts中可以启动多线程异步处理数据。

    5.Tuple      数据(水),传递的基本单元

   6.Stream groupings    数据分组策略,它为每一个Bolt定义stream怎么被接收,怎么分组。自带8种。也可以通过实现CustomStreamingGrouping接口来自定分组策略。官网自定义分组策略介绍

        Shuffle grouping:随机处理。保证每个task处理的数据量是相同的。数据会被随机分发到下游Bolt的task中。

        Fields grouping:按字段分组,相同字段放到一个task上处理。可能数据倾斜。数据流会根据指定的字段来分区,比如按照userId字段分区,相同的userId会分到相同的task中去处理。

        Partial Key grouping:数据流会按照指定的字段分组,和Fields grouping类似,但是它能在下游bolt中负载均衡,当输入数据有数据倾斜的时候能让资源有更好的利用。

        All grouping: 每个数据都会发到Bolt所有的task中去。Bolt的每个task收到的是相同的完整的数据。例如数字累加的例子。设置bolt有3个task。spout发1,每个task都能收到1,每个task累加后的值都是1。spout再发2,每个task都能收到2,每个task累加后的值都是3。

        Global grouping:所有数据会发到同一个task中处理,默认情况下是task ID最小的那一个。

        None grouping:并不关心怎么分组,目前跟Shuffle grouping一样

        Direct grouping: 由数据发送者直接指定哪一个task接收数据。只能在声明了direct的流中使用。要用emitDirect发送。

        Local or shuffle grouping:当下游Bolt中有task跟上游的task运行在同样的worker中时,那么上游的发出的数据由下游同进程的task处理。否则shuffle grouping跟一样。

    7.Reliability    可靠性。storm能够保证每个发射出来的tuple都被完成处理。主要靠emit和ack。

    8.Tasks    每一个spout和bolt都是以多任务(task)的方式在集群执行。每一个task对应一个线程的执行(可以调整,调优要用)。

    9.Workers    Topology执行在一个或者多个工作进程(worker processes)上。每一个工作进程是一个物理的JVM,worker processes会执行Topology里面所有tasks的子集。(假设有10个tasks,起了2个worker进程,相当于每个worker进程处理5个tasks)官方例子,假设有300的并行度,有50个worker,每个worker运行6个tasks。storm会尝试把tasks均有的分发到所有的worker上。

六、storm架构

nimbus 主节点,supervisor 从节点,无状态,他们上面的元数据会存放在zookeeper。可以启动多个worker。可以通过配置来指定一个topology运行在几个worker上。spout、bolt是跑在task上的。

nimbus :集群主节点,负责任务task的指派、分发、资源分配。

supervisor:集群的从节点,负责执行任务的具体部分。启动和停止它自己管理的worker。

worker:运行具体组件(spout、bolt)逻辑的进程。

task:是worker中每一个spout和bolt的线程称为一个task。

executor:spout和bolt可能会共享一个线程。

七、容错性

如果worker挂掉了:supervisor会重启worker。如果worker一直重启失败,并且nimbus检测不到它的心跳,nimbus会计划在其他机器上启动worker。

如果节点挂掉了:该节点上跑的任务会超时,nimbus会在其他机器上面重新启动这些任务。

如果nimbus或者supervisor的进程挂了:这两个进程在设计的时候就支持“快速失败”fail-fast,任何不被期望的状态发生时进程可以自毁。它们本身是没有状态的,所有的状态在zookeeper或者磁盘上。它们挂掉后,会像什么事也没发生那样重启。nimbus和supervisor挂掉了并不影响正在运行的worker。这里和hadoop1.X有点不一样,hadoop1.X中,如果jobtracker挂掉了,正在运行的作业会丢失。

nimbus单点故障时:如果nimbus挂了,worker还是会继续支持。这时就算worker又出故障了,supervisor也会重启worker。然而,没有了nimbus,worker不能被分配到其他机器上了。在1.0.0以后,nimbus是可以做HA的(高可用)。官网HA机制详解

八、ack和fail机制

代码演示