1、reduce源码中的

GroupComparable和SecondaryComparable到底都是干什么的

理解点1:

源码位置

理解点

secondaryComparable这个是可以对map端按照某种规则排序好的数据进
行边界的界定,就是比如你map端排序的根据是按点之前的字段进行分组的
之后传输到了reduce端了,但是你reduce端想要计算的时候是需要的是
按照点前面的如bj、sh等,和点后面的如cp等,进行计算的话,这个secondaryCpmpare
排序器可以在不改变原有map传输过来的数据的分组排序顺序的情况下进行边界的界定

理解点2:ReduceTask.class这个类和reducer的开始关联了

对于其中的Reducer对象的获取是通过反射实现的,可以看上面的 图片中,的ReflectionUtils.getClass()方法

这个方法调用的是JobContext中的方法

接着ReducerTask.class进行学习

RecordWriter这个是为了最后计算完毕之后向外写出结果的时候用的

而其中的ReducerContext是为了帮助reducer完成数据迭代的一个上下文容器

具体的这个容器的创建的过程见下图

接下来进入到createReduceContext()方法

在这个方法里面初始化ReduceContext对象

下面深入源码进入ReduceContextImpl()

本方法中将获取的方法的参数赋值给ReduceContextimpl类的成员变量,供下面的使用

最后这个方法返回了reducerContext

有reduceTask中的reducerContext对象来接收

之后调用自己定义的reducer或者默认的reducer.class的run()

进入run方法

又跳回到Reducer.class类的run方法

接下来进入nextKey()方法

reducerContextImpl类中的nextKey()方法

进入这个方法的nextKeyValue()

回到Reducer.class的方法,

这个nextKey()仅仅会有一种情况为真,其他的时候都是为假的,而不是看这个和上一个的key是否是是以昂扬的,直到最后的时候,map传递过来的数据集没有数据的时候才会返回false结束左侧的while循环,结束run的调用

接下来看看reducer是怎么界定当前的这个reduce任务该结束了

转到自带源码中的reducer.class的run中的getVlues()方法,

进入RecduceContextImpl类中的到getValue()方法

其中的迭代器的类型

转到迭代器的源码ReduceContextImpl .class

进入到ValueIterIterater类,这个类实现了Iterater接口

这个方法重写了Iterater中的next()方法和hasNext()方法

接下来回到ReduceContextImpl.class的 ValueIterator中理解这个方法中的hasNext()方法

hadoop之mr框架的源码理解注意点的更多相关文章

  1. 卷积神经网络CNN介绍:结构框架,源码理解【转】

    1. 卷积神经网络结构 卷积神经网络是一个多层的神经网络,每层都是一个变换(映射),常用卷积convention变换和pooling池化变换,每种变换都是对输入数据的一种处理,是输入特征的另一种特征表 ...

  2. 【安卓网络请求开源框架Volley源码解析系列】定制自己的Request请求及Volley框架源码剖析

    通过前面的学习我们已经掌握了Volley的基本用法,没看过的建议大家先去阅读我的博文[安卓网络请求开源框架Volley源码解析系列]初识Volley及其基本用法.如StringRequest用来请求一 ...

  3. 【Struts2】如何查看Struts2框架的源码

    学习三大框架时难免遇到不太理解的地方需要去研究框架源码,这里总结一下查看struts2源码的两种方式. 1.直接解压struts2.X.X-all.zip,在的到的解压文件中看到如下目录: 打开图中蓝 ...

  4. 框架-spring源码分析(一)

    框架-spring源码分析(一) 参考: https://www.cnblogs.com/heavenyes/p/3933642.html http://www.cnblogs.com/BINGJJF ...

  5. 框架-springmvc源码分析(一)

    框架-springmvc源码分析(一) 参考: http://www.cnblogs.com/heavenyes/p/3905844.html#a1 https://www.cnblogs.com/B ...

  6. JUC同步器框架AbstractQueuedSynchronizer源码图文分析

    JUC同步器框架AbstractQueuedSynchronizer源码图文分析 前提 Doug Lea大神在编写JUC(java.util.concurrent)包的时候引入了java.util.c ...

  7. .NET Core 3.0之深入源码理解Startup的注册及运行

    原文:.NET Core 3.0之深入源码理解Startup的注册及运行   写在前面 开发.NET Core应用,直接映入眼帘的就是Startup类和Program类,它们是.NET Core应用程 ...

  8. Java8集合框架——LinkedList源码分析

    java.util.LinkedList 本文的主要目录结构: 一.LinkedList的特点及与ArrayList的比较 二.LinkedList的内部实现 三.LinkedList添加元素 四.L ...

  9. 通过transmittable-thread-local源码理解线程池线程本地变量传递的原理

    前提 最近一两个月花了很大的功夫做UCloud服务和中间件迁移到阿里云的工作,没什么空闲时间撸文.想起很早之前写过ThreadLocal的源码分析相关文章,里面提到了ThreadLocal存在一个不能 ...

随机推荐

  1. PTA-德州扑克 题解

    于2020/02/24记录. 德州扑克属实是个带难题.本题解简单易懂,命名合理,应该比较好理解. 题目如下: 最近,阿夸迷于德州扑克.所以她找到了很多人和她一起玩.由于人数众多,阿夸必须更改游戏规则: ...

  2. Java设计模式(工厂模式)

    一.简单工厂模式 简单工厂模式就是把对类的创建初始化全都交给一个工厂来执行,而用户不需要去关心创建的过程是什么样的,只用告诉工厂我想要什么就行了.而这种方法的缺点也很明显,违背了设计模式的开闭原则,因 ...

  3. MyEclipse CI 2019.4 完美激活版(含离线包+激活工具+安装教程)

    ps:MyEclipse目前已更新至2019.12.5,但是目前还没有有效的激活方式,本次文章以2019.4为例; 该文章使用离线安装的方式进行安装,在线安装不保证不会出现各类小问题,离线安装包及激活 ...

  4. layer.open获取弹出层的input框的值

    使用top.$('#txtReason').val();获取值: //不通过 function unAuditData(id) { parent.layer.open({ type: , title: ...

  5. Wannafly Camp 2020 Day 2I 堡堡的宝藏 - 费用流

    感谢这道题告诉我KM求的是 完备 最大权匹配 :( #include <bits/stdc++.h> using namespace std; #define reset(x) memse ...

  6. crontab定时任务打包备份文件并删除过期文件

    Crontab 示例,最后这里要写成shell脚本定时运行 30 17 * * * cp -rf /usr/local/tomcat9-jforum/tomcat/logs/catalina.out ...

  7. 剖析Javascript中forEach()底层原理,如何重写forEach()

    我们平时用的forEach()一般是这样用的 var myArr = [1,5,8] myArr.forEach((v,i)=>{ console.log(v,i) })//运行后是这样的1 0 ...

  8. Linux环境C语言斐波拉切数列(1,1,2,3,5,8,13,.........)实现

    斐波那契数列(Fibonacci sequence),又称黄金分割数列.因数学家列昂纳多·斐波那契(Leonardoda Fibonacci)以兔子繁殖为例子而引入,故又称为“兔子数列”,指的是这样一 ...

  9. jarvis OJ部分writeup

    [XMAN]level 0 [XMAN]level 1 —— 简单shellcode利用 [XMAN]level 2 [XMAN]level 3 —— ret2libc尝试 [XMAN]level2& ...

  10. Git下载GitHub仓库里的某一个文件夹或某一个文件

    从Github上下载github上的整个项目,可以用下面指令: git clone https://github.com/XXX/xxxxx.git 其中:XXX是用户在Github上的用户名 xxx ...