Storm(一) :基础知识

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/congcong68/article/details/73009054

一、简介                                                                                                                            

         Apache Storm 是一个开源的分布式、实时、可扩展、容错的计算系统Apache Storm  Storm可以很容易做到可靠地处理无限的数据流,像Hadoop批量处理大数据一样。Storm处理速度很快,每个节点每秒钟可以处理超过百万的数据组。

      Apache Storm应用的场景例如:实时分析、在线机器学习、连续计算、分布式RPCETL 等。  


       

                                    官方图片

  如图所示,水源源不断的从水龙头流出来,可以流到到不同的池子,然后最后汇合到一个池子 ,形象的描述了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分发的任务、Supervisorworker的心跳等)都保存在Zookeeper上。


    


三、分布式实时计算应用结构                                  

   

   Apache Storm 是一个开源的分布式、实时计算应用,实时计算应用它是由TopologysStreamsSpoutsBoltsStream groupings等元素组成的。

   


  1、Topologys拓扑

       StormTopologies是一个分布式实时计算应用,它通过Stream groupingsspoutsBolts串联起来组成了流数据处理结构Topologies在集群中一直运行,直到killstorm kill topology-name [-w wait-time-secs]) 拓扑时扑才会结束运行。

     运行一个拓扑只要把代码打包成一个jar,然后在storm集群环境下,执行命令

           storm jar topology-jar-path class........

     拓扑运行模式:本地模式和分布式模式。

       本地模式: 

	                LocalCluster cluster = new LocalCluster();
			cluster.submitTopology("word-count", conf, builder.createTopology());


       

        分布式模式:

                        conf.setNumWorkers(2);
			StormSubmitter.submitTopology(args[0], conf, builder.createTopology());



 2、Streams(数据流)

      Streamsstorm最核心的抽象概念,一个Stream是一个没有边界的tuple序列,Streams是由Tuple(元组)组成的,Tuple支持的类型有IntegerLongShortByteStringDoubleFloatBooleanByte arraysTuple也支持可序列化的对象。

     Tuple数据流中的一个基本处理单元,包含了多个Field和对应的值,可以理解为key-valuemap,因为Bolt中通过declareOutputFields事先定义好往下传的字段名称,所以在构造Tuple时,只要传入对应的valuevalue List)。

    1)declareOutputFields事先定义好往下传的字段名称

           @Override
	   public void declareOutputFields(OutputFieldsDeclarer declarer) {
		//定义了传到下一个bolt的字段描述
		declarer.declare(new Fields("field"));
	  }
   

    2)然后通过emit要填充value     

            collector.emit(new Values(value))
   

  说明:

          1)数据流都有默认的idstreamId=default

       

           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 方法,并对数据流进行处理完,OutputCollectoremit 发送数据流,execute 方法在Bolt中负责接收数据流和发送数据流。


 5、Stream groupings(数据流分组)

      Storm是通过Stream groupingsspoutsBolts串联起来组成了流数据处理结构 。    

      StormStream groupings定义了8种数据流分组方式:

       1)Shuffle grouping(随机分组):对Tuple(数据流)随机的分发到下一个boltTasks(任务),每个任务同等机会获取Tupe,保证了集群的负载均衡。

       2)Fields grouping(字段分组):对指定的字段对数据流进行分组,相同的字段对应的数据流都会交给同个boltTask来处理,不同的字段的数据流会分发到不同的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),就有对应的多个个TaskspooutnextTuple()/bolt execute() 会被执行。

 

 8Workers(工作进程)

      拓扑运行在一个或者多个worker上,每一worker是一个独立的JVM进程,进程里面包含一个或者多个executor(线程),一个线程会处理一个或者多个Task(任务)

   Config.TOPOLOGY_WORKERS设置worker数量。

   


猜你喜欢

转载自blog.csdn.net/congcong68/article/details/73009054