赞
踩
在学一个新技术之前,你有必要先了解这门技术出现的意义。这样,你才能更好地理解:它是应用到什么场景的?
与同类工具相比,它的优缺点是什么?什么时候用它比其它工具好(或差)?
……至少理解了这些,你才好说自己是真正掌握了这个工具,否则只能说是浅尝辄止,半生不熟。
MapReduce 被淘汰两大主要原因:高昂的维护成本、时间性能“达不到”用户的期待。
除此之外,还存在诸多局限。
1、MapReduce 模型的抽象层次低,大量的底层逻辑都需要开发者手工完成。
打个比方,写 MapReduce 的应用就好比用汇编语言去编写一个复杂的游戏。如果你是开发者,你会习惯用汇编语言,还是使用各种高级语言如 Java、C++ 的现有框架呢?
2、只提供 Map 和 Reduce 两个操作。
很多现实的数据处理场景并不适合用这个模型来描述。实现复杂的操作很有技巧性,也会让整个工程变得庞大以及难以维护。举个例子,两个数据集的 Join 是很基本而且常用的功能,但是在 MapReduce 的世界中,需要对这两个数据集做一次 Map 和 Reduce 才能得到结果。这样框架对于开发者非常不友好。正如第一讲中提到的,维护一个多任务协调的状态机成本很高,而且可扩展性非常差。
3、在 Hadoop 中,每一个 Job 的计算结果都会存储在 HDFS 文件存储系统中,所以每一步计算都要进行硬盘的读取和写入,大大增加了系统的延迟。
由于这一原因,MapReduce 对于迭代算法的处理性能很差,而且很耗资源。因为迭代的每一步都要对 HDFS 进行读写,所以每一步都需要差不多的等待时间。
4、只支持批数据处理,欠缺对流数据处理的支持。
Spark 提供了RDD的数据抽象,定义的 RDD操作可以像函数式编程中操作内存中的集合一样直观、简便,使得实现数据处理的代码非常简短高效。同时极大地提升了对各种复杂场景的支持,开发者既不用再绞尽脑汁挖掘 MapReduce 模型的潜力,也不用维护复杂的 MapReduce 状态机。
相对于 Hadoop 的 MapReduce 会将中间数据存放到硬盘中,Spark 会把中间数据缓存在内存中,从而减少了很多由于硬盘读写而导致的延迟,大大加快了处理速度。由于 Spark 可以把迭代过程中每一步的计算结果都缓存在内存中,所以非常适用于各类迭代算法。Spark 第一次启动时需要把数据载入到内存,之后的迭代可以直接在内存里利用中间结果做不落地的运算。所以,后期的迭代速度快到可以忽略不计。在当今机器学习和人工智能大热的环境下,Spark 无疑是更好的数据处理引擎。
在任务(task)级别上,Spark 的并行机制是多线程模型,而 MapReduce 是多进程模型。多进程模型便于细粒度控制每个任务占用的资源,但会消耗较多的启动时间。而 Spark 同一节点上的任务以多线程的方式运行在一个 JVM 进程中,可以带来更快的启动速度、更高的 CPU 利用率,以及更好的内存共享。
从本质上看,Spark 可以算作是一种 MapReduce 计算模型的不同实现。Hadoop MapReduce 简单粗暴地根据 shuffle 将大数据计算分成 Map 和 Reduce 两个阶段,然后就算完事了。而 Spark 更细腻一点,将前一个的 Reduce 和后一个的 Map 连接起来,当作一个阶段持续计算,形成一个更加优雅、高效的计算模型,虽然其本质依然是 Map 和 Reduce。但是这种多个计算阶段依赖执行的方案可以有效减少对 HDFS 的访问,减少作业的调度执行次数,因此执行速度也更快。
Spark 有三个主要特性:**RDD 的编程模型更简单,DAG 切分的多阶段计算过程更快速,使用内存存储中间计算结果更高效**。这三个特性使得 Spark 相对 Hadoop MapReduce 可以有更快的执行速度,以及更简单的编程实现。
不能。因为 Hadoop 还包含了很多组件:
从狭义上来看,Spark 只是 MapReduce 的替代方案,大部分应用场景中,它还要依赖于 HDFS 和 HBase 来存储数据,依赖于 YARN 来管理集群和资源。
当然,Spark 并不是一定要依附于 Hadoop 才能生存,它还可以运行在 Apache Mesos、Kubernetes、standalone 等其他云平台上。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。