本文主要对比两种常用的分布式系统:
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) 可靠性