谈谈Hadoop MapReduce和Spark MR实现
谈谈MapReduce的概念、Hadoop MapReduce和Spark基于MR的实现
什么是MapReduce?
MapReduce是一种分布式海量数据处理的编程模型,用于大规模数据集的并行运算。
有以下几个特点:
分而治之,并行处理。
抽象了map和reduce的计算流程,对于分布式存储的数据可以并行的进行map处理,之后在reduce端对map结果进行汇总。
移动计算而非移动数据。
数据的计算传输需要大量的磁盘和网络IO。MapReduce会尽量在数据存储的节点执行计算,以减少不必要的开销。
Hadoop MapReduce
我们常说的MapReduce就是Hadoop MapReduce。
Hadoop MapReduce作业被分成一系列运行在分布式集群中的map任务和reduce任务,每个任务都工作在被指定的小的数据自己上,因此负载是遍布集群中各个节点上的。
map任务负责数据的载入、解析、转换和过滤。MapReduce作业的输入是一系列储存在HDFS中的文件。map任务的输出被称为中间键和中间值,会被发送到reduce端进行后续处理。
每个reduce任务负责处理map任务输出结果的一个子集。MapReduce确保每个reduce的输入都是按键排序的。
系统执行排序、将map输出作为输入传递给reduce的过程称为shuffle。shuffle是MapReduce的心脏,关于shuffle详情请自己搜索。
Pig和Hive都是对MapReduce更高层次的抽象,他们都会将高级的语言翻译成一组MapReduce作业,执行计算。
Spark基于MapReduce实现
Spark通过借鉴Hadoop MapReduce,继承了其分布式并行计算的优点,并改进了MapReduce的一些缺点。
Spark并行处理主要基于其内部RDD和DAG来实现。
RDD(弹性分布式数据集):作为Spark基本编程模型,它是MapReduce模型的扩展和延伸。其运用高效的数据共享概念(分区)和类似MapReduce的操作方式,使得并行计算能高效的进行。
DAG(有向无环图):Spark使用DAG描述了RDD的依赖关系(宽/窄依赖),维护了RDD间的血缘关系,减少了迭代过程中数据的落地,提高了处理效率。
我们提交一个Spark代码,大概执行流程如下:
- 根据行动操作划分job
- 每个job内部根据宽依赖划分stage。stage分为ShuffleMapStage和ResultStage。
- 执行stage内部的task。每个stage内部会有许多task,task是Spark的最小执行单元,task的数量取决于RDD的分区数量,spark会优先选择数据所在的节点启动task。task分为ShuffleMapTask和ResultTask。ShuffleMapTask返回输出结果相关信息供后续task使用;ResultTask根据结果大小,会选择丢弃或者返回给Driver端。
- ......
从上面流程,我们可以简单总结:
- Spark通过RDD的分区,来保证MR中的并行处理
- Spark通过DAG宽窄依赖,优化了task计算流程,减少了数据落盘的次数
- Spark中也会保障数据本地化,来实现移动计算而非移动数据。
Spark与MapReduce比较
- Spark会中间数据放在内存中,迭代运算效率高。MapReduce的中间计算结果保存在磁盘上,势必影响整体的运行速度。
- Spark的容错性高。Spark的RDD可以根据血统来重新生成数据,也可以通过checkpoint来实现容错。
- Spark更加的通用。Spark提供了许多的算子,可以更便捷的处理数据。
参考
《MapReduce设计模式》
《Hadoop权威指南》
《图解Spark核心技术与案例实践》
参考书籍+个人理解,如有偏差,欢迎交流。
谈谈Hadoop MapReduce和Spark MR实现的更多相关文章
- Hadoop MapReduce概念学习系列之mr程序组件全貌(二十)
其实啊,spilt是,控制Apache Hadoop Mapreduce的map并发任务数,详细见http://www.cnblogs.com/zlslch/p/5713652.html map,是m ...
- Hadoop MapReduce Task的进程模型与Spark Task的线程模型
Hadoop的MapReduce的Map Task和Reduce Task都是进程级别的:而Spark Task则是基于线程模型的. 多进程模型和多线程模型 所谓的多进程模型和多线程模型,指的是同一个 ...
- hadoop的mapReduce和Spark的shuffle过程的详解与对比及优化
https://blog.csdn.net/u010697988/article/details/70173104 大数据的分布式计算框架目前使用的最多的就是hadoop的mapReduce和Spar ...
- 关于hadoop3.x MR报错:找不到或无法加载主类 org.apache.hadoop.mapreduce.v2.app.MRAppMaster
用的apache Hadoop3.X,今天运行MR报错: 找不到或无法加载主类 org.apache.hadoop.mapreduce.v2.app.MRAppMaster 关键需要配置两个配置:ma ...
- hadoop MapReduce Yarn运行机制
原 Hadoop MapReduce 框架的问题 原hadoop的MapReduce框架图 从上图中可以清楚的看出原 MapReduce 程序的流程及设计思路: 首先用户程序 (JobClient) ...
- Hadoop MapReduce编程学习
一直在搞spark,也没时间弄hadoop,不过Hadoop基本的编程我觉得我还是要会吧,看到一篇不错的文章,不过应该应用于hadoop2.0以前,因为代码中有 conf.set("map ...
- 从分治算法到 Hadoop MapReduce
从分治算法说起 要说 Hadoop MapReduce 就不得不说分治算法,而分治算法其实说白了,就是四个字 分而治之 .其实就是将一个复杂的问题分解成多组相同或类似的子问题,对这些子问题再分,然后再 ...
- MapReduce和Spark写入Hbase多表总结
作者:Syn良子 出处:http://www.cnblogs.com/cssdongl 转载请注明出处 大家都知道用mapreduce或者spark写入已知的hbase中的表时,直接在mapreduc ...
- cloudera learning8:MapReduce and Spark
YARN:Yet Another Resource Negotiator, Hadoop集群的资源管理器,可以对运行在Hadoop上的MapReduce V2,Spark,Impala等进行内存和CP ...
随机推荐
- 每日一题 - 剑指 Offer 53 - I. 在排序数组中查找数字 I
题目信息 时间: 2019-07-04 题目链接:Leetcode tag:二分查找 哈希表 难易程度:简单 题目描述: 统计一个数字在排序数组中出现的次数. 示例1: 输入: nums = [5,7 ...
- 【线型DP】洛谷P2066 机器分配
[线型DP]洛谷P2066 机器分配 标签(空格分隔): 线型DP [题目] 题目描述 总公司拥有高效设备M台,准备分给下属的N个分公司.各分公司若获得这些设备,可以为国家提供一定的盈利.问:如何分配 ...
- STL测试2)计算器简单实现
实现一个基本的计算器来计算一个简单的字符串表达式的值. 字符串表达式可以包含左括号 ( ,右括号 ),加号 + ,减号 -,非负整数和空格 . 示例 1: 输入: "1 + 1" ...
- Spring的学习与实战
目录 一.Spring起步 学习路线图 Spring的基础知识 什么是Spring Spring框架核心模块 SpringBoot 第一个Spring应用DEMO 编写自己的第一个SpringMVC例 ...
- Linux系统中到底应该怎么理解系统的平均负载
02 | 基础篇:到底应该怎么理解“平均负载”? 每次发现系统变慢时,我们通常做的第一件事,就是执行 top 或者 uptime 命令,来了解系统的负载情况.比如像下面这样,我在命令行里输入了 upt ...
- 数据可视化之powerBI基础(九)Power BI中的“新表”,你会用吗?
https://zhuanlan.zhihu.com/p/64413703 通常情况下,在PowerBI进行分析的各种数据表都是从外部的各种数据源导入进来的,但并不总是如此,某些情况下在PowerBI ...
- Python之爬虫(二十四) 爬虫与反爬虫大战
爬虫与发爬虫的厮杀,一方为了拿到数据,一方为了防止爬虫拿到数据,谁是最后的赢家? 重新理解爬虫中的一些概念 爬虫:自动获取网站数据的程序反爬虫:使用技术手段防止爬虫程序爬取数据误伤:反爬虫技术将普通用 ...
- .NET Core CLI 的性能诊断工具介绍
前言 开发人员的.NET Core项目上线后,经常会出现各种问题,内存泄漏,CPU 100%,处理时间长等, 这个时候就需要快速并准确的发现问题,并解决问题, 除了项目本身的日志记录外,NET Cor ...
- 事件的event对象基本解释
事件流: 描述的是在页面中接受事件的顺序主要分为两种: 事件冒泡.事件捕获 事件event对象:1. type 获取事件类型2. target获取事件目标3. stopPropagation() 阻止 ...
- Babel:下一代Javascript语法编译器
定义 Babel是一个Javascript的编译器,通过它你可以将一些新版本的ECMAScript语法转换成低版本的语法.以便能够在低版本的浏览器或者其它环境平稳运行. 截至目前笔者写这篇文章的时候, ...