Storm学习第二天

概念:

这一页列出了Storm的主要概念和学习Storm的更多资源,这些概念包括:
1.Topologies
2.Streams
3.Spouts
4.Bolts
5.Stream groupings
6.Reliability
7.Tasks
8.Workers

1.Topologies:
           Storm topology包括实时应用的逻辑,一个Storm topology类似于一个MapReduce任务。二者主要的不同是MapReduce任务最终会结束,然而只要你不kill掉它,一个topology会一直运行。一个topology是一个被stream groupings连接的spouts和bolts的图,这些概念在下面描述。

资源:
     http://storm.apache.org/releases/1.0.0/javadocs/org/apache/storm/topology/TopologyBuilder.html
     使用java用这个类构建topologies
     http://storm.apache.org/releases/1.0.0/Running-topologies-on-a-production-cluster.html
     在生产集群上运行topologies
     http://storm.apache.org/releases/1.0.0/Local-mode.html
     通过阅读这个学会在本地模式下开发和测试topologies
2.Streams:
         Stream是Storm的核心抽象,Stream是一个无限的以分布式方式并行的创造和处理的顺序的元组Stream以Stream的元组中包含的域这种方式来定义,默认的包括integer,long,short,byte,string,double,float,boolean和byte array这些数据类型,你也可以通过定义自己的序列化器使得自定义的客户定制类型能够在元组内被使用。每一个Stream被声明的时候都给了一个id。因为single-stream的spout和bolt很常见,OutputFieldsDeclarer有方便的方法不给single-stream一个特殊的id,在这种情况下,stream被给了一个默认的id。

资源:
     Tuple:http://storm.apache.org/releases/1.0.0/javadocs/org/apache/storm/tuple/Tuple.html Stream是由元组组成的
     OutputFieldsDeclarer:http://storm.apache.org/releases/1.0.0/javadocs/org/apache/storm/topology/OutputFieldsDeclarer.html
     用于声明stream和他们的模式
     Serialization:http://storm.apache.org/releases/1.0.0/Serialization.html
     关于Storm的动态类型的元组和声明客户端的序列化类型
3.Spouts:
         Spout是在topology中的流的源头,一般来讲spouts将要从外部源中读取元组并把他们发送到topology,spout可以分为可依赖的和不可依赖的,一个可依赖的spout可以在Storm处理元组失败后从新发送元组,然而一个不可依赖的spout发送完元组就不管了。
         Spout不仅仅可以发送一个流,为了发送多个流,用OutputFieldsDeclarer的declareStream来声明多个流,同时可以使用
SpoutOutputCollector的emit方法指定流发送到哪去。
         在Spout中的主方法是nextTuple,nextTupe可能是向topology发送一个新的元组,如果没有新的元组,就简单的返回,因为Storm在一个线程里面调用所有的spout方法,所以nextTuple必须不能阻塞。
         在Spout中的其他的主要方法是ack和fail,他们在Storm发现元组被topology成功处理或者失败的时候被调用,ack和fail方法只有在可依赖的spout中被调用,看java doc可以得到更多的信息。
资源:
     IRichSpout:http://storm.apache.org/releases/1.0.0/javadocs/org/apache/storm/topology/IRichSpout.html
     这是Spout必须继承的接口
     Guaranteeing message processing:http://storm.apache.org/releases/1.0.0/Guaranteeing-message-processing.html
4.Bolts:
        所有的处理都是在bolts中做,比如过滤,函数,聚合,连接,数据库交互等等。
        bolts可以做简单的流转换。 做复杂的流转换就需要很多步骤,也就需要很多bolts,例如,把一个微博的流转为热门图片的流至少需要二个步骤:一个bolt为一个图片做一个滚动的转发数,一个或者更多的流去找出top X张照片(你可以用三个bolt来做这件事情,这件事情会比用二个bolts更方便)
        bolts能够放出多个流,为了实现这个功能,用OutputFieldsDeclarer的declareStream来声明多个流,同时可以使用SpoutOutputCollector的emit方法指定流发送到哪去。
        当你声明一个bolt的输入流,你经常订阅其他组件的特殊流,如果你想订阅其他组件的所有流,你不得不一个一个的订阅,订阅默认的id的组件的时候,InputDeclarer有一种语法糖,比如declarer.shuffleGrouping("1")和declarer.shuffleGrouping("1", DEFAULT_STREAM_ID)是一样的。
        在bolts中的主要方法是execute,这个方法需要一个新的元组作为输入,bolts使用OutputCollector对象发送一个新的元组。bolts对每一个处理的元组都必须调用OutputCollector的ack方法,这样Storm才能知道元组被处理完毕(这样才能通知原来的spout元组被处理完毕),处理输入元组的常用情况,发送0或者更多的元组,然后反馈完成信息给输入元组,Storm提供了IBasicBolt接口自动反馈完成信息。
       在bolts中开辟一个新的线程去异步处理是完全可以的,OutputCollector是线程安全的,可以在任何时候被调用。
资源:
     IRichBolt: 这是bolt的泛型接口
     IBasicBolt: 这是一个bolt的简单的接口,可以做些过滤或者简单的功能。
     OutputCollector: bolt用这个类的实例去释放他们的元组
5.Stream groupings:
         有一些topology是特殊的,他的bolt把流作为输入,一个stream group定义了在如何分散到各个bolts中。
         在Storm中有8个内置的stream group,你也可以通过实现CustomStreamGrouping接口自定义stream group。
         1.Shuffle group:元组们被随机的分散到各个bolt上,保证每个bolt有相同数量的元组。
         2.Fields group:这个流被特殊域分开,比如,如果流是根据user-id来分组的,一样的user-id就去同样的任务,不一样的
           user-id去不同的任务
         3.Partial Key grouping:这个流被组里的特殊域分开,很像上一个,但是在二个下游的bolt中是负载均衡的,这种能在
           输入数据是不规则的时候提供较好的利用率,
         https://melmeric.files.wordpress.com/2014/11/the-power-of-both-choices-practical-load-balancing-for-
         distributed-stream-processing-engines.pdf这篇文章提供了它的工作原理和它的优势。
         4.All group:这个流在所有的bolts任务中都是重复的,小心使用这个模式
         5.Global group:整个的流都去bolt任务的一个节点,比如,都去id最小的那个任务。
         6.None group:这个分组适用于你不关心流是怎么被分组的,目前来说,这个分组和shuffle分组是一样的,但是最终,Storm将要叠加bolts到一个线程作为bolt或者他们订阅的spout
         7.Direct group:这个是一种特殊的分组。使用这个分组意味着元组的生产者决定哪个任务处理这个元组,这个富足只能在stream是direct stream的时候才能使用,元组被发送到直接流必须使用emitDirect方法,一个bolt要得到消费者的id有二种方法,一种是用TopologyContext,另一种是跟踪OutputCollector的emit方法的输出,这个方法返回元组发送到的任务id
         8.Local or shuffle group:如果目标bolt有一个或者更多的任务在一个worker进程中,元组被分发到那些进程内的任务,如果不是
           这个表现的就和shuffle一样
资源:
     TopologyBuilder: 用这个类去定义topologies
     InputDeclarer: 当TopologyBuilder中的setBolt被调用的时候这个类用于声明bolt的输入流和这些流怎么被分组
6.Reliability:
              Storm保证每一个spout元组都会被topology处理,它之所以能实现这个,是通过跟踪每一个spout元组触发的元组树和决定什么时候元组树被成功的处理,每一个topology都有一个消息超时,如果spout元组没有在规定时间内完成,他就是杀掉然后重新启动。
              为了充分利用Storm的稳定性优势,你必须告诉Storm什么时候元组树的边被创造并且在你处理完一个独立的元组的时候一定要通知Storm,要实现这些可以使用OutputCollector对象,这个对象也是bolt用来发送元组的,前者是通过emit方法实现的,后者是通过ack方法实现的。
7.Tasks:
        每一个spout或者bolt在整个集群中都是作为很多任务执行的,每一个任务对应一个执行线程,stream grouping定义了怎样从一组任务向另一组任务发送元组,可以在TopologyBuilder中的setSpout和setBolt方法中设置每个spout或者bolt的并行性。
8.Workers:
          topologies是通过一个或者多个worker进程执行的,每一个worker进程是一个物理的JVM并且执行所有任务的自己。例如,如果topology并发是300,50个work进程,那么每个worker将要执行6个任务,(这些任务作为worker中的线程),Storm把任务平均的
分散到所有的worker。

资源:
http://storm.apache.org/releases/1.0.0/javadocs/org/apache/storm/Config.html
这个配置设置执行topology的worker的数量。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章