计算的速度是取决于计算机本身的计算能力的。 并且目前来看,所有的计算机计算都是基于内存的(如果有不是的,请原谅我的孤陋寡闻...), 也就是说 MR 和 Spark 是没有区别的。
我们都知道,不管是Spark 还是 MR, 其理论依据都是 一篇名为 MapReduce 的论文 那么对于 Map 和 Reduce 两个阶段,其都是会产生 Shuffle 的, 而Shuffle会使得数据落地到磁盘, 相比于内存计算,磁盘的读写一般是要慢很多的, 当然不要抬杠说一些非常复杂的计算逻辑噢~~~ 所以 Shuffle 也是影响速度的一个重要因素
Shuffle 方式或者说算法,其实二者差别也不大, 因为理论依据一样,所以理论上, 二者在这一块基本不会拉开差距,
上面说了看似废话的两点, 但是还是得要说明,防止一些先入为主的错误观念。 那就是Spark的计算模型 DAG, 下面我们以Spark的视角来看DAG的优势。
因为DAG的存在, 是的 Spark 编程比MR方便快捷, 也更加的简单了, 在我看来这也是从MR转Spark的一个非常重要的一点, 谁也不会否认,用了Spark,真的不想再去编程MR了。
因为DAG的存在, 使得我们可以把 各种业务 任意组合, 好处是显而易见的:
这里先额外提一句就是: 如果是团队开发,那队友都是水平参差不齐的, 很难做好优化工作, 就算是一个大神开发, 因为业务的多变,不当维护很难, 面对一些场景,可能不得不舍弃一些优化, 所以,不要想着MR能做到和Spark一样的水平, 那只是理想的国度,基本不存在的。
这里不得不提一下的是: MR的资源调度是细粒度调度的, 也就是说,他每个Job都要经历一次资源的申请到释放, 并且其执行的 Task 任务也是基于JVM 进程的。
而Sarpk则是粗粒度的资源调度, 其一个Application 只会进行一次资源申请, 在没有执行完所有任务,他是不会释放资源的, 并且其Task执行是基于更加轻量级的线程, 当我们处理数据的Task很多的时候, 这个节省的时间也是不可忽视的。
该文其实主要是以 DAG计算模型为主, 这也是在笔者看来Spark对于MR最重要的改变, 因为DAG的存在才有后来各种各样比MR高效的优化, 这里可能挖的其实还不够深, 如果有兴趣,欢迎你来进行补充和讨论。