Storm简介

Storm的核心技术

  Storm框架的核心由7个部分组成,如下图:

  

  Topology(拓扑)

     一个拓扑是一个图的计算。用户在一个拓扑的每个节点包含处理逻辑,节点之间的连接显示数据应该如何在节点间传递。;
            Storm Topology类似于MapReduce,两者关键的区别是MapReduce运行完会结束,而Storm Topology会永远运行(除手动storm kill {topologyName})。Storm Topology的结构是一个DAG图,由Spouts和Bolts组件构成,Spout组件作为数据源分发流数据到各个bolt组件中,流数据在各个组件中传递的对象为Tuple。拓扑分为本地模式和机器模式,Java示例如下:

  String topologyName = WordCountTopology.class.getSimpleName();
   //使用TopologyBuilder来构造拓扑,并定义Spout和Bolt之间的连接
   TopologyBuilder builder = new TopologyBuilder();
   builder.setSpout("input", new InputSpout());
   builder.setBolt("split", new SplitBolt()).shuffleGrouping("input");
   builder.setBolt("count", new CountBolt()).shuffleGrouping("split");
            
   Config config = new Config();
   config.setDebug(true);
            
   if (args!=null && args.length>0) {
     config.setNumWorkers(3);
      //集群模式运行提交拓扑,API为StormSubmitter.submitTopology(topologyName, conf, topology);
      StormSubmitter.submitTopology(topologyName, config, builder.createTopology());
   } else {
      //本地模式运行提交拓扑,API为new LocalCluster().submitTopology(topologyName, conf, topology);
      LocalCluster cluster = new LocalCluster();
      cluster.submitTopology(topologyName, config, builder.createTopology());
      Utils.sleep(1000*100);
      cluster.killTopology(topologyName);
      cluster.shutdown();
   }

  Stream(流)

    流是Storm的核心抽象。一个流是一个无界Tuple序列,Tuple可以包含整型、长整型、短整型、字节、字符、双精度数、浮点数、布尔值和字节数组。用户可以通过自定义序列化器在Tuple中使用自定义类型。在Spout和Bolt组件中流通常都被赋予一个id,使用OutputFieldsDeclarer.declare方法来声明一个流没有指定id,在这种情况下则默认id为default。

  Spout(喷口)

    Spout是Topology流的来源。一般Spout从外部来源读取Tuple,提交到Topology(如Kafka队列或Flume)。Spout可以分为可靠的和不可靠的两种模式。

  Bolt(螺栓)

    Topology中的所有数据的处理都在Bolt中完成。Bolt可以完成数据过滤、业务处理、连接运算、连接、访问数据库等操作。Bolt可以做简单的流转换,发出超过一个流,主要方法是execute方法。完全可以在Bolt中启动新的线程做异步处理。

  Stream grouping(流分组)

    流分组在Bolt的任务中定义流应该如何分区。Storm有7个内置的流分组接口:随机分组(Shuffle grouping)、字段分组(Fields grouping)、全部分组(All grouping)、全局分组(Global grouping)、无分组(None grouping)、直接分组(Direct   grouping)、本子或者随机分组(Local grouping或Shuffle grouping)。

  Task(任务)

    每个Spout或Bolt在集群中执行许多任务。每个任务对应一个线程的执行,刘分组定义如何从一个任务集到另一个任务集发送Tuple。可以通过TopologyBuilder类的setSpout()和setBolt()方法来设置每个Spout或Bolt的并行度。

  worker(工作进程)

    Topology跨一个或多个Worker节点的进程执行。每个Worker节点的进程是一个物理的JVM和Topology执行所有任务的一个子集。

Storm的优势

  集成多种技术

    Storm集成了一些消息队列系统和数据库系统,Storm的Spout抽象使得它很容易集成一些新的消息队列系统。消息队列集成主要有:Kestrel、RabbitMQ/AMQP、Kafka、JMS。同样,Storm也很容易的和数据库系统集成。简单的打开一个数据库连接,就可以像平时一样进行读写,Storm会自动完成并行化、分区、在失败时重试等操作。

  简单的API

    Storm只有三个抽象类型:Spout、Bolt、Topology。Spout是Topology的数据源。(通常在Topology中Spout从Kestrel、RabbitMQ、Kafka等消息队列中读取;Spout也可以读取数据库或生成自己的流)Spout实现了现有的大多数的队列系统。

  可扩展性

    Storm的Topology是并行计算的,它运行在一个集群中,Topology支持单独调整进行扩展。Storm提供了rebalance命令可以调整并行运行的Topology。Storm内在的并行度意味着它能以低延迟的速度来处理高吞吐量的消息。Storm官网资料介绍,Storm  一个节点(Intel E5645@2.4GHZ的CPU,24GB的内存)在1秒钟内能够处理100w个100字节的消息。

  容错性

    Storm是容错的,当Worker进程死亡Storm会重启它们。如果一个节点(Supervisor)死亡,该节点上运行的Worker会在其他节点上重新启动。Storm的守护进程Nimbus和Supervisor被设计成无状态和快速失败的,所以如果它们死亡,它们会重启就像什  么都没有发生过。这意味着使用kill -9命令强制杀死Storm的守护进程而不影响集群或Topology的健康。

  保证数据被可靠的处理

    Storm能保证每一个Tuple都能被完全处理。Storm的核心机制之一是能够通过一种非常有效的Topology方式来跟踪Tuple。Storm保证每个消息至少能得到一次完整的处理。任务失败时,它会负责从消息源重试。使用Trident(在Storm基本抽象上更高层次  的抽象),用户可以实现一次且仅一次处理的语义。

  多语言

    Storm的核心是一个定义和提交Topology的Thrift定义,所以支持任何语言进行定义和提交Topology。如果用户使用非JVM的Spout和Bolt可以通过一个基于JSON协议的stdin/stdout与Storm通信。目前有Ruby、Python、JavaScript、Perl和PHP实现这个  协议的适配器。

  部署简单和开源

    Storm集群是易于部署的,仅需要(zeroMQ、jzMQ)和配置conf/storm.yaml就可以运行,Storm的“开箱即用”配置比较适合生产环境;Storm是Eclipse Public License许可证下的一个免费开源的项目,目前被托管在GitHub上。Eclipse Public        License(EPL)是一个非常宽容的许可,允许用户使用Storm用户开源的或者专有目的的使用。

原文地址:https://www.cnblogs.com/mengyao/p/4733622.html