storm 基础知识

Apache Storm 是一个开源的分布式、实时、可扩展、容错的计算系统。Apache Storm  Storm可以很容易做到可靠地处理无限的数据流,像Hadoop批量处理大数据一样。Storm处理速度很快,每个节点每秒钟可以处理超过百万的数据组。
      Apache Storm应用的场景例如:实时分析、在线机器学习、连续计算、分布式RPC、ETL 等。

水源源不断的从水龙头流出来,可以流到到不同的池子,然后最后汇合到一个池子 ,形象的描述了Storm可以处理无限的数据流,经过每个节点,可以对数据进行过滤、计算等操作,然后在发送到下一个节点进行处理。

二、Storm架构                                         
      
       Apache Storm分布式集群主要节点由控制节点(Nimbus节点)和工作节点(Supervisor节点),控制节点可以一个,工作节点多个组成的,而Zookeeper主要负责Nimbus节点和Supervisor节点之间的协调工作。

    Nimbus节点负责资源分配和任务分配,通过Zookeeper监控Supervisor状态,Supervisor节点定期接受Nimbus节点分配任务,并会从Nimbus下载代码,并启动对应的worker进程并监控worker 状态,每一worker是一个独立的JVM进程,Worker中运行Spout/Bolt线程Task任务,Storm使用zookeeper来协调整个集群,状态信息(Nimbus分发的任务、Supervisor、worker的心跳等)都保存在Zookeeper上。

三、分布式实时计算应用结构                                 
  
   Apache Storm 是一个开源的分布式、实时计算应用,实时计算应用它是由Topologys、Streams、Spouts、Bolts、Stream groupings等元素组成的。

1、Topologys(拓扑)
       Storm的Topologies是一个分布式实时计算应用,它通过Stream groupings把spouts和Bolts串联起来组成了流数据处理结构,Topologies在集群中一直运行,直到kill(storm kill topology-name [-w wait-time-secs]) 拓扑时扑才会结束运行。
     运行一个拓扑只要把代码打包成一个jar,然后在storm集群环境下,执行命令
           storm jar topology-jar-path class........
     拓扑运行模式:本地模式和分布式模式。
       本地模式:
[html] view plain copy
LocalCluster cluster = new LocalCluster(); 
Topology("word-count", conf, builder.createTopology()); 

分布式模式:
[html] view plain copy
conf.setNumWorkers(2); 
Topology(args[0], conf, builder.createTopology()); 


2、Streams(数据流)
      Streams是storm最核心的抽象概念,一个Stream是一个没有边界的tuple序列,Streams是由Tuple(元组)组成的,Tuple支持的类型有Integer、 Long、 Short、Byte、String、Double、Float、Boolean、Byte arrays。Tuple也支持可序列化的对象。

Tuple是数据流中的一个基本处理单元,包含了多个Field和对应的值,可以理解为key-value的map,因为Bolt中通过declareOutputFields事先定义好往下传的字段名称,所以在构造Tuple时,只要传入对应的value(value List)。
    1)declareOutputFields事先定义好往下传的字段名称
[java] view plain copy
   @Override 
  public void declareOutputFields(OutputFieldsDeclarer declarer) { 
//定义了传到下一个bolt的字段描述 
declarer.declare(new Fields("field")); 

  
    2)然后通过emit要填充value    
[java] view plain copy
collector.emit(new Values(value)) 


说明:
          1)数据流都有默认的id(streamId=default)
      
[java] view plain copy
public List<Integer> emit(List<Object> tuple) { 
     return emit(Utils.DEFAULT_STREAM_ID, tuple); 

                                                 ---源代码
        2)我们可以自己定义数据流Id,declareOutputFields事先定义好往下传的字段名称时,可以声明对应的数据流ID: declarer.declareStream("streamId", new Fields("field"))

3、Spouts(数据源)

        Spout是拓扑的数据流的源头,Spout不断的从外部读取数据(数据库、kafka等外部资源),并发送到拓扑中进行实时的处理。
       Spout是主动模式,Spout继承BaseRichSpout或者IRichSpout类不断的调用nextTuple()函数,然后通过emit发送数据流。
   参数说明:
      Config.TOPOLOGY_MESSAGE_TIMEOUT_SECS:一个Tuple元组全部完成的最大等待时间,默认是30秒;
      Config.TOPOLOGY_MAX_SPOUT_PENDING:设置一次等候单个spout任务的元组最大的数量,(等候意味着这元组没有被acked或失败),设置这个值可以防止队列溢出

  4、Bolts(数据流处理组件)
       Bolt接收Spout或者上游的Bolt发来的Tuple(数据流),然后对数据流进行处理(数据的过滤、统计等等的操作)。
     Bolt是被动模式,Bolt继承BaseBasicBolt类或者IRichBolt 接口等来实现,当 Bolt接收Spout或者上游的Bolt发来的Tuple(数据流)时调用execute 方法,并对数据流进行处理完,OutputCollector的emit 发送数据流,execute 方法在Bolt中负责接收数据流和发送数据流。

5、Stream groupings(数据流分组)
      Storm是通过Stream groupings把spouts和Bolts串联起来组成了流数据处理结构 。   
      Storm对Stream groupings定义了8种数据流分组方式:
       1)Shuffle grouping(随机分组):对Tuple(数据流)随机的分发到下一个bolt的Tasks(任务),每个任务同等机会获取Tupe,保证了集群的负载均衡。
       2)Fields grouping(字段分组):对指定的字段对数据流进行分组,相同的字段对应的数据流都会交给同个bolt中Task来处理,不同的字段的数据流会分发到不同的Task来处理。
       3)Partial Key grouping(部分字段分组):按字段进行分组,这种跟Fields grouping很相似,但这种方式会考虑下游 Bolt 数据处理的均衡性问题,会提供更好的资源利用,可以参考官方的解释。
       4)All grouping(完全分组): Tuple(数据流)会被同时的发送到下一个bolt中的所有Task(任务)。
           5)Global grouping(全局分组):Tuple(数据流)会被发送到 Bolt 的同一个Id 最小的Task(任务)。
       6)None grouping(无分组):使用这种方式说明你不关心数据流如何分组。目前这种方式的结果与随机分组完全等效,不过未来可能会考虑通过非分组方式来让 Bolt 和它所订阅的 Spout 或 Bolt 在同一个线程中执行。
       7)Direct grouping(直接分组):通过OutputCollector emitDirect 方法指定下一个bolt的具体Task来处理。
      8)Local or shuffle grouping(本地或随机分组):如果目标 Bolt 有一个或更多的任务在相同的Worker进程中,Tuple就发送给这些Task,否则Tuple会被随机分发(跟Shuffle grouping一样)。

6、Reliability(可靠性)
     Storm 为了保证spout发送的tuple能够成功的处理,通过 tuple 树跟踪每个Tuple是否被成功的处理。Storm有配置一个Tuple元组全部完成的最大等待时间,如果超过这个时间,就默认这个Tuple失败,重新发送Tuple。通过这种机制保证了Tuple的可靠性。可以参考官方文档对数据处理说明
     Config.TOPOLOGY_MESSAGE_TIMEOUT_SECS:一个Tuple元组全部完成的最大等待时间,默认是30秒。

7、Tasks(任务)
      Task是对应一个spoout或者bolt实例,在Storm集群中每个spoout或者bolt对应多个Task来执行,spoout或者bolt设置多个并行度(setSpout/setBolt),就有对应的多个个Task,spoout的nextTuple()/bolt 的execute() 会被执行。

8、Workers(工作进程)
      拓扑运行在一个或者多个worker上,每一worker是一个独立的JVM进程,进程里面包含一个或者多个executor(线程),一个线程会处理一个或者多个Task(任务)。
   Config.TOPOLOGY_WORKERS设置worker数量。
  
   

猜你喜欢

转载自breakout-alex.iteye.com/blog/2378974