spark 真比 mr on hadoop 快吗

最近在调研spark准备在部门的数据平台上使用spark替换原有的mr。遇到的几个问题解决记录下。
spark相对于传统MR工作流的特色:

  • 查询的管道式执行
  • 没有中间数据会持久化
  • 对表的页数据进行LRU缓存

Spark 真比 mr on hadoop 快吗?

一些对于spark和hadoop不太了解的同学可能会觉得spark和hadoop非此即彼,还有同学问过我spark是基于内存的技术,为什么不直接用spark替换hadoop。
我们处理数据都是会把数据读取到内存上进行操作,而无法直接操作硬盘进行数据的逻辑计算,所谓的spark基于内存的计算只是

  • spark的shuffle操作内存中进行一次而不用像mr那样还要经过一次硬盘。
  • 相比传统的MR工作流中每个job在迭代时都会讲数据存入HDFS,而Spark支持DGA和管道操作,这样就可以让我们执行复杂的工作流而不用将中间数据持久化(除非要进行shuffle)。

    Spark的核心“shuffle”会将数据写入磁盘中,如果我们在我们的Spark SQL语句中使用了group by语句或者我们刚刚讲RDD转换为PairRDD并且通过键来调用聚合操作,那么我们正在强制Spark将数据根据key的哈希值分发到各个数据节点。Shuffle处理包含两个阶段,就是通常所说的“map”和“reduce”:“map”阶段仅仅计算key的哈希值(或者是自定义的其他分割函数)并将结果输出N个单独的文件到本地磁盘上,其中N就是“reudce”端的分区数;“Reduce”端拉取“map”端的计算结果并将其合并新的分区,因此如果我们的RDD有M个分区,则我们将它转换为一对RDD时会在集群中生成M*N个文件,这些文件包含RDD中的所有数据;有一些优化手段可以减少生成的文件数量;此外还有一些工作来预排序这些文件并且在“reduce”端“合并”这些文件,但这并不能改变如果我们想要处理数据就得将数据放入HDD的事实。
    所以,Spark并不是一项基于内存的技术。这是一项可以让我们有效的利用基于内存的LRU方法在内存存满时将数据卸载至硬盘中;而且它没有内置持久化功能(内存、硬盘都没有),它会在shuffle过程中将所有数据放到本地文件系统中。

参考资料: