MapReduce编程模型的提出为大数据分析和处理开创了一条先河,其后涌现出一批知名的开源大数据技术。
1、Hadoop
Hadoop整个大数据领域的先行者和领航者,形成了一套围绕Hadoop的生态圈,Hadoop和它的生态圈是绝大多数企业首选的大数据解决方案。
Hadoop生态圈的核心组件主要有如下3个。
- Hadoop MapReduce:Hadoop版本的MapReduce编程模型,可以处理海量数据,主要面向批处理。
- HDFS:HDFS(Hadoop Distributed File System)是Hadoop提供的分布式文件系统,有很好的扩展性和容错性,为海量数据提供存储支持。
- YARN:YARN(Yet Another Resource Negotiator)是Hadoop生态圈中的资源调度器,可以管理一个Hadoop集群,并为各种类型的大数据任务分配计算资源。
这三大组件中,数据存储在HDFS上,由MapReduce负责计算,YARN负责集群的资源管理。除了三大核心组件,Hadoop生态圈还有很多其他著名的组件,部分如下。
- Hive:借助Hive,用户可以编写结构化查询语言(Structured Query Language,SQL)语句来查询HDFS上的结构化数据,SQL语句会被转化成MapReduce运行。
- HBase:HDFS可以存储海量数据,但访问和查询速度比较慢,HBase可以提供给用户毫秒级的实时查询服务,它是一个基于HDFS的分布式数据库。HBase最初受Google Bigtable技术的启发。
- Kafka:Kafka是一款流处理框架,主要用作消息队列。
- ZooKeeper:Hadoop生态圈中很多组件使用动物来命名,形成了一个大型“动物园”,ZooKeeper是这个动物园的管理者,主要负责分布式环境的协调。
2、Spark
Spark是一款大数据处理框架,其开发初衷是改良Hadoop MapReduce的编程模型和提高运行速度,尤其是提升大数据在机器学习方向上的性能。与Hadoop相比,Spark的改进主要有如下两点。
- 易用性:MapReduce模型比MPI更友好,但仍然不够方便。因为并不是所有计算任务都可以被简单拆分成Map和Reduce,有可能为了解决一个问题,要设计多个MapReduce任务,任务之间相互依赖,整个程序非常复杂,导致代码的可读性和可维护性差。Spark提供更加方便易用的接口,提供Java、Scala、Python和R语言API,支持SQL、机器学习和图计算,覆盖了绝大多数计算场景。
- 速度快:Hadoop的Map和Reduce的中间结果都需要存储到磁盘上,而Spark尽量将大部分计算放在内存中。加上Spark有向无环图的优化,在官方的基准测试中,Spark比Hadoop快一百倍以上。Spark的核心在于计算,主要目的在于优化Hadoop MapReduce计算部分,在计算层面提供更细致的服务。
Spark的核心在于计算,主要目的在于优化Hadoop MapReduce计算部分,在计算层面提供更细致的服务。Spark并不能完全取代Hadoop,Spark融入了Hadoop生态圈,成为其中的重要一员。一个Spark任务很可能依赖HDFS上的数据,向YARN申请计算资源,将结果输出到HBase上。当然,Spark也可以不用依赖这些组件,独立地完成计算。
Spark主要面向批处理需求,因其优异的性能和易用的接口,Spark已经是批处理界绝对的“王者”。Spark的子模块Spark Streaming提供了流处理的功能,它的流处理主要基于mini-batch的思想。Spark Streaming将输入数据流切分成多个批次,每个批次使用批处理的方式进行计算。因此,Spark是一款集批处理和流处理于一体的处理框架。
3、Kafka
Kafka也是一种面向大数据领域的消息队列框架。在大数据生态圈中,Hadoop的HDFS或Amazon S3提供数据存储服务,Hadoop MapReduce、Spark和Flink负责计算,Kafka常常用来连接不同的应用系统。
企业中不同的应用系统作为数据生产者会产生大量数据流,这些数据流还需要进入不同的数据消费者,Kafka起到数据集成和系统解耦的作用。系统解耦是让某个应用系统专注于一个目标,以降低整个系统的维护难度。在实践上,一个企业经常拆分出很多不同的应用系统,系统之间需要建立数据流管道(Stream Pipeline)。假如没有Kafka的消息队列,M个生产者和N个消费者之间要建立M×N个点对点的数据流管道,Kafka就像一个中介,让数据管道的个数变为M+N,大大减小了数据流管道的复杂程度。
从批处理和流处理的角度来讲,数据流经Kafka后会持续不断地写入HDFS,积累一段时间后可提供给后续的批处理任务,同时数据流也可以直接流入Flink,被用于流处理。Kafka的主要功能侧重在消息队列上。
4、Flink
Flink主要面向流处理,如果说Spark是批处理界的“王者”,那么Flink就是流处理领域冉冉升起的“新星”。流处理并不是一项全新的技术,在Flink之前,不乏流处理引擎,比较著名的有Storm、Spark Streaming,流处理框架经历的三代演进。
Flink是一个支持在有界和无界数据流上做有状态计算的大数据处理框架。它以事件为单位,支持SQL、状态、水位线(Watermark)等特性,支持“Exactly-Once”。比起Storm,它的吞吐量更高,延迟更低,准确性能得到保障;比起Spark Streaming,它以事件为单位,达到真正意义上的实时计算,且所需计算资源相对更少。具体而言,Flink的优点如下:
- 支持事件时间(Event Time)和处理时间(Processing Time)多种时间语义。即使事件乱序到达,Event Time也能提供准确和一致的计算结果。Procerssing Time适用于对延迟敏感的应用。
- Exactly-Once投递保障。
- 毫秒级延迟。
- 可以扩展到上千台节点、在阿里巴巴等大公司的生产环境中进行过验证。
- 易用且多样的API,包括核心的DataStream API和DataSet API以及Table API和SQL。
- 可以连接大数据生态圈各类组件,包括Kafka、Elasticsearch、JDBC、HDFS和Amazon S3。
- 可以运行在Kubernetes、YARN、Mesos和独立(Standalone)集群上。