关于Storm的一些总结

来源:互联网 发布:汉字拼音发音软件 编辑:程序博客网 时间:2024/06/05 06:34

1.Storm概述

 Storm是一个开源的分布式实时计算系统,可以简单、可靠的处理大量的数据流。Storm有很多使用场景:如实时分析,在线机器学习,持续计算,分布式RPC,ETL等等。Storm支持水平扩展,具有高容错性,保证每个消息都会得到处理,而且处理速度很快(在一个小集群中,每个结点每秒可以处理数以百万计的消息)。Storm的部署和运维都很便捷,而且更为重要的是可以使用任意编程语言来开发应用。不同于hadoop的是,storm是一个实时计算系统,而hadoop只适合处理离线的数据,storm 低延迟,hadoop高延迟,hadoop的优点主要在于其数据吞吐量大。

2.Storm逻辑结构

Storm Logic Struct
Storm 主要由topology(拓扑),stream(数据流),spout(喷嘴,数据的产生者),blot(阀门,数据的运算者)组成,不同于hadoop中的job,job在运行完成后就会终止程序,但是Storm中的topology会像服务一样运行下去,提供实时计算的服务。

 1. stream,它的核心数据结构是tuple,tuple是storm 各个组件间相互传输数据的基本单位,由spout接受数据源的数据并组装成tuple(包含一个或者多个键值对的列表)

 2. spout,它是数据的产生者,主要功能是从数据源获取信息并处理封装为tuple对象交由blot处理。(从数据源消费数据)

 3.blot,数据的处理者,blot作为strom的数据处理者,主要处理由spout传递来的数据或者由上级blot传递过来的数据(运算过程可以包含多个运算环节,也就是说可以由多级blot来流水处理从spout传递来的数据),最终会选择性地输出一个或多个输出流,这也是组成Strom topology结构的重要组件。

3.topology在集群中的结构

storm的topology在集群中主要由四个部分组成:

  1. Nodes
  2. Workers
  3. Executor
  4. Task
    Nodes,代表集群中的一台服务器,会执行topology 中的一部分运算。
    Workers,表示在JVM上独立运作的一个进程,一个Node可以配置多个worker,一个topology 会发送到一个或者多个worker上运行。
    Executor,表示jvm中运行的一个线程,如果不指定,storm 会给每个executor 分配一个task,多个task可以指定给同一个executor执行,
    Task,bolt/spout实例:task是sqout和bolt的实例,他们的nextTuple()和execute()方法会被executors线程调用执行。

大多数情况下,除非明确指定,Storm的默认并发设置值是1。即,一台服务器(node),为topology分配一个worker,每个executer执行一个task。参看图(Storm默认并发机制)
此时唯一的并发机制出现在线程级。
在单机模式下增加并发的方式可以体现在分配更多的worker和executer给topology。
单机模式下,增加worker的数量不会有任何提升速度的效果

1.增加worker    可以通过API和修改配置两种方式修改分配给topology的woker数量。
Config config = new Config();config.setNumWorkers(2);
2.增加Executor
builder.setSpout(spout_id,spout,2)builder.setBolt(bolt_id,bolt,executor_num)  
3.增加Task
builder.setSpout(...).setNumTasks(2);builder.setBolt(...).setNumTasks(task_num);
4.数据流分组    数据流分组方式定义了数据如何进行分发。    Storm内置了七种数据流分组方式:        Shuffle Grouping(随机分组)            随机分发数据流中的tuple给bolt中的各个task,每个task接收到的tuple数量相同。        Fields Grouping(按字段分组)            根据指定字段的值进行分组。指定字段具有相同值的tuple会路由到同一个bolt中的task中。        All Grouping(全复制分组)            所有的tuple赋值后分发给所有的bolt task。        Globle Grouping(全局分组)            这种分组方式将所有的tuple路由到唯一一个task上,Storm按照最小task id来选取接受数据的task。            这种分组方式下配置bolt和task的并发度没有意义。            这种方式会导致所有tuple都发送到一个JVM实例上,可能会引起Strom集群中某个JVM或者服务器出现性能瓶颈或崩溃。        None Grouping(不分组)            在功能上和随机分组相同,为将来预留。        Direct Grouping(指向型分组)            数据源会通过emitDirect()方法来判断一个tuple应该由哪个Strom组件来接受。只能在声明了是指向型数据流上使用。        Local or shuffle Grouping(本地或随机分组)            和随机分组类似,但是,会将tuple分发给同一个worker内的bolt task,其他情况下采用随机分组方式。            这种方式可以减少网络传输,从而提高topology的性能。另外可以自定义数据流分组方式 
原创粉丝点击