当前位置: 首页 > news >正文

MapReduce的过程(2)

MapReduce的编程思想(1)

MapReduce的过程(2)

1. MapReduce从输入到输出

  • 一个MapReduce的作业经过了input、map、combine、reduce、output五个阶段。
  • 其中combine阶段不一定发生,map输出的中间结果被分发到reduce的过程称为shuffle(数据混洗)。
  • shuffle阶段会发生copy(复制)和sort(排序)。
  • Reduce任务默认在Map任务数量完成5%才开始启动。

2. input

  • HDFS上的文件作为MapReduce的输入,org.apache.hadoop.mapreduce.InputFormat类的子类FileInputFormat类将作为输入的HDFS上的文件切分形成输入分片(InputSplit),每个InputSplit将作为一个Map任务的输入,再将InputSplit解析为键值对。
  • InputSplit只是对数据逻辑上的分片,不会在磁盘上将文件切分、存储。 - 元数据信息由文件路径、文件开始的位置、文件结束的位置、数据块所在的host4部分组成。
  • InputSplit的数量=文件大小/InputSplitSize
  • 尽量使InputSplit的大小和块的大小相同,从而提高Map任务计算的数据本地性。

3. Map和中间结果的输出

  • Map函数产生的输出时,为了保证I/O效率,采取了先写到内存的环形缓存区,并做一次预排序。
  • 每个Map任务都有一个内存缓冲区(默认100M),用于存储map函数的输出。
  • 一旦内存缓存区达到阀值,就会新建一个益处写文件,因此在Map任务写完其最后一个输出记录之后,会有若干个溢出写文件。
  • 在Map任务完成之前,溢出写文件被合并成一个已分区且已排序的输出文件为map输出的中间结果。也是Map任务的输出结果。
  • combine若指定,会在输出文件写到磁盘之前运行,使得map输出的中间结果更紧凑,使得写到本地磁盘和出给Reduce的数据更少。
  • Map输出的中间结果存储格式为IFile,支持压缩的存储格式。
  • Reduce通过HTTP方式得到输出文件的分区。

4. shuffle

  • shuffle代表map函数产生输出到reduce的消化输入的整个过程。
  • 在shuffle过程中,Map任务就处理的只是一个InputSplit,而Reduce任务处理的是所有Map任务同一个分区的中间结果。
  • shuffle的Copy阶段
    • 当一个Map任务完成时,Reduce任务就开始复制其输出。
  • shuffle的Sort阶段
    • 合并map的输出文件,并维持排序,做归并排序,排序过程循环进行。

5. Reduce及最后结果的输出

  • Reduce阶段操作实质上就是对经过shuffle处理后的文件调用reduce函数处理,reduce输出一般为HDFS。

6. Sort

  • MapReduce计算框架中,主要两种排序算法:快速排序和归并排序。
  • MapReduce过程中,共发生三次排序:
    • 第一次排序是在内存缓冲区做的内排序,使用的算法是快速排序。
    • 第二次和第三次排序都是文件合并阶段发生的,使用的是归并排序。

7. MapReduce作业进度组成

  • Map即Map,如map50%reduce0%,表示Map任务已经处理作业输入文件的60%。
  • Reduce阶段,分为copy、sort、reduce且各占1/3。如,reduce处理了2/3的输入,则整个reduce进度为1/3+1/3+1/3*(2/3)=5/9,因为reduce开始处理输入时,copy和sort已经完成。

MapReduce的编程思想(1)

MapReduce的过程(2)

相关文章:

  • Android 双卡双待识别
  • 房坑
  • 该不该用inline-block取代float? inline和float的区别?
  • hibernate--联合主键--XML
  • 动态素组(ArrayList)
  • cssReset - css初始化
  • KeyMob移动广告聚合平台 开发者赚钱平台
  • Lua非常有用的工具——递归打印表数据
  • C风格字符串
  • UVa 10924-Prime Words
  • linux Shell编程
  • Vue--数据传输
  • CentOS 6.4 yum快速搭建Zabbix 2.2版本(中文)
  • python excel 转 csv
  • Android自定义控件实现简单的轮播图控件
  • avalon2.2的VM生成过程
  • CEF与代理
  • Docker容器管理
  • extjs4学习之配置
  • Git的一些常用操作
  • Java 23种设计模式 之单例模式 7种实现方式
  • JAVA 学习IO流
  • java中具有继承关系的类及其对象初始化顺序
  • laravel 用artisan创建自己的模板
  • LeetCode29.两数相除 JavaScript
  • linux安装openssl、swoole等扩展的具体步骤
  • Puppeteer:浏览器控制器
  • Redux 中间件分析
  • 机器学习学习笔记一
  • 前嗅ForeSpider教程:创建模板
  • 算法系列——算法入门之递归分而治之思想的实现
  • # 日期待t_最值得等的SUV奥迪Q9:空间比MPV还大,或搭4.0T,香
  • ${ }的特别功能
  • (1)安装hadoop之虚拟机准备(配置IP与主机名)
  • (定时器/计数器)中断系统(详解与使用)
  • (分布式缓存)Redis分片集群
  • (附源码)ssm经济信息门户网站 毕业设计 141634
  • (过滤器)Filter和(监听器)listener
  • (论文阅读11/100)Fast R-CNN
  • (十二)python网络爬虫(理论+实战)——实战:使用BeautfulSoup解析baidu热搜新闻数据
  • (十二)springboot实战——SSE服务推送事件案例实现
  • (一)RocketMQ初步认识
  • (原创)攻击方式学习之(4) - 拒绝服务(DOS/DDOS/DRDOS)
  • (终章)[图像识别]13.OpenCV案例 自定义训练集分类器物体检测
  • (转)Android中使用ormlite实现持久化(一)--HelloOrmLite
  • (转)Mysql的优化设置
  • .mat 文件的加载与创建 矩阵变图像? ∈ Matlab 使用笔记
  • .NET/C# 利用 Walterlv.WeakEvents 高性能地定义和使用弱事件
  • .NET单元测试
  • .vue文件怎么使用_我在项目中是这样配置Vue的
  • @CacheInvalidate(name = “xxx“, key = “#results.![a+b]“,multi = true)是什么意思
  • @vue/cli脚手架
  • [.NET]桃源网络硬盘 v7.4
  • [2016.7 test.5] T1
  • [2019.2.28]BZOJ4033 [HAOI2015]树上染色