大数据技术发展 (三):Spark 代替 Hadoop ? Spark Or Flink ?
大家好,这里是抖码课堂,抖码课堂专注提升互联网技术人的软硬实力。
今天我们来聊聊 Hadoop、Spark、Flink 这些大数据技术的选择问题。
随着时间的推移,大数据的核心技术也在不断的发展,除了 Hadoop 的发展,其中还有两个最引人注意的大数据技术:一个是 2012 年发布的 Spark;另一个是 2014 年发布的 Flink;
在正确选择 Hadoop、还是选择 Spark、还是选择 Flink 之前,我们需要搞明白一个概念,那就是大数据领域中的批处理和实时流处理。
批处理 vs 实时流处理
在现实世界中,数据以两种形式存在,一种是无边界数据,一种是有边界数据;
顾名思义,无边界的数据就是一种不断增长的无限的数据集,这种数据集是实时发送的,而且我们无法判断它什么时候会停止发送。比如一个传感器中发出来的数据,一个移动 APP 中发送出来的数据等都是无边界的数据集
与此相反,有边界数据集就是一种静态的并且是有限的一种数据集,这种数据集有两个特点:
这种数据集一般都是属于某个时间段的,是这个时间段收集到的数据集
这种数据集一般都是已经存储在指定的文件系统中的。
对应着两种形式的数据,数据的处理就有两种形式:
如果需要实时的处理无边界数据集的话,那么就需要使用实时流处理的技术了,每条数据发送后都需要实时的处理
如果需要处理计算有边界数据集的话,那么就可以使用离线批处理的技术了,我们只需要在某个时间点对这种有边界的数据集进行一次处理即可。
那么:
Hadoop 中的 MapReduce 是属于离线批处理的技术。
Spark 本质也是批处理的技术,但是 Spark 的子模块 Spark Streaming 可以实时的处理无边界数据集
Flink 本质上实时流处理技术,但是 Flink 可以将一段时间内的无边界数据集看成是一个有边界的数据集,然后对这段时间收集到的数据进行一次批处理,也就是说 Flink 本质上虽然是流处理技术,但是也可以实现离线批处理的功能。
接下来,我们就分别来讲解下 Hadoop、Spark、Flink ,你到底要选择哪一个?
Hadoop vs Spark
前面我们讲 Hadoop 发展史的时候,了解到了 Hadoop 包含了三个组件:
分布式存储技术 HDFS
分布式计算框架 MapReduce
分布式资源管理技术 Yarn
可以说,Hadoop 已经可以满足大数据的大部分应用场景了,但是自从 2012 年开始 Spark 的出现,短短两年的时间内,Spark 的风头已经盖过了 Hadoop 的风头。在网络上很多朋友甚至说 Spark 会代替掉 Hadoop,这个说法实际上是不严谨的,因为 Spark 只是一个分布式计算的框架,它和 Hadoop 中的 MapReduce 解决的是同一个问题,所以 Spark 最多只能代替掉 Hadoop 中的 MapReduce 这个组件,并不能代替掉 Hadoop。
那么,为什么 Spark 可以代替掉 MapReduce 呢?主要的原因有三个:
Spark 用起来比 MapReduce 方便多了,也就是说 Spark 比 MapReduce 好用,解决一个问题,使用 MapReduce 需要几十行代码的话,那使用 Spark 可能只要几行代码而已。
Spark 性能比 MapReduce 要好很多,Spark 团队曾做过一个实验,用 Spark 排序一个 100TB 的静态数据仅用了 23 分钟,而用 MapReduce 的话,最快也用了 72 分钟。此外,Spark 还只用了 MapReduce 所用的计算资源的 1/10。
Spark 的目标是成为大数据集处理的统一分析引擎
接下来,我们详细来看下上面的第 3 点原因。
如果我们选择使用 MapReduce 来作为计算引擎处理大数据的话,那么:
如果想用 SQL 来操作大数据的话,要用到 Hive 这个技术框架
如果我们快速基于大数据构建机器学习应用的话,我们要用到 Mahout 这个框架
如果我们想构建基于大数据的实时流处理应用的话,我们要用到 Hadoop Streaming
但是,如果我们选择使用 Spark 来作为计算引擎处理大数据的话,那么:
如果想用 SQL 来操作大数据的话,只需要用 Spark 的一个组件 Spark SQL 即可
如果我们快速基于大数据构建机器学习应用的话,我们只需要用 Spark 的一个组件 Spark mllib 来实现
如果我们想构建基于大数据的实时流处理应用的话,我们只需要用到 Spark 的一个组件 Spark Streaming 即可。
可以看出,如果使用 MapReduce 作为大数据处理的引擎,我们可能需要维护好几个技术框架,但是如果选择使用 Spark 的话,那么我们只需要维护 Spark 这一套技术框架就可以,这样是可以节省更多的成本的。
所以说,现在在大数据处理领域,一般都会选择 Spark 作为处理计算引擎的,而不会再去使用 MapReduce 了。
Spark vs Flink
MapReduce 适合批处理任务,也就是说每天对一个大量的静态数据集进行一次处理,同样,Spark 也非常的适合批处理任务,但是 Spark 有一个子模块就是 Spark Streaming 用于实时数据流处理
Flink 同样适合对大数据进行批处理,也可以使用在实时数据流的处理中,那么 Spark 和 Flink 到底选择哪一个呢?
Spark 是以批处理起家的,它的内核就是以批处理的思想来设计实现的。Spark Streaming 虽然可以实时处理数据,但是它的本质还是批处理,只是批处理的时间间隔缩短,比如时间间隔设置成 1 秒,那也就是说每隔 1 秒钟发起一个批处理,所以严格来说 Spark Streaming 只能是近实时处理的技术,适合用于延迟是秒级别的实时计算应用。
Flink 是以实时流处理起家的,它的内核就是以实时流处理的思想来设计实现的。所以 Flink 的实时流处理才是真正意义上的实时处理,如果你的实时处理应用要求延迟非常低的话,那就是用 Flink 的实时流处理了。
Flink 也是支持批处理的,Flink 批处理是基于 Flink 的实时流处理来实现的,也就是说实时收集到的数据先不做处理,等收集了一段时间的数据后,再对这段时间收集的数据做全量的批处理。
批处理和实时流处理都是有各自的优缺点
批处理:数据不能实时计算,但是批处理的逻辑可以非常的复杂
实时流处理:数据可以实时计算,但是计算逻辑相对比较简单
所以,对于计算逻辑非常复杂的应用,建议使用 Spark,对于实时要求非常高的场景,建议使用 Flink 的实时流处理技术,如果实时要求不高的话,仍然可以选择使用 Spark Streaming
Flink 实时流处理技术在处理稍微复杂点的实时流处理场景 (比如各种窗口、状态等) 真的要比 Spark Streaming 要好用多了,谁用谁知道。
Spark 现在已经成为大数据处理领域中事实上的标准了
它起步早于 Flink
它的社区比 Flink 要活跃
基于 Spark 的 SQL、机器学习等库要比 Flink 的稳定和好用
我们再看下 Spark 和 Flink 在 github 上的两个指标就知道谁被用的广泛了。
下图是 Spark 项目,它的 star 的数量是 27.2k,它的 Contributors 是 1616 个
下图是 Flink 项目,它的 star 的数量是 13.9k,它的 Contributors 是 736 个
如何学习?
对于一个新手而言,你可以:
先学习 MapReduce,你可以不要求非常的熟练 MapReduce 编程,但是要学好 MapReduce 解决分布式计算这个问题的设计思想,这个非常的重要
然后要学透 Spark,因为现在 Spark 的使用场景是非常普遍的。Spark 解决分布式计算的思想和 MapReduce 是类似的,对于 Spark,你需要会熟练的编程、掌握它的内核原理以及调优等。
最后就是花点时间学下 Flink,如果你 Spark 学的好的话,Flink 就很容易学的。
系统学习大数据技术:http://douma.ke.qq.com/
版权声明: 本文为 InfoQ 作者【抖码算法】的原创文章。
原文链接:【http://xie.infoq.cn/article/d1179394c2a399e19ff65ff59】。文章转载请联系作者。
评论