Spark VS MapReduce 浅谈
计算速度
计算的速度是取决于计算机本身的计算能力的。
并且目前来看,所有的计算机计算都是基于内存的(如果有不是的,请原谅我的孤陋寡闻...),
也就是说 MR 和 Spark 是没有区别的。
Shuffle
我们都知道,不管是Spark 还是 MR,
其理论依据都是 一篇名为 MapReduce 的论文
那么对于 Map 和 Reduce 两个阶段,其都是会产生 Shuffle 的,
而Shuffle会使得数据落地到磁盘,
相比于内存计算,磁盘的读写一般是要慢很多的,
当然不要抬杠说一些非常复杂的计算逻辑噢~~~
所以 Shuffle 也是影响速度的一个重要因素
Shuffle 方式或者说算法,其实二者差别也不大,
因为理论依据一样,所以理论上,
二者在这一块基本不会拉开差距,
计算模型
上面说了看似废话的两点,
但是还是得要说明,防止一些先入为主的错误观念。
那就是Spark的计算模型 DAG,
下面我们以Spark的视角来看DAG的优势。
编程更简单方便
因为DAG的存在,
是的 Spark 编程比MR方便快捷,
也更加的简单了,
在我看来这也是从MR转Spark的一个非常重要的一点,
谁也不会否认,用了Spark,真的不想再去编程MR了。
具体更好的控制力
因为DAG的存在,
使得我们可以把 各种业务 任意组合,
好处是显而易见的:
-
业务上的任务更加清晰了,
维护成本更低了,
而 MR 则是一个一个的Job,完全是分开的,
要维护一个正常的业务开发,
那是真的不那么简单, -
而对于Spark而言,
因为任务都是在一个 Application 里面,
所以在计算方面,资源分配方面,
都有了更大的可操作空间,
比如说:Cache 算子的出现,
如果没有DAG,你根本无法使用类似这样的算子。而MR要做类似Cache之类的优化是非常困难的,
当然,这里可以说,虽然难,
如果你是大佬,你也是可以进行优化的,
优化的效果,理论上也是可以让二者在运行速度上没差,
但是我估计,没人会愿意去做这种吃力吃力才讨好的事情吧。 -
Shuffle的次数会更少,
还是是因为任务都是在一个 Application 里面,
Spark很容易可以根据任务流来进行Shuffle的规划,
而MR则完全依赖于用户,
这就导致MR的不可控,
虽然如果你是一个优秀的开发者,
噢~不是,应该是大神的开发者,
你也可以优化的没有一丝差异。
这里先额外提一句就是:
如果是团队开发,那队友都是水平参差不齐的,
很难做好优化工作,
就算是一个大神开发,
因为业务的多变,不当维护很难,
面对一些场景,可能不得不舍弃一些优化,
所以,不要想着MR能做到和Spark一样的水平,
那只是理想的国度,基本不存在的。
- 数据落地磁盘次数更少
除了shuffle会把数据落地磁盘,
MapReduce因为只有 map 和 reduce,
reduce之后的数据也是需要落地磁盘的,
但是很多时候,我们的数据可能是迭代进行的,
Reduce 结果是直接作为下一个任务的Map,
那么Spark的优势就体现出来了,
直接就是基于内存执行,完全不需要落地磁盘。
这也是Spark比MR快的一个最主要的原因,
在一些机器学习等迭代计算多的情况,
其速度是百倍于MR的~~~~
资源调度
这里不得不提一下的是:
MR的资源调度是细粒度调度的,
也就是说,他每个Job都要经历一次资源的申请到释放,
并且其执行的 Task 任务也是基于JVM 进程的。
而Sarpk则是粗粒度的资源调度,
其一个Application 只会进行一次资源申请,
在没有执行完所有任务,他是不会释放资源的,
并且其Task执行是基于更加轻量级的线程,
当我们处理数据的Task很多的时候,
这个节省的时间也是不可忽视的。
结束语
该文其实主要是以 DAG计算模型为主,
这也是在笔者看来Spark对于MR最重要的改变,
因为DAG的存在才有后来各种各样比MR高效的优化,
这里可能挖的其实还不够深,
如果有兴趣,欢迎你来进行补充和讨论。