zoukankan      html  css  js  c++  java
  • storm实战总结笔记

    storm是一款开源的、分布式的、低延迟的、可扩展的、容错的实时计算框架,采用clojure和java的混合编程,总体两者的代码总量是55开的,但clojure语言具有很强的表现力,所以storm的核心基本都是使用clojure语言实现的。jstorm是阿里对storm的java改写版本,阿里团队也对其做了一些优化,使得jstorm更加强大,而且jstorm是完全对storm兼容的,只是有一些细微的差别,但是基本都是内部的差别,对外的API不会有什么区别,所以学习的成本也不会增加太多。 
    我们对开源的、分布式的、低延迟的、可扩展的、容错的做一下解释:

    开源的:感觉这个应当是不用讲的,开源不光意味着代码的开放,同样意味着其具有强大的生命力,因为jstorm不是属于一个团队的,而是大家都可以对其进行改造,生命力源自于此。

    分布式的:一台物理机器的CPU、内存、磁盘终究是有限度的,当数据量巨大的情况下,利用多台廉价的机器来协同完成计算成为了上上策,而jstorm也就是用于协同多台机器完成计算的框架,当然这里的计算是指实时计算。其实分布式也是容错性的一部分。

    低延迟的:低延迟一方面得益于他是分布式的,计算能力可以通过机器数量的扩展得到提升。传统的计算框架中也有很多分布式的,比如hadoop,但是那是批量处理的模式,对数据进行缓存后再进行一个批处理,比如计算网站的访问量,批处理的方式是一个小时内的数据进行计算,得到访问量。而实时计算的做法有两种,一种是一条一条记录的计算,这样讲处理的延迟就会降低,这也是jstorm采用的方案,另一种便是将批处理的“批”的时间间隔大小减少,比如一个batch时间定为200ms,这样他的处理延迟也会比传统的离线批处理快很多,这是另一款实时处理框架spark streaming的处理方法。

    可扩展:通过源代码的阅读,发现jstorm采用的是thrift的server/client的模式,rpc通过thrift定义接口,代码的各个大板块之前都可以使用不同的语言开发,但是提供给我们使用的API的语言貌似只有java,也可以有一些扩展,但是支持的版本比较低。

    容错:不同的应用程序对容错性的要求不同,如银行的交易,对容错性较高,网站访问数量的计算,其容错性要求就比较低。总的来数,核心业务的容错性要求较高。jstorm的容错性体现在两方面,一是其为集群的、分布式的系统,而且jstorm是一个无状态的模型,其所有的状态都保存在一个集群的zookeeper中,在机器、进程死掉后,可以通过zookeeper中记录的信息进行重启。二是其具有ack机制,对每一条信息,都可以进行ack告知上游处理完成,或者fail,告诉上游处理不成功,没能手动的ack,便会触发timeout,上游也会fail,根据我们容错性要求的不同,其处理办法也不同。

    1个worker进程执行的是1个topology的子集(注:不会出现1个worker为多个topology服务)。1个worker进程会启动1个或多个executor线程来执行1个topology的component(spout或bolt)。因此,1个运行中的topology就是由集群中多台物理机上的多个worker进程组成的。

    executor是1个被worker进程启动的单独线程。每个executor只会运行1个topology的1个component(spout或bolt)的task(注:task可以是1个或多个,storm默认是1个component只生成1个task,executor线程里会在每次循环里顺序调用所有task实例)。

    task是最终运行spout或bolt中代码的单元(注:1个task即为spout或bolt的1个实例,executor线程在执行期间会调用该task的nextTuple或execute方法)。topology启动后,1个component(spout或bolt)的task数目是固定不变的,但该component使用的executor线程数可以动态调整(例如:1个executor线程可以执行该component的1个或多个task实例,当执行多个task实例时executor的数量就减少了)。这意味着,对于1个component存在这样的条件:#threads<=#tasks(即:线程数小于等于task数目)。默认情况下task的数目等于executor线程数目,即1个executor线程只运行1个task。

    如果一个topology里面一共有一个spout, 一个bolt。 其中spout的parallelism是2, bolt的parallelism是4, 那么我们可以把这个topology的总工作量(即task的数量)看成是6, 那么一共有6个task,那么/tasks/{topology-id}下面一共会有6个以task-id命名的文件,其中两个文件的内容是spout的id, 其它四个文件的内容是bolt的id。 

    topology里面的组件(spout/bolt)都根据parallelism被分成多个task, 而这些task被分配给supervisor的多个worker来执行。

    task都会跟一个componment-id关联, componment是spout和bolt的一个统称。

    总结:一个topology可以通过setNumWorkers来设置worker的数量,通过设置parallelism来规定executor的数量(一个component(spout/bolt)可以由多个executor来执行),通过setNumTasks来设置每个executor跑多少个task(默认为一对一)。

  • 相关阅读:
    Read-Copy Update Implementation For Non-Cache-Coherent Systems
    10 华电内部文档搜索系统 search04
    10 华电内部文档搜索系统 search05
    lucene4
    10 华电内部文档搜索系统 search01
    01 lucene基础 北风网项目培训 Lucene实践课程 索引
    01 lucene基础 北风网项目培训 Lucene实践课程 系统架构
    01 lucene基础 北风网项目培训 Lucene实践课程 Lucene概述
    第五章 大数据平台与技术 第13讲 NoSQL数据库
    第五章 大数据平台与技术 第12讲 大数据处理平台Spark
  • 原文地址:https://www.cnblogs.com/garfieldcgf/p/6231619.html
Copyright © 2011-2022 走看看