Hadoop已经成了大数据技术的事实标准,Hadoop MapReduce也非常适合于对大规模数据集合进行批处理操作,但是其本身还存在一些缺陷。特别是MapReduce存在的延迟过高,无法胜任实时、快速计算需求的问题,使得需要进行多路计算和迭代算法的用例的作业过程并非十分高效。
(1)Spark简介。
加州大学伯克利分校实验室借鉴了Hadoop MapReduce技术,提出了一种通用内存并行计算框架——Spark。Spark继承了MapReduce分布式并行计算的优点并改进了其明显的缺陷。
Spark使用Scala语言进行实现,它是一种面向对象的函数式编程语言,能够像操作本地集合对象一样轻松地操作分布式数据集。它具有运行速度快、易用性好、通用性强和随处运行等特点,具体优势如下。
1)Spark提供了内存计算,把中间结果放到内存中,带来了更高的迭代运算效率。通过支持有向无环图(DAG)的分布式并行计算的编程框架,Spark减少了迭代过程中数据需要写入磁盘的需求,提高了处理效率。
2)Spark提供了一个通用的计算框架,支持大规模大数据和各种类型数据处理需求。
3)Spark比Hadoop更加通用。Hadoop只提供了Map和Reduce两种处理操作,而Spark提供的数据集操作类型更加丰富,从而可以支持更多类型的应用。Spark的计算模式也属于MapReduce类型,但提供的操作不仅包括Map和Reduce,还提供了包括Map、Filter、FlatMap、Sample、GroupByKey、ReduceByKey、Union、Join、Cogroup、MapValues、Sort、PartionBy等多种转换操作,以及Count、Collect、Reduce、Lookup、Save等行为操作。
4)Spark基于DAG的任务调度执行机制比Hadoop MapReduce的迭代执行机制更优越。Spark各个处理结点之间的通信模型不再像Hadoop一样只有Shuffle一种模式,程序开发者可以使用DAG开发复杂得多步数据管道,控制中间结果的存储、分区等。
为了更好理解Hadoop和Spark的不同,下面对Hadoop和Spark的执行流程进行了对比,如图4-5所示。从图中可以看出,Hadoop不适合于做迭代计算,因为每次迭代都需要从磁盘中读入数据,向磁盘写中间结果,而且每个任务都需要从磁盘中读入数据,处理的结果也要写入磁盘,磁盘I/O开销很大。而Spark将数据载入内存后,后面的迭代都可以直接使用内存中的中间结果做计算,从而避免了从磁盘中频繁读取数据。在对HDFS同一批数据做成百或上千维度查询时,Hadoop每做一个独立的查询,都要从磁盘中读取这个数据,而Spark只需要从磁盘中读取一次后,就可以针对保留在内存中的中间结果进行反复查询。Spark在2014年打破了Hadoop保持的基准排序记录,使用206个结点在23分钟的时间里完成了100TB数据的排序,而Hadoop则是使用了2000个结点在72分钟才完成相同数据的排序。也就是说,Spark只使用了百分之十的计算资源,就获得了Hadoop的3倍的速度。
图4-5 Hadoop与Spark执行流程对比
尽管与Hadoop相比,Spark有较大优势,但是并不能够取代Hadoop。因为Spark是基于内存进行数据处理的,所以不适合于数据量特别大、对实时性要求不高的场合。由于RDD的特性,Spark不适用于那种异步细粒度更新状态的应用,例如,Web服务的存储,或增量的Web爬虫和索引,不适合增量修改的应用模型。另外,Hadoop可以使用廉价的通用服务器来搭建集群,而Spark对硬件要求比较高,特别是对内存和CPU有更高的要求。
(2)Flink简介。
Apache Flink是apache的顶级项目,是一个高效、分布式、基于Java实现的通用大数据分析引擎,支持数据批量处理和基于流的数据分析。
Apache Flink是一个框架和分布式处理引擎,用于在无边界和有边界数据流上进行有状态的计算。下面着重介绍Flink架构的重要特性。
1)处理无界和有界数据。
任何类型的数据都可以形成一种事件流。例如,信用卡交易、传感器数据收集、系统日志、用户社交记录等都形成一种流。数据可以被作为无界或有界流来处理。
无界流有定义流的开始,但没有定义流的结束。由于无界流持续地产生数据,所以需要实时处理数据。为了保持数据处理结果产生的完整性,无界流数据要求以事件发生的顺序来进行处理。
由于有流开始和流结束的定义,有界流的数据通常采取批处理的方式。有界流数据处理的顺序没有有序性要求。
由于Flink能够精确地控制无界和有界数据集的处理时间和状态转化,使得其能够出色地处理任何无界流和有界流的应用。
2)部署应用到任意地方。
Flink是一个分布式系统,它集成了Hadoop YARN、Apache Mesos和Kubernetes等常见的集群资源管理器。通过资源管理器特定(resource-manager-specific)的部署模式,Flink可以采用与当前资源管理器相适应的方式进行交互。部署Flink应用程序时,Flink会根据应用程序配置的并行性自动标识所需的资源,并从资源管理器请求这些资源。
3)运行任意规模应用。
Flink并发执行应用程序所分布在集群中的各个子任务,充分利用无尽的CPU、内存、磁盘和网络I/O。因此,Flink可在任意规模上运行有状态流式应用。
4)利用内存性能。
如果任务状态小于可用内存,则始终保留在内存中。否则,保存在可高效访问的磁盘结构中。任务通过访问本地内存中状态来进行所有的计算,从而产生非常低的处理延迟。
(3)Hadoop,Spark和Flink比较。
1)数据处理。
Hadoop:专为批处理而构建的Apache Hadoop。它一次将大量数据集进行输入,进行处理并产生结果。批处理在处理大量数据时非常稳定。由于数据的大小和系统的计算能力有关,输出会产生延迟。
Spark:Apache Spark也是Hadoop生态系统的一部分。它也是一个批处理系统,但它也支持流处理。
Flink:Apache Flink为流和批处理提供了一个运行时。
2)流引擎。
Hadoop:Map-reduce是面向批处理的处理工具。它一次将大量数据集输入到输入中,进行处理并产生结果。
Spark:Apache Spark Streaming以微批处理数据流。每个批次包含在该批次期间到达的事件的集合。但是对于我们需要处理大量实时数据流并实时提供结果的业务而言,这还不够。
Flink:Apache Flink是真正的流引擎。它使用流来处理工作负载:流,SQL,微批处理和批处理。批处理是流数据的有限集合。
3)数据流。
Hadoop:MapReduce计算数据流没有任何循环,这是一个阶段链。在每个阶段,都是使用上一阶段的输出作为本阶段的输入。
Spark:尽管机器学习算法是循环数据流,但Spark将其表示为直接非循环图(DAG)或有向无环图。
Flink:Flink,在运行时受控循环依赖图,这有助于以非常有效的方式表示机器学习算法。
4)计算模型。
Hadoop:MapReduce采用了面向批处理的模型,批处理静态数据,它一次要处理大量数据,对其进行处理,然后将其输出。
Spark:Spark采用了微批处理。微批处理本质上是一种“先收集再处理”的计算模型。(www.xing528.com)
Flink:Flink采用连续流式流传输模型,实时对数据进行处理,而不会在收集数据或处理数据时出现任何延迟。
5)性能。
Hadoop:Hadoop仅支持批处理,不处理流数据,因此与Hadoop,Spark和Flink相比,性能会降低。
Spark:Spark使用微批处理技术,流处理效率不如Flink。
Flink:Flink使用闭环迭代,与其他任何数据处理框架相比,Flink的性能非常出色。
6)容错性。
Hadoop:MapReduce具有高度的容错能力。如果Hadoop发生任何故障,则无须从头开始重新启动应用程序。
Spark:Spark Streaming可进行故障恢复,并且无须任何额外的代码或配置。
Flink:Flink遵循的容错机制基于Chandy-Lamport分布式快照。该机制是轻量级的,这导致维持高吞吐率并同时提供强大的一致性保证。
7)可扩展性。
Hadoop:MapReduce具有不可思议的可扩展性潜力,已在成千上万的节点上用于生产。
Spark:它具有较高的可扩展性,我们可以在集群中继续添加n个节点,大型的Spark群集有8000个节点。
Flink:Flink也是高度可扩展的,我们可以在集群中继续添加n个节点。大型Flink集群有数千个节点。
8)延迟。
Hadoop:Hadoop的MapReduce框架相对较慢,因为它旨在支持不同的格式,结构和大量数据。这就是为什么Hadoop具有比Spark和Flink更高的延迟的原因。
Spark:Spark是又一个批处理系统,但是它比Hadoop MapReduce相对更快,因为它通过RDD将许多输入数据缓存在内存中,并将中间数据保留在内存本身中,最终在完成时或需要时将数据写入磁盘。
Flink:Flink的配置工作量很小,其数据流运行时可实现低延迟和高吞吐量。
9)恢复。
Hadoop:MapReduce可以对系统故障或故障进行恢复,是高度容错的系统。
Spark:Spark RDD允许通过重新计算DAG来恢复故障节点上的分区,同时还通过检查点支持与Hadoop更相似的恢复方式,以减少RDD的依赖性。
Flink:它支持检查点机制,该机制将程序存储在数据源和数据接收器中,窗口状态以及用户定义的状态,该状态可在失败后恢复流作业。
10)成本。
Hadoop:由于MapReduce没有将所有内容存储在内存中,因此通常可以在比一些硬件便宜的替代产品上运行。
Spark:由于spark需要大量RAM才能在内存中运行,因此增加了集群中的内存,逐渐增加了成本。
Flink:Flink需要大量RAM才能在内存中运行,因此增加了其成本。
11)交互模式。
Hadoop:MapReduce没有交互模式。
Spark:Spark具有一个交互式shell程序,以学习如何充分利用Apache Spark。这是一个用Scala编写的Spark应用程序,可提供具有自动完成功能的命令行环境,您可以在其中运行临时查询并熟悉Spark的功能。
Flink:带有集成的交互式Scala Shell。它既可以用于本地设置,也可以用于群集设置。
12)实时分析。
Hadoop:MapReduce不能进行实时数据处理,因为它旨在对大量数据执行离线批处理。
Spark:它可以处理实时数据,即以每秒数百万个事件的速率来自实时事件流的数据。
Flink:尽管它还提供快速的批处理数据处理,但它主要用于实时数据分析。
13)SQL支持。
Hadoop:它使用户可以使用Apache Hive运行SQL查询。
Spark:它使用户能够使用Spark-SQL运行SQL查询。Spark提供了像查询语言一样的Hives和像DSL这样的Dataframe来查询结构化数据。
Flink:在Flink中,Table API是一种类似于SQL的表达语言,支持诸如DSL之类的数据,并且仍处于测试阶段。
14)硬件要求。
Hadoop:MapReduce在廉价硬件上运行得很好。
Spark:由于Spark需要将数据缓存在内存中以进行进一步的迭代,需要中高级硬件。
Flink:由于Flink需要将数据缓存在内存中以进行进一步的迭代,需要中高级硬件。
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。