Hadoop基础教程-第7章 MapReduce进阶(7.1 MapReduce过程)(草稿)

2023-05-16

第7章 MapReduce进阶


7.1 MapReduce过程

7.1.1 input

一般而言,数据文件都会上传到HDFS上,也就是说HDFS上的文件作为MapReduce的输入。已知block块大小是128M(Hadoop 2.x默认的blockSize是128MB,Hadoop 1.x默认的blockSize是64MB)。MapReduce计算框架首先会用InputFormat的子类FileInputFormat类对输入文件进行切分,形成输入分片(InputSplit)。每个InputSplit分片将作为一个Map任务的输入,输入分片(input split)存储的并非数据本身,而是一个分片长度和一个记录数据的位置的数组。也就是说,InputSplit只是对输入数据进行逻辑上切分,并不会将物理文件切分成片进行存储。

确定InputSplit的大小是个重要的问题。

(1)如果mapred-site.xml中没有设置分片的范围,InputSplit分片大小是由block块数决定的,即是InputSplit分片大小等于block块大小。比如把一个258MB的文件上传到HDFS上,默认block块大小是128MB,那么它就会被分成3个block块,与之对应产生3个InputSplit分片,所以最终会产生3个map任务。注意:第3个block块大小是128MB,但是该块中的文件只有只有2MB,而非128M一个块的大小。
(2)如果在mapred-site.xml中设置mapred.min.split.size和mapred.max.split.size,则可控制InputSplit的大小。那么InputSplit分片到底是多大呢?

minSize=max{minSplitSize,mapred.min.split.size} 
maxSize=mapred.max.split.size
splitSize=max{minSize,min{maxSize,blockSize}}

其中,参数mapred.min.split.size的默认值为1个字节,minSplitSize随着File Format的不同而不同。mapred.max.split.size默认为Long.MAX_VALUE = 9223372036854775807。
InputSplit分片大小的下限是max {mapred.min.split.size, minSplitSize},上限是mapred.max.split.size。

FileInputFormat类提供了computeSplitSize方法计算InputSplit的大小,代码如下:

 public List<InputSplit> getSplits(JobContext job) throws IOException {
      long minSize = Math.max(getFormatMinSplitSize(), getMinSplitSize(job));
      long maxSize = getMaxSplitSize(job);
      ...
      long splitSize = computeSplitSize(blockSize, minSize, maxSize);
      ...
  }

  protected long computeSplitSize(long blockSize, long minSize,long maxSize) {
    return Math.max(minSize, Math.min(maxSize, blockSize));
  }

由上面的InputSplit分片大小计算公式可知,一个InputSplit分片可以大于一个block块,也可以小于一个block块。对于Map任务来说,处理的单位是一个InputSplit。请注意InputSplit是一个逻辑概念,InputSplit所包含的数据仍然存储在HDFS的block块中
YARN在进行任务调度时,会优先考虑本节点的数据。如果本节点没有可处理的数据或者还需要其他节点的数据,Map任务就必须从其他节点将数据通过网络传递到本节点,性能受到影响。如果InputSplit的大小大于block块大小时,Map任务就必须从其他节点读取数据,这样就不能很好实现数据本地性。所以,InputSplit的大小尽量等于block块大小,以提高Map任务的数据本地性。

InputSplit的数量是文件大小除以splitSize。

7.1.2 Map输出

InputSplit将键值数据传给map方法处理后,输出中间结果到本地磁盘。在这个过程中,为了保证IO效率,采用了先写入内存的环形缓冲区,并做一次预排序。

  • 首先map输出到内存中的一个环状的内存缓冲区,如下图中“(1)”部分所示,缓冲区的大小默认为100MB(可通过修改配置项mpareduce.task.io.sort.mb进行修改)。
  • 然后,当写入内存缓冲区的大小到达一定比例时,默认为80%(可通过mapreduce.map.sort.spill.percent配置项修改),将启动一个溢写线程将内存缓冲区的内容溢写到磁盘(spill to disk),如下图“(2)”部分所示。这个溢写线程是独立的,不影响map向缓冲区写结果的线程。当溢写线程启动后,需要对80M的空间内的数据按照key进行排序。溢写线程会在磁盘中新建一个溢出写文件(图中“(2)”部分已经有了3个溢写出文件),溢写线程默认根据数据键值对溢写出文件进行分区(patition),接着后台线程将根据数据最终要传送到的Reduce把内存缓冲区中的数据写入溢出写文件对应分区。在每个patition分区,后台线程按键值进行内排序,此时如果有一个Combiner,则会在排序后的输出上运行。默认的patition分区算法是将每个键值对的键的Hash值与reducer数量进行模运算得到patition值。
  • 随着map处理,map输出数据增多,磁盘中溢写文件文件的数据也在增加。这就需要将磁盘中的多个小的溢写文件合并成一个大文件,如图中”(3)”部分所示。注意,合并后的大文件已经进行了分区,每个分区内进行了排序,该大文件就是Map任务的输出结果。
  • 为了提高磁盘IO性能,可以将Map输出进行压缩,这样磁盘书写熟读提高,可以介绍磁盘空间,减少传递给Reducer的数据量。注意,默认情况下,map输出是不压缩的,可以在mapred-site.xml文件中配置mapreduce.output.fileoutputformat.commpress值为true,即可开启压缩功能。

这里写图片描述

总结:map过程的输出是写入本地磁盘而不是HDFS,但是一开始数据并不是直接写入磁盘而是缓冲在内存中,缓存的好处就是减少磁盘I/O的开销,提高合并和排序的速度。又因为默认的内存缓冲大小是100M(当然这个是可以配置的),所以在编写map函数的时候要尽量减少内存的使用,为shuffle过程预留更多的内存,因为该过程是最耗时的过程。

7.1.3 Reducer输入 (Shuffle阶段)

MapReduce确保每个reducer的输入input都是按照key 排序的。Shuffler 就是mapper和reducer中间的一个步骤,也就是将map的输出转换为 reduce的输入的过程。在shuffle过程中,可以把mapper的输出按照某种key值重新切分和组合成n份,把key值符合某种范围的输送到特定的reducer端处理。shuffle是MapReduce运行的的核心,也是面试中经常被问到的地方。shuffle本意洗牌、混洗,下图是官方对Shuffle过程的描述。
这里写图片描述

这里写图片描述
Map输出结果时进行了Partitioner分区操作。其实Partitioner分区操作和map阶段的输入分片(Input split)很像,一个Partitioner对应一个reduce作业,如果我们mapreduce操作只有一个reduce操作,那么Partitioner就只有一个,如果我们有多个reduce操作,那么Partitioner对应的就会有多个,Partitioner因此就是reduce的输入分片,主要是根据实际key和value的值,根据实际业务类型或者为了更好的reduce负载均衡要求进行,这是提高reduce效率的一个关键所在。

一个Map任务的输出,可能被多个Reduce任务抓取。每个Reduce任务可能需要多个Map任务的输出作为其特殊的输入文件,而每个Map任务的完成时间可能不同,当有一个Map任务完成时,Reduce任务就开始运行。Reduce任务根据分区号在多个Map输出中抓取(fetch)对应分区的数据,这个过程也就是Shuffle的copy过程。复制操作时reduce会开启几个复制线程,这些线程默认个数是5个。这个复制过程和map写入磁盘过程类似,也有阀值和内存大小,阀值一样可以在配置文件里配置,而内存大小是直接使用reduce的tasktracker的内存大小,复制时候reduce还会进行排序操作和合并文件操作。
如果map输出很小,则会被复制到Reducer所在节点的内存缓冲区,缓冲区的大小可以通过mapred-site.xml文件中的mapreduce.reduce.shuffle.input.buffer.percent指定。一旦Reducer所在节点的内存缓冲区达到阀值,或者缓冲区中的文件数达到阀值,则合并溢写到磁盘。
如果map输出较大,则直接被复制到Reducer所在节点的磁盘中。
随着Reducer所在节点的磁盘中溢写文件增多,后台线程会将它们合并为更大且有序的文件。
当完成复制map输出,进入sort阶段。这个阶段通过归并排序逐步将多个map输出小文件合并成大文件。最后几个通过归并合并成的大文件作为reduce的输出。

当Reducer的输入文件确定后,整个Shuffle操作才最终结束。之后就是Reducer的执行了,最后Reducer会把结果存到HDFS上。

在Hadoop集群环境中,大部分map 任务与reduce任务的执行是在不同的节点上。当然很多情况下Reduce执行时需要跨节点去拉取其它节点上的map任务结果。如果集群正在运行的job有很多,那么task的正常执行对集群内部的网络资源消耗会很严重。这种网络消耗是正常的,我们不能限制,能做的就是最大化地减少不必要的消耗。还有在节点内,相比于内存,磁盘IO对job完成时间的影响也是可观的。从最基本的要求来说,我们对Shuffle过程的期望可以有:

  • 完整地从map task端拉取数据到reduce 端。
  • 在跨节点拉取数据时,尽可能地减少对带宽的不必要消耗。
  • 减少磁盘IO对task执行的影响。

7.1.4 排序

排序贯穿Map任务和Reduce任务,在MapReduce计算框架中,主要用到两种排序算法:快速排序和归并排序。在Map任务发生了2次排序,Reduce任务发生一次排序。
(1)第1次排序发生在Map输出的内存环形缓冲区,使用快速排序。当缓冲区达到阀值时,在溢写到磁盘之前,后台线程会将缓冲区的数据划分成相应分区,在每个分区中按照键值进行内排序。
(2)第2次排序是在Map任务输出的磁盘空间上将多个溢写文件归并成一个已分区且有序的输出文件。由于溢写文件已经经过一次排序,所以合并溢写文件时只需一次归并排序即可使输出文件整体有序。
(3)第3次排序发生在Shuffle阶段,将多个复制过来的Map输出文件进行归并,同样经过一次归并排序即可得到有序文件。

排序的逻辑:
《Hadoop权威指南》第3版292页已经给出了“控制排序顺序”:
Key的数据类型的排序逻辑是由RawComparator控制的,规则如下。
(1)若属性mapred.output.key.comparator.class已经被显式设置,或者通过Job类的setSortComparatorClass()方法进行设置,则使用该类的实例。
(2)否则,键必须是WritableComparable的子类,并使用针对该键类的已登记的Comparator。
(3)如果还没有已登记的Comparator,则使用RawComparator将字节流反序列化为一个对象,再由WritableComparable的compareTo()方法进行操作。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Hadoop基础教程-第7章 MapReduce进阶(7.1 MapReduce过程)(草稿) 的相关文章

  • 聊聊微服务之什么是微服务及其好处

    一 什么是微服务 微服务就是一些协同工作的小而自治的服务 很小 xff0c 专注于做好一件事 在单一模块系统中 xff0c 随着新功能的增加 xff0c 代码库会越来越大 时间久了代码库会变得非常庞大 xff0c 以至于在什么地方修改都很困
  • RestTemplate 使用详解

    一 简介 常见的http客户端请求工具 xff1a JDK 自带 HttpURLConnectionApache HttpClientOKHttp 以上 工具虽然常用 xff0c 但对于 RESTful 操作相对不是太友好 所以 xff0c
  • BigDecimal 你使用对了吗

    背景 从事金融相关项目 xff0c 对BigDecimal应该是再熟悉不过了 xff0c 也有很多人因为不知道 不了解或使用不当导致资损事件发生 所以 xff0c 如果你从事金融相关项目 xff0c 或者你的项目中涉及到金额的计算 xff0
  • MySQL 中截取字符串的方法

    LEFT str len 从左边开始截取 xff0c 如果字符串为 null 则返回null str xff1a 被截取字符串 xff1b len xff1a 截取长度 span class token keyword SELECT spa
  • Redis 阻塞原因

    Redis 是典型的单线程架构 xff0c 所有的读写操作都是在一条主线程中完成的 当Redis用于高并发场景时 xff0c 这条线程就变的极其重要 如果它出现阻塞 xff0c 就会对应用带来致命的问题 当 Redis 出现阻塞时 xff0
  • 【pcl入门教程系列】之点云Concatenate

    简要说明 点云拼接 Concatenate 是指将点云进行累加在一起 xff0c 只是累加的方式不太一样 一种是点云的字段与维度完全一致 xff0c 数量可以不同 xff0c 两部分点云相加 xff0c 点云的数量增加了 另一种是点云的字段
  • python多线程

    单线程 from time import ctime sleep def music for i in range 2 print 34 I was listening to music s 34 ctime sleep 1 def mov
  • Nginx下配置Https证书详细过程

    一 Http与Https的区别 HTTP xff1a 是互联网上应用最为广泛的一种网络协议 xff0c 是一个客户端和服务器端请求和应答的标准 xff08 TCP xff09 xff0c 用于从WWW服务器传输超文本到本地浏览器的传输协议
  • SLAM学习记录:全局定位之gps说明

    这段时间因为各种事情耽误了 xff0c 好久没有进行更新了 xff0c 惭愧 xff01 前段时间在研究cartographer的定位建图模块 xff0c 在停更的时间主要再研究如何改善定位建图的效果 xff0c 也有一定的成效 xff0c
  • Windows操作系统名称与版本号汇总

    查看Windows系统版本号 xff1a 1 cmd xff1a winver 2 cmd xff1a systeminfo findstr Build 3 运行 xff1a dxdiag xff0c 可查看D3D版本 Windows操作系
  • 使用Onos+Ovs+Docker+Veth建立拓扑(2)

    使用Onos 43 Ovs 43 Docker 43 Veth建立拓扑 xff08 2 xff09 说明 首先在宿主机上安装一个带内核模块的ovs xff0c 然后在docker中安装一个不带内核的 这句话非常重要 可能存在的问题 Dock
  • 子网掩码 与同一网段

    子网掩码是必填的 子网掩码的作用 xff0c 通俗一点就是 就是用来分割子网和区分那些ip是同一个网段的 xff0c 那些不是同一网段的 以前以为ip地址的第三组数字就是网段 xff0c 其实大错特错了 其实同一网段指的是IP地址和子网掩码
  • 【人脸检测】OpenCV中的Haar+Adaboost级联分类器分解(一):Haar特征介绍

    最近由于工作原因 xff0c 需要研究OpenCV中的Adaboost级联分类器 我阅读了OpenCV中所有相关得代码 xff0c 包括检测和训练部分 xff0c 发现目前OpenCV中的Adaboost级联分类器代码有以下2个特点 xff
  • 认识 UML 类关系——依赖、关联、聚合、组合、泛化

    文章目录 1 依赖 xff08 Dependency xff09 2 关联 xff08 Association xff09 3 聚合 xff08 Aggregation xff09 4 组合 xff08 复合 xff0c Compositi
  • 常用开发软件及网站

    常用开发软件及网站 点击查看
  • 电商模式术语:ABC、B2B、B2C、C2C、B2M、M2C、B2A、C2A、O2O

    电商模式分类详解 一 ABC 英文单词 xff1a Agent xff08 代理商 xff09 Business xff08 商家 xff09 Consumer xff08 消费者 xff09 ABC 模式是新型电子商务模式的一种 xff0
  • TkMapper(通用mapper)

    TkMapper的配置及使用 TkMapper主要是做单标查询 xff0c 复杂的多表查询我们还得自己写sql 官方文档 xff1a 点击查看使用的是Springboot框架使用的数据库表ums permision xff1a idpidn
  • python两个 list 获取交集,并集,差集的方法

    1 获取两个list 的交集 方法一 a 61 2 3 4 5 b 61 2 5 8 tmp 61 val for val in a if val in b 列表推导式求的两个列表的交集 print tmp 2 5 方法二 print li
  • 报错:EL1007E: Property or field 'name' cannot be found on null

    SpringBoot集成thymeleaf做开发遇到的错误 Caused by org springframework expression spel SpelEvaluationException EL1007E Property or
  • Docker-1.0>>>>>>初阶学习

    文章目录 Docker学习总结一 Docker的安装 xff1a 二 Docker常用命令1 帮助命令 xff1a 2 镜像命令 xff1a 3 容器命令 xff1a 三 镜像详解四 容器数据卷 xff08 持久化 xff0c 数据共享 x

随机推荐

  • 报错:iptables failed: iptables --wait -t nat -A DOCKER -p tcp -d 0/0 --dport 5000

    Docker启动容器报错 docker Error response from daemon driver failed programming external connectivity on endpoint myrabbit 详细信息
  • 报错:yum install 安装时报yum doesn't have enough cached data to continue

    yum install 安装时报错 One of the configured repositories failed 未知 and yum doesn t have enough cached data to continue At th
  • Logback和Log4j详解

    文章目录 日志框架前言 一 日志简介1 什么是日志 xff1f 2 日志的用途 xff1f 二 常用的日志框架1 日志门面2 logback xff08 更快的执行速度使其成为主流 xff09 2 1 引入依赖2 2 编写xml文件2 3
  • cpu占用过高解决方案实践

    今天在查看项目服务器的时候 xff0c 发现cpu一直占用99 多 xff0c 于是就有了这篇文章 1 找到占用cpu高的进程 通过top命令来查看cpu占用高的进程有哪些 xff0c 如图 xff1a top 这里的pid代表的就是进程i
  • Java Stream流常用功能示例

    Steam流是Java8的新特性 xff0c 今个工作中经常用的功能写法 按条件过滤 collect span class token punctuation span span class token function stream sp
  • Mysql-->Binlog的查看

    一 使用Navicat查看binlog信息 1 查看binlog的信息 span class token keyword show span variables span class token operator like span spa
  • Linux开发环境配置---Java、Maven、Git和Nodejs

    Linux开发环境配置 1 Java环境 span class token comment 1 下载Java软件包 xff0c orcal或者openjdk都可以 xff0c 并上传到linux服务器 span span class tok
  • Linux下安装及简单使用nmap

    nmap是一款非常实用的扫描工具 xff0c 适用于linux windows mac三大主流平台 小编使用centos编译安装nmap 7 01版本 下载包 xff1a wget http nmap span class hljs pre
  • VNC server简单配置vnc

    linux 下VNC的配置 下面的命令可以结合远程shell 来进行 进程查找 xff1a ps ef grep i vnc 系统中一共有两个vnc xff1a 一个是系统管理自带的路径为 xff1a system gt perferenc
  • 元学习

    元学习是要学会任务中的特征表示 xff0c 从而在新任务上泛化 元学习主要解决的是学会如何学习的问题 元学习主要包括 xff1a zero shot One shot Few shot learning 元学习的主要方法包括 xff1a 基
  • windows media Foundation

    转自 xff1a https docs microsoft com en us windows desktop medfound microsoft media foundation sdk Microsoft Media Foundati
  • vscode nodemon打断点

    span class token number 1 span xff0c 修改 span class token keyword package span span class token punctuation span json spa
  • putty远程连接centos7的问题(time out)

    我在使用putty远程连接centos7时 xff0c 碰见了time out以及connection refused 的问题 现在总结一下 xff0c 以免之后再被绊倒 一 xff0c time out 问题分析 xff1a 我遇到的ti
  • Marvell 98DX3236系列交换机Uboot及内核文件烧写

    1 开发环境 开发板硬件相关 1 交换机开发板型号 RD XC3 24G4XG B 2 交换机CPU型号 98DX3236 3 交换机PHY芯片型号 88E1680 开发板软件相关 1 CPLD LC4032V 程序 ac3 24p jed
  • k8s学习笔记-部署Flannel网络

    主机列表 本次实验选择5台主机 xff0c 3台作为master主机 xff0c 2台作为node节点 节点ipOS版本hostname f安装软件192 168 0 1RHEL7 4k8s master01docker etcd flan
  • ROS教程四——编写Publisher和Subscriber节点(C++篇)

    本教程介绍如何使用C 43 43 编写发布者和订阅者节点 1 编写 Publisher Node 节点 是连接到ROS网络的可执行文件的ROS术语 现在将创建一个发布者 xff08 publisher talker xff09 节点 xff
  • 在Ubuntu系统中设置中文!!!

    建议在观看本篇前先观看上一篇修改Ubuntu系统下载源 Ubuntu系统下面可以配置中文 1 xff0c 设置 gt 系统设置 2 xff0c 选择区域与语言 单击管理已安装的语言 3 xff0c 单击添加或者删除语言 4 xff0c 选择
  • 视觉问答项目

    视觉问答项目 1 项目地址 本笔记项目包括如下 xff1a MCAN Deep Modular Co Attention Networks for Visual Question Answering 用于VQA的深层模块化的协同注意力网络
  • 基于形状的模板匹配(Shape-Based)

    称为基于边缘方向梯度的匹配 xff0c 是一种最常用也是最前沿的模板匹配算法 xff08 一 xff09 根本思想 以物体边缘的梯度相关性作为匹配标准 xff08 二 xff09 原理 提取ROI中的边缘特征 xff0c 结合灰度信息创建模
  • Hadoop基础教程-第7章 MapReduce进阶(7.1 MapReduce过程)(草稿)

    第7章 MapReduce进阶 7 1 MapReduce过程 7 1 1 input 一般而言 xff0c 数据文件都会上传到HDFS上 xff0c 也就是说HDFS上的文件作为MapReduce的输入 已知block块大小是128M x