前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >MapReduce快速入门系列(11) | MapTask,ReduceTask以及MapReduce运行机制详解

MapReduce快速入门系列(11) | MapTask,ReduceTask以及MapReduce运行机制详解

作者头像
不温卜火
发布于 2020-10-28 07:27:09
发布于 2020-10-28 07:27:09
1.4K111
代码可运行
举报
文章被收录于专栏:不温卜火不温卜火
运行总次数:1
代码可运行

前面我们讲解了MapReduce的Shuffle机制,那么这篇文章博主继续为大家讲解MapTask,ReduceTask和MapReduce运行机制。

一. MapTask运行机制详解以及Map任务的并行度

  整个Map阶段流程大体如上图所示。简单概述:inputFile通过split被逻辑切分为多个split文件,通过Record按行读取内容给map(用户自己实现的)进行处理,数据被map处理结束之后交给OutputCollector收集器,对其结果key进行分区(默认使用hash分区),然后写入buffer,每个map task都有一个内存缓冲区,存储着map的输出结果,当缓冲区快满的时候需要将缓冲区的数据以一个临时文件的方式存放到磁盘,当整个map task结束后再对磁盘中这个map task产生的所有临时文件做合并,生成最终的正式输出文件,然后等待reduce task来拉数据。 详细步骤: 1、首先,读取数据组件InputFormat(默认TextInputFormat)会通过getSplits方法对输入目录中文件进行逻辑切片规划得到splits,有多少个split就对应启动多少个MapTask。默认情况下split与block的对应关系默认是一对一。 2、将输入文件切分为splits之后,由RecordReader对象(默认LineRecordReader)进行读取,以\n作为分隔符,读取一行数据,返回<key,value>。Key表示每行首字符偏移值,value表示这一行文本内容。 3、读取split返回<key,value>,进入用户自己继承的Mapper类中,执行用户重写的map函数。RecordReader读取一行用户重写的map调用一次,并输出一个<key,value>。 4、Map输出的数据会写入内存,内存中这片区域叫做环形缓冲区,缓冲区的作用是批量收集map结果,减少磁盘IO的影响。key/value对以及Partition的结果都会被写入缓冲区。当然写入之前,key与value值都会被序列化成字节数组。 环形缓冲区其实是一个数组,数组中存放着key、value的序列化数据和key、value的元数据信息,包括partition、key的起始位置、value的起始位置以及value的长度。环形结构是一个抽象概念。 缓冲区是有大小限制,默认是100MB。当map task的输出结果很多时,就可能会撑爆内存,所以需要在一定条件下将缓冲区中的数据临时写入磁盘,然后重新利用这块缓冲区。这个从内存往磁盘写数据的过程被称为Spill,中文可译为溢写。这个溢写是由单独线程来完成,不影响往缓冲区写map结果的线程。溢写线程启动时不应该阻止map的结果输出,所以整个缓冲区有个溢写的比例spill.percent。这个比例默认是0.8,也就是当缓冲区的数据已经达到阈值(buffer size * spill percent = 100MB * 0.8 = 80MB),溢写线程启动,锁定这80MB的内存,执行溢写过程。Map task的输出结果还可以往剩下的20MB内存中写,互不影响。 5、合并溢写文件:每次溢写会在磁盘上生成一个临时文件(写之前判断是否有combiner),如果map的输出结果真的很大,有多次这样的溢写发生,磁盘上相应的就会有多个临时文件存在。当整个数据处理结束之后开始对磁盘中的临时文件进行merge合并,因为最终的文件只有一个,写入磁盘,并且为这个文件提供了一个索引文件,以记录每个reduce对应数据的偏移量。 至此map整个阶段结束。

mapTask的一些基础设置配置(mapred-site.xml): 设置一:设置环型缓冲区的内存值大小(默认设置如下) mapreduce.task.io.sort.mb 100

设置二:设置溢写百分比(默认设置如下) mapreduce.map.sort.spill.percent 0.80

设置三:设置溢写数据目录(默认设置) mapreduce.cluster.local.dir ${hadoop.tmp.dir}/mapred/local

设置四:设置一次最多合并多少个溢写文件(默认设置如下) mapreduce.task.io.sort.factor 10

二. ReduceTask 工作机制以及reduceTask的并行度

  Reduce大致分为copy、sort、reduce三个阶段,重点在前两个阶段。copy阶段包含一个eventFetcher来获取已完成的map列表,由Fetcher线程去copy数据,在此过程中会启动两个merge线程,分别为inMemoryMerger和onDiskMerger,分别将内存中的数据merge到磁盘和将磁盘中的数据进行merge。待数据copy完成之后,copy阶段就完成了,开始进行sort阶段,sort阶段主要是执行finalMerge操作,纯粹的sort阶段,完成之后就是reduce阶段,调用用户定义的reduce函数进行处理。

详细步骤: 1、Copy阶段,简单地拉取数据。Reduce进程启动一些数据copy线程(Fetcher),通过HTTP方式请求maptask获取属于自己的文件。 2、Merge阶段。这里的merge如map端的merge动作,只是数组中存放的是不同map端copy来的数值。Copy过来的数据会先放入内存缓冲区中,这里的缓冲区大小要比map端的更为灵活。merge有三种形式:内存到内存;内存到磁盘;磁盘到磁盘。默认情况下第一种形式不启用。当内存中的数据量到达一定阈值,就启动内存到磁盘的merge。与map 端类似,这也是溢写的过程,这个过程中如果你设置有Combiner,也是会启用的,然后在磁盘中生成了众多的溢写文件。第二种merge方式一直在运行,直到没有map端的数据时才结束,然后启动第三种磁盘到磁盘的merge方式生成最终的文件。 3、合并排序。把分散的数据合并成一个大的数据后,还会再对合并后的数据排序。 4、对排序后的键值对调用reduce方法,键相等的键值对调用一次reduce方法,每次调用会产生零个或者多个键值对,最后把这些输出的键值对写入到HDFS文件中。

三. MapReduceshuffle过程

  map阶段处理的数据如何传递给reduce阶段,是MapReduce框架中最关键的一个流程,这个流程就叫shuffle。   shuffle: 洗牌、发牌——(核心机制:数据分区,排序,分组,规约,合并等过程)。

  shuffle是Mapreduce的核心,它分布在Mapreduce的map阶段和reduce阶段。一般把从Map产生输出开始到Reduce取得数据作为输入之前的过程称作shuffle。 1、Collect阶段:将MapTask的结果输出到默认大小为100M的环形缓冲区,保存的是key/value,Partition分区信息等。 2、Spill阶段:当内存中的数据量达到一定的阀值的时候,就会将数据写入本地磁盘,在将数据写入磁盘之前需要对数据进行一次排序的操作,如果配置了combiner,还会将有相同分区号和key的数据进行排序。 3、Merge阶段:把所有溢出的临时文件进行一次合并操作,以确保一个MapTask最终只产生一个中间数据文件。 4、Copy阶段:ReduceTask启动Fetcher线程到已经完成MapTask的节点上复制一份属于自己的数据,这些数据默认会保存在内存的缓冲区中,当内存的缓冲区达到一定的阀值的时候,就会将数据写到磁盘之上。 5、Merge阶段:在ReduceTask远程复制数据的同时,会在后台开启两个线程对内存到本地的数据文件进行合并操作。 6、Sort阶段:在对数据进行合并的同时,会进行排序操作,由于MapTask阶段已经对数据进行了局部的排序,ReduceTask只需保证Copy的数据的最终整体有效性即可。   Shuffle中的缓冲区大小会影响到mapreduce程序的执行效率,原则上说,缓冲区越大,磁盘io的次数越少,执行速度就越快   缓冲区的大小可以通过参数调整, 参数:mapreduce.task.io.sort.mb 默认100M

四. MapReduce总体工作机制

  • 1. Map到Reduce内存角度宏观流程
  • 2. Map到reduce处理流程角度宏观步骤

1、map逻辑完之后,将map的每条结果通过context.write进行collect数据收集。在collect中,会先对其进行分区处理,默认使用HashPartitioner。 2.MapReduce提供Partitioner接口,它的作用就是根据key或value及reduce的数量来决定当前的这对输出数据最终应该交由哪个reduce task处理。默认对key hash后再以reduce task数量取模。默认的取模方式只是为了平均reduce的处理能力,如果用户自己对Partitioner有需求,可以订制并设置到job上。 3.当溢写线程启动后,需要对这80MB空间内的key做排序(Sort)。排序是MapReduce模型默认的行为,这里的排序也是对序列化的字节做的排序。 4.如果job设置过Combiner,那么现在就是使用Combiner的时候了。将有相同key的key/value对的value加起来,减少溢写到磁盘的数据量。Combiner会优化MapReduce的中间结果,所以它在整个模型中会多次使用。 5.哪些场景才能使用Combiner呢?从这里分析,Combiner的输出是Reducer的输入,Combiner绝不能改变最终的计算结果。Combiner只应该用于那种Reduce的输入key/value与输出key/value类型完全一致,且不影响最终结果的场景。比如累加,最大值等(求平均值绝不能用Combiner)。Combiner的使用一定得慎重,如果用好,它对job执行效率有帮助,反之会影响reduce的最终结果。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2020/04/28 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
11 条评论
热度
最新
请问腾讯云的terraform能技术支持一下吗,在使用terraform进行腾讯云资源管理的时候遇到一些问题,Q1242108463
请问腾讯云的terraform能技术支持一下吗,在使用terraform进行腾讯云资源管理的时候遇到一些问题,Q1242108463
回复回复点赞举报
由浅入深,娓娓道来,必须赞!
由浅入深,娓娓道来,必须赞!
回复回复点赞举报
小编写的太详细了!非常棒,良心云!
小编写的太详细了!非常棒,良心云!
回复回复点赞举报
了解了一些Terraform,Terraform是一款基于Golang的开源的资源编排工具,可以让用户管理配置任何基础架构,可以管理公有云和私有云服务的基础架构,也可以管理外部服务。腾讯云的老用户了,尤其喜欢腾讯云的控制台架构
了解了一些Terraform,Terraform是一款基于Golang的开源的资源编排工具,可以让用户管理配置任何基础架构,可以管理公有云和私有云服务的基础架构,也可以管理外部服务。腾讯云的老用户了,尤其喜欢腾讯云的控制台架构
回复回复点赞举报
一家云服务商有便捷易操作,直观,功能强大的控制台无疑会吸引大量用户,我个人最喜欢是腾讯云的控制台,简单的又不失美观
一家云服务商有便捷易操作,直观,功能强大的控制台无疑会吸引大量用户,我个人最喜欢是腾讯云的控制台,简单的又不失美观
回复回复点赞举报
良心云大法好 期待
良心云大法好 期待
回复回复点赞举报
简洁,直观,强大,无疑是最受喜欢
简洁,直观,强大,无疑是最受喜欢
回复回复点赞举报
一家云服务商有便捷易操作,直观,功能强大的控制台无疑会吸引大量用户
一家云服务商有便捷易操作,直观,功能强大的控制台无疑会吸引大量用户
回复回复点赞举报
资源CURD的实现的功能貌似有点单一,一般对资源的管控都有这相对严格的限制条件
资源CURD的实现的功能貌似有点单一,一般对资源的管控都有这相对严格的限制条件
回复回复点赞举报
腾讯、阿里、百度、京东、华为都用过,但是最喜欢的还是腾讯云,莫过于其“控制台”的构架及适用舒适。
腾讯、阿里、百度、京东、华为都用过,但是最喜欢的还是腾讯云,莫过于其“控制台”的构架及适用舒适。
回复回复点赞举报
加载更多
推荐阅读
编辑精选文章
换一批
如何把控制台上已有的资源导入terraform
对于老用户,常常有把控制台上已有的资源导入terraform的需求。本篇以把控制台上已有的eip资源为例,介绍如何导入已有资源到terraform编排中。同时将该资源与tf中创建的NAT网关相绑定。
王罡
2019/11/22
3.9K0
如何把控制台上已有的资源导入terraform
ES日志存储以及备份压缩到COS
导语 为了满足用户日益增长的日志存储大小,不影响用户的写入和查询性能。满足不同用户写入流量。同时用户日志长期保存,日志存储比较占用空间和成本。ES集群规格配置高,消耗资源和成本。我们基于Go语言设计了一个多用户多ES集群,日志备份到cos节省成本的方案。本篇实践基于Go语言编程。 索引设计 为了防止单个索引不断增加。影响ES集群查询写入性能,ES 集群的索引设计主要采取如下方式: 1. 租户分离:将索引按照租户进行分离,避免不同租户之间的数据混淆,提高 ES 集群的数据安全性和隔离性。 2. 按月分割:将索
云存储
2023/04/18
6700
ES日志存储以及备份压缩到COS
terraform 入门:创建腾讯云 k8s 集群
本文适合不喜欢在浏览器中点点点,并刚刚入门或者想要入门 terraform 的小伙伴。
谢正伟
2021/08/05
4.1K0
terraform 入门:创建腾讯云 k8s 集群
Terraform系列二腾讯云CVM进一步相关玩法
紧接Terraform系列一腾讯云CVM相关简单创建。准备围绕着cvm先熟悉一下基本的流程。比如:系统盘扩容,挂载数据盘,帐号密钥ssh-key,绑定公网ip.研究一下官方文档体验一下!
对你无可奈何
2022/03/31
2.6K1
怎样用terraform管理现存资源
通过阅读前面几篇文章,希望大家了解了基础架构及代码的基本概念,以及如何使用packer和terraform在腾讯云上进行新云资源的高效编排。但是在现实世界里,云管理团队还要管理以前那些没有通过terraform管理的资源,本文会作出一个通用流程,方便大家使用。
刘宇雷
2019/08/21
3.3K0
怎样用terraform管理现存资源
如何高效的进行腾讯云上的资源编排,一起来聊一聊Terraform
“腾讯云IaC最佳实践”系列文章希望通过介绍Terraform、Chef和Ansible等生态产品工具及相关案例,使用户能够更好地在腾讯云上实践IaC,为腾讯云用户提供增值服务。本文是“腾讯云IaC最佳实践”系列文章的第1篇。
生态产品团队
2019/07/22
18.6K4
Terraform开启本地日志跟踪以及问题自查
|本文以tencentcloud terraform 为例,介绍使用terraform CLI过程中如何开启本地日志跟踪以及一些通用问题的自查方法
Sesede_被告警吵醒
2021/02/26
2K0
Terraform开启本地日志跟踪以及问题自查
腾讯云Terraform应用指南(一)
《腾讯云Terraform应用指南》系列文章旨在帮助腾讯云用户借助Terraform,轻松使用简单模板语言来定义、预览和部署云基础结构,让用户通过IaC,基于腾讯云的OpenAPI一键创建或销毁多路资源。利用Terraform这把利器,帮助用户节约资源开销,提高从部署到运维的自动化生产力。
生态产品团队
2019/07/26
20.1K5
Terraform语法入门
HCL是Terraform的配置语言,它是HashiCorp发明的一种声明式语言,能够以更加简短和人性化的方式来描述资源。本文主要介绍HCL配置语言的基本语法及使用,语法采用当前最新版本0.12。
oliverpei
2020/03/17
8.6K2
初识Terraform Provider 开发框架
Terraform是目前比较火的Ias工具,可以实现多云,多资源的管理。目前其提供的peovider已经是人人都可以写,人人都可以用了。那么作为一个资源提供者,如何让用户便捷使用和管理自己的资源已经是资源提供者首要考虑的问题。那么作为开发者,如何开发一款自己的provider呢?本文以framwork为着手点进行介绍。
金鹏
2024/05/11
3570
metricbeat定制化开发入门教程:采集腾讯云clb的数据
beats组件在云原生的时代,已经是数据采集领域使用最广泛的开源工具集之一。特别是filebeat与metricbeat,被广泛用于各种环境的日志和指标采集。无论是传统的IDC机房中设备,还是基于云原生技术的容器或者k8s pods,或是公有云基础设施组件。beats由elastic提供了数百种用于不同数据源和目的的数据采集模块(modules),以方便我们便捷的采集数据,并以统一的格式和规范的数据发送到不同的数据存储和分析平台。
点火三周
2022/09/18
3.5K0
metricbeat定制化开发入门教程:采集腾讯云clb的数据
Terraform系列三腾讯云CVM中的玩法
紧接:Terraform系列一腾讯云CVM相关简单创建,Terraform系列二腾讯云CVM进一步相关玩法。cvm创建完成,准备初始化一下系统,挂载一下数据盘,在cvm中安装一些软件,做一些简单的配置!
对你无可奈何
2022/04/03
3.9K1
Terraform系列一腾讯云CVM相关简单创建
记得2019左右就看到过Terraform系列的文章和书籍,当时所有的业务都上云了管理也很是方便,看了一眼就没有作过多的研究。但本着对技术发展的前瞻敏锐性, 还是觉得这个东西是会火起来的。正巧最近泽阳大佬devops训练营https://www.yuque.com/devopsvip穿插上了Terraform!个人又开始体验了一把......
对你无可奈何
2022/03/30
4.2K5
AI 最佳实践|用腾讯云智能文本图像增强打造一个掌上扫描仪
在日常生活、工作中, 受限于拍照技术、拍摄条件等制约,得到的文本图像往往存在光照不均、角度倾斜、文字模糊等情况。这种低质量的文本图像不仅不利于保存和后续研究,也不利于光学字符识别。为了解决以上问题,特别调研了业内相关的产品,发现腾讯云AI的文本图像增强能力可以很好的打造一个掌上扫描仪。
腾讯云AI
2023/04/26
1.7K0
AI 最佳实践|用腾讯云智能文本图像增强打造一个掌上扫描仪
最佳实践|用腾讯云AI图像能力实现AI作画
最近看到一篇有趣的文章,一副名为《太空歌剧院》(如下图)的艺术品在某美术比赛上,获得了第一名的成绩, 有意思的是这件作品是通过AI来实现的画作, 顿时觉得非常神奇。 结合近期科技媒体频频报道的AI作画爆火现象,深入了解了下,发现市面上有一些AI作画的小程序, 是通过输入一段文字给AI, 然后输出一副和文字意思相近的图片。 这个感觉非常有意思,某种程度上会给绘画行业带来新的发展契机。
腾讯云AI
2022/11/11
4.4K0
最佳实践|用腾讯云AI图像能力实现AI作画
Terraform 入门
简介 Terraform 的特点: Infrastructure as Code Execution Plans Resource Graph Change Automation Terraform 工具处在什么位置: [image] [image] 指引 核心工作流 Write - Author infrastructure as code. Plan - Preview changes before applying. Apply - Provision reproducible infrastruct
王磊-字节跳动
2020/02/01
3.7K0
最佳实践 | 用腾讯云智能语音打造智能对话机器人
在AI技术的推动下,智能对话机器人逐渐成为我们工作、生活中的重要效率工具,乃至是伙伴,特别是为企业带来最原始最直观的“降本增效”落地实现。
腾讯云AI
2023/04/06
5.6K0
最佳实践 | 用腾讯云智能语音打造智能对话机器人
如何利用Terraform工具编排管理TcaplusDB
Terraform是国外很流行的资源编排工具,具体介绍可查看Hashicorp官网。TIC是腾讯云基于Terraform打造一款免费服务,可为不同云平台的基础架构资源提供易用、高效、安全的统一资源编排管理平台,通过使用声明型语言,兼容众多优秀的开源社区工具,同时提供代码编辑和视图编辑两种模式,有效降低学习成本和使用难度。TIC 使用代码版本管理的方式管理基础架构,保障基础设施的构建、管理和迁移的可靠性和安全性。具体产品介绍可参考TIC官网。TcalplusDB是腾讯去推出的一款全托管NoSQL数据库服务,可为用户提供高性能、低成本、易扩展、稳定、安全的存储服务,目前广泛应用于王者荣耀、刺激战场、穿越火线、火影忍者等数百款流行游戏,具体产品能力介绍可参考另一篇文章《腾讯云TcaplusDB基础能力介绍》。
温球良
2020/08/01
1.2K0
如何利用Terraform工具编排管理TcaplusDB
最佳实践|用腾讯云AI文字识别实现企业资质证书识别
企业经营活动中,资质证书是证明企业生产能力的必要证件,也是企业入驻各类平台、组织项目申报等必须提交的,这里面包括营业执照、税务登记证、生产许可证、高新技术企业认定证书等等。在日常工作中,以平台类企业入驻为例,要求企业上传对应的资质证书然后进行审核,但由于企业资质证书种类繁多,各行各业的资质证书都有差异,没有统一的板式,通过人工审核工作量巨大且很容易出错。
腾讯云AI
2022/07/22
6.6K1
最佳实践|用腾讯云AI文字识别实现企业资质证书识别
terraform简单的开始-vpc cvm创建
一个 resource 块包含 resource 关键字、资源类型、资源名和资源块体三部分。这是terraform中创建资源常用的格式!
对你无可奈何
2023/09/20
5950
推荐阅读
相关推荐
如何把控制台上已有的资源导入terraform
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验