本文主要对比两种常用的分布式系统:

Hadoop 分布式批处理计算代表

Storm    分布式实时系统代表


一. Apache Hadoop 

   Hadoop的两个重要组成部分:HDFS (Hadoop Distributed Files System ,Hadoop的分布式文件系统) 和MapReduce模型。

    1. HDFS的特点:

    (1) 高容错性。HDFS采用冗余存储的方式,将相同的数据按块存储在不同的机器上。对数据节点和数据块进行心跳检测,在某个数据节点或块出现问题时,能及时利用其它的数据块副本重新创建新的节点。

    (2) 高吞吐量。

    (3) 流式访问。Hadoop提供了类POSIX的流式访问接口,我们可以使用字节流的方式访问HDFS上的任意文件。但要注意Hadoop并非支持所有的POSIX文件操作特性。

    (4)廉价集群。HDFS的高容错性,使我们可以采用性能低下的廉价服务器组成存储集群。


      HDFS的缺点:实时性比较差。


    2. MapReduce模型:

       (1)Hadoop提供了输入接口类InputFormat 和输出接口类OutputFormat,用于从数据源读取数据 / 输出数据。

       (2)流程:分治 --- 多Map任务 --- 合并 --- 重整/洗牌 --- 调度Reduce任务。

       (3) Mapper接口类:

             public interface Mapper<K1, V1, K2, V2> extends JobConfigurable, Closeable{。。。}

             前两个参数是输入参数, 后两个参数是输出参数。Mapper该接口继承于JobConfigurable和Closeable,说明接口可以作为任务配置,并且是可以关闭的。注意,K1,V1,K2,V2都是给模板传入的类型,这是一个泛型接口,类似C++中的模板类。

            该接口类值定义了唯一一个接口函数,名为map,就是执行map任务的方法。也是4个参数:

            void map(K1 key, V1 value, OutputCollector<K2, V2>output, Reporter  reporter)throws IOException;

            参数1是输入的key, 参数2是输入的value;参数3是一个数据收集器,可以收集特定类型的输出数据;参数4是一个进度监视器,负责向集群报告Map任务的执行进度。该接口会抛出IOException,触发设备输入输出异常。

         (4)Reducer接口类:

            与Mapper类似,Reducer用于执行MapReduce的Reduce任务,合并Map计算的结果。

            同样也是泛型接口:

            public interface Reducer<K2, V2, K3, V3>extends JobConfigurable, Closeable{。。。}

 参数1和参数2是输入的键值对,参数3和参数4是输出的键值对。该类也是只定义了唯一的接口函数reduce

            void reduce(K2 key,Iterator<V2> values, OutputCollector<K3, V3>output, Reporter  reporter)


    3.  Hadoop的缺点:

    之前说了HDFS的实时性比较差,除此之外,MapReduce模型是一个批处理的模型,核心目标是吞吐量而非实时性。整个计算需要用户启动,而不是一个永不停息的计算流,在每次启动或结束任务时会有一定的开销。

    而现实中的场景是很多数据不断流入,需要集群不断处理,无法等到数据累计到一定程度再启动程序一次性处理。


二.  Apache Storm

    为了解决分布式的数据实时处理问题,诞生了Storm。

    Storm作者设计出了一种“流”的概念,并实现了基于Spout + Bolt的计算模型,之后设计了一种高效算法,在不需要任何的消息队列支持下实现消息处理的保障。

    1.  Storm的计算模型

    核心思想和Hadoop的MapReduce非常相似。

    总体框架: Task(Spout/Bolt)<--Executor<--Supervisor<--Nimbus

    (1) 拓扑结构

    (2) 流

    (3) 消息源

    (4) 消息处理单元

    (5) 分组策略

    (6) 可靠性