深度剖析MapReduce

简介: 考虑到目前很多公司还都在用这个计算引擎,以及后续要讲的Hive原生支持的计算引擎也是MapReduce,并且为Spark和MapReduce的对比做铺垫,笔者今天详细阐述一下MapReduce。鉴于Hadoop1.X已过时,Hadoop3.X目前用的还不多,企业中目前大量运用的还是Hadoop2.X,所以以下都是基于Hadoop2.X版本的MapReduce

【前言:考虑到目前很多公司还都在用这个计算引擎,以及后续要讲的Hive原生支持的计算引擎也是MapReduce,并且为Spark和MapReduce的对比做铺垫,笔者今天详细阐述一下MapReduce。鉴于Hadoop1.X已过时,Hadoop3.X目前用的还不多,企业中目前大量运用的还是Hadoop2.X,所以以下都是基于Hadoop2.X版本的MapReduce(后续要讲的HDFS和Yarn也是)】

MapReduce是Hadoop核心三剑客之一,设计思想来源于谷歌三篇论文之一的《分布式计算模型》。作为一个分布式运算程序编程框架,需要用户实现业务逻辑代码并和它自带的默认组件整合成完整的分布式运算程序,并发运行在Hadoop集群上。

一个完整的MapReduce程序在分布式运行时有三类实例进程:

1、MRAppMaster:负责整个程序过程调度及状态协调
2、MapTask:负责map阶段整个数据处理流程
3、ReduceTask:负责reduce阶段整个数据处理流程
这里笔者还是要强调一点:MapTask和ReduceTask是进程级别,这一点很重要!

笔者画了一张MapReduce处理的流程图,并以处理单词统计的例子作为示例:

mr1.jpg

MapReduce处理数据主要分为两个阶段:map和reduce,对应到上图分别对应的处理实例就是MapTask和ReduceTask。数据处理先进内存然后刷磁盘,虽然有溢出比限制,但是笔者强调,落磁盘至少一次,通过上图以及接下来的讲解明白了MapReduce的整个处理流程、细节也就能掌握shuffle阶段都干了什么。

下面就图说说里面核心的机制和涉及的组件:

切片机制

切片也就是把文件切成一个个block块,但是此处的切片是逻辑切片而非物理切片。切片的逻辑可以查看接口InputFormat的getSplits方法,通过它的一个实现类FileInputFormat看看切片的默认实现机制,直接看源码:

MR2.jpg

这里咱们主要关注文件可切分的部分,通过分析源码,在FileInputFormat中,默认切片机制如下:

1、简单的按照文件的内容长度进行切片

2、切片大小,默认等于block大小

3、切片时不考虑数据集整体,而是逐个针对每一个文件单独切片

MR3.jpg

因此默认情况下,切片大小等于blocksize。但是,不论怎么调参数,都不能让多个小文件“划入”一个split, 会影响性能, 后续讲HDFS时会说明一下小文件的问题

了解完切片机制之后,初学者容易陷入一个误区,就是比如我配置blocksize为128M,那么我一个文件就会按照128M等比例切分,切到最后不足128M部分单独作为一个切片,但笔者强调这是要分情况的。其实细心的小伙伴会看到我源码截图中的注释部分,关键的参数SPLIT_SLOP为1.1,同样以blocksize为128M为例,假如对于一个130M的可切分文件会产生几个block块呢?很显然130 < 128*1.1,就产生一个切片为130M的block,所以多看源码很重要。

MapReduce并行度决定机制

1)MapTask并行度决定机制

了解了切片机制,就很容易了解MapTask的并行度机制了,因为MapTask的并行度主要取决于切片机制。一个任务的map阶段并行度由客户端在提交任务时决定,而客户端对map阶段并行度的规划的基本逻辑为:按照一个特定切片大小,将待处理数据划分成逻辑上的多个切片,然后每一个切片分配一个mapTask并行实例处理

2)ReduceTask并行度决定机制

ReduceTask设置方式就很简单了,可以直接手动设置:job.setNumReduceTasks(4);,默认值是1,手动设置为4。ReduceTask的并行度同样影响整个任务的执行效率,如果数据分布不均匀,就有可能产生数据倾斜。

注意:ReduceTask设置方式就很简单了,可以直接手动设置:数量并不是任意设置,还要考虑业务逻辑需求,有些情况下,需要计算全局汇总结果,就只能有1个ReduceTask设置方式就很简单了,可以直接手动设置:。尽量不要运行太多的ReduceTask。对大多数任务来说,最好reduce的个数最多和集群中的reduce持平,或者比集群的reduce slots小。这个对于小集群而言,尤其重要。

并发数的选择受多方面因素影响,比如运算节点的硬件配置、运算任务的类型:CPU密集型还是IO密集型、运算任务的数据量,这个还是要根据实际情况而定。

3)map|reduce端核心组件

a) partitioner组件

在map输出数据溢出到磁盘之前调用。默认根据key.hashcode%reduce数量(HashPartition),可以自定义分区组件

b) combiner组件(继承了Reducer)

在map环形缓冲区、reduce输入缓冲区溢出到磁盘之前、多个溢出文件合并时调用。目的是减少写磁盘的数据量(磁盘IO)和传递给reduce的数据量(带宽)。慎用:调用次数不一定,不能影响核心业务逻辑,如对数据求平均值:
2 5 6:加入combiner,2+5+6/3=13/3
4 3 :加入combiner,4+3/2=7/2,最终(13/3+7/2)/2 = 47/12
不加combiner组件:2+5+6+4+3/5 = 4

c) 分组

reduce阶段合并数据的规则,默认根据key相同分为一组

/**利用reduce端的GroupingComparator来实现将一组bean看成相同的key */
public class ItemidGroupingComparator extends WritableComparator {
    //传入作为key的bean的class类型,以及制定需要让框架做反射获取实例对象
    protected ItemidGroupingComparator() {
            super(Order.class,true);
    }
    @Override
    public int compare(WritableComparable a, WritableComparable b) {
            //强转
            Order aBean = (Order) a;
            Order bBean = (Order) b;
            //比较两个bean时,指定只比较bean中itemId
       return aBean.getItemId().compareTo(bBean.getItemId());
    }
}

最后再说一下MapReduce的分布式缓存:MapReduce通过DistributedCache,可以将job指定的文件,在job执行前,先行分发到task执行的机器上,并提供相关机制对cache文件进行管理。但需要注意:需要分发的文件,必须提前放到hdfs上;需要分发的文件在任务运行期间最好是只读的;不建议分发较大的文件,影响性能。主要用来分发第三方库、多表数据join时小表数据简便处理等。可以在自定实现Mapper类,重写setup方法中进行分布式缓存处理。

对于MapReduce分布式缓存,很类似于Spark中的广播变量,后续讲到Spark广播变量和累计变量时再细说。

相关文章
|
2天前
|
云安全 人工智能 安全
AI被攻击怎么办?
阿里云提供 AI 全栈安全能力,其中对网络攻击的主动识别、智能阻断与快速响应构成其核心防线,依托原生安全防护为客户筑牢免疫屏障。
|
12天前
|
域名解析 人工智能
【实操攻略】手把手教学,免费领取.CN域名
即日起至2025年12月31日,购买万小智AI建站或云·企业官网,每单可免费领1个.CN域名首年!跟我了解领取攻略吧~
|
6天前
|
安全 Java Android开发
深度解析 Android 崩溃捕获原理及从崩溃到归因的闭环实践
崩溃堆栈全是 a.b.c?Native 错误查不到行号?本文详解 Android 崩溃采集全链路原理,教你如何把“天书”变“说明书”。RUM SDK 已支持一键接入。
473 199
|
4天前
|
人工智能 移动开发 自然语言处理
2025最新HTML静态网页制作工具推荐:10款免费在线生成器小白也能5分钟上手
晓猛团队精选2025年10款真正免费、无需编程的在线HTML建站工具,涵盖AI生成、拖拽编辑、设计稿转代码等多种类型,均支持浏览器直接使用、快速出图与文件导出,特别适合零基础用户快速搭建个人网站、落地页或企业官网。
583 157
|
4天前
|
数据采集 消息中间件 人工智能
跨系统数据搬运的全方位解析,包括定义、痛点、技术、方法及智能体解决方案
跨系统数据搬运打通企业数据孤岛,实现CRM、ERP等系统高效互通。伴随数字化转型,全球市场规模超150亿美元,中国年增速达30%。本文详解其定义、痛点、技术原理、主流方法及智能体新范式,结合实在Agent等案例,揭示从数据割裂到智能流通的实践路径,助力企业降本增效,释放数据价值。
|
10天前
|
人工智能 自然语言处理 安全
国内主流Agent工具功能全维度对比:从技术内核到场景落地,一篇读懂所有选择
2024年全球AI Agent市场规模达52.9亿美元,预计2030年将增长至471亿美元,亚太地区增速领先。国内Agent工具呈现“百花齐放”格局,涵盖政务、金融、电商等多场景。本文深入解析实在智能实在Agent等主流产品,在技术架构、任务规划、多模态交互、工具集成等方面进行全维度对比,结合市场反馈与行业趋势,为企业及个人用户提供科学选型指南,助力高效落地AI智能体应用。
|
存储 人工智能 监控
从代码生成到自主决策:打造一个Coding驱动的“自我编程”Agent
本文介绍了一种基于LLM的“自我编程”Agent系统,通过代码驱动实现复杂逻辑。该Agent以Python为执行引擎,结合Py4j实现Java与Python交互,支持多工具调用、记忆分层与上下文工程,具备感知、认知、表达、自我评估等能力模块,目标是打造可进化的“1.5线”智能助手。
573 46