mapreducer计算原理

mapreducer计算原理

InputFormat

InputFormat的默认实现是TextInputFormat

InputSplit

概念

是mapreducer对文件进行处理和运算的输入单位。只是一个逻辑概念。每一个InputSplit并没有对文件进行实际的切割。只是记录了要处理文件的位置信息(包括文件的path和 hosts、长度(length))。在默认情况下,InputSplit和Block的数目是一样的。

getLength

得到一个InputSplit的长度

getLocations

得到该InputSplit的文件的具体的位置,包括复制集的位置

FileSplit

一种split的实现

属性Path file

代表的是文件的路径,这个大的文件的存储路径

属性long start

分片在文件中的起始位置

属性long length

分片的长度

属性String[] hosts

存储分片所在的主机

属性SplitLocationInfo[] hostInfos

存储分片所在的主机的信息

说明

用这四个参数就可以计算出提供给每一个map的分片的数据。

RecordReader

为数据读取器接口

next

boolean next(K key, V value) throws IOException;

从InputSplit中读取数据,如果返回值为true,则key和value已经被读取了,如果返回值为false,则为最后的数据了

createKey

createKey();

按照子类给定的规则创建key

createValue

按照子类给定的规则创建value。

V createValue();

getPos

返回当前遍历的InputSplit的位置

/**

* Returns the current position in the input.

*

* @return the current position in the input.

* @throws IOException

*/

long getPos() throws IOException;

close

关闭当前遍历的InputSplit

/**

* Close this {@link InputSplit} to future operations.

*

* @throws IOException

*/

public void close() throws IOException;

getProgress

/**

* How much of the input has the {@link RecordReader} consumed i.e.

* has been processed by?

*

* @return progress from <code>0.0</code> to <code>1.0</code>.

* @throws IOException

*/

float getProgress() throws IOException;

LineRecordReader
createKey

return new LongWritable();

从该方法可以得知,默认的key就是一个偏移量。

createValue

public Text createValue() {

return new Text();

}

从这里可以看出value就是一个Text,在这里是一行的内容。

nextKeyValue

if (key == null) {

key = new LongWritable();

}

key.set(pos);// key即为偏移量

读取跨InputSplit数据的问题

如果一行数据被分配到了两个InputSplit中,怎么样能确保读取到了完整的行呢?在这里用了两个方法搞定。

这里getFilePosition()<=end,而不是getFilePosition()<end,说明读到最后一行,还要继续读下去。也就是说还要读下一个InputSplit的第一行。

start为第一个InputSplit,如果是第一个InputSplit,则从第一个Record读取。如果不是第一个InputSplit,则抛弃第一个Record,直接读取第二个。

这两种机制就可以完全解决数据跨两个InputSplit的读取问题。

Map

Partition

Partition能按照某一个特定的值划分区域,每一个区域将来会送给特定的reducer,所以分了多少个区域应该就会产生多少个reducer。这样一来程序的性能会进一步提升。

Sort

当map task 开始运算,并产生中间数据时,其产生的中间结果并非直接就简单的写入磁盘。这中间的过程比较复杂,并且利用到了内存buffer 来进行已经产生的部分结果的缓存,并在内存buffer 中进行一些预排序来优化整个map 的性能。如上图所示,每一个map 都会对应存在一个内存buffer (MapOutputBuffer ,即上图的buffer in memory ),map 会将已经产生的部分结果先写入到该buffer 中,这个buffer 默认是100MB 大小,但是这个大小是可以根据job 提交时的参数设定来调整的,该参数即为: io.sort.mb 。当map 的产生数据非常大时,并且把io.sort.mb 调大,那么map 在整个计算过程中spill 的次数就势必会降低,map task 对磁盘的操作就会变少,如果map tasks 的瓶颈在磁盘上,这样调整就会大大提高map 的计算性能

Combiner

在map中的reducer过程。当job 指定了combiner 的时候,我们都知道map 介绍后会在map 端根据combiner 定义的函数将map 结果进行合并。运行combiner 函数的时机有可能会是merge 完成之前,或者之后,这个时机可以由一个参数控制,即 min.num.spill.for.combine (default 3 ),当job 中设定了combiner ,并且spill 数最少有3 个的时候,那么combiner 函数就会在merge 产生结果文件之前运行。通过这样的方式,就可以在spill 非常多需要merge ,并且很多数据需要做conbine 的时候,减少写入到磁盘文件的数据数量,同样是为了减少对磁盘的读写频率,有可能达到优化作业的目的。

Spill

map 在运行过程中,不停的向该buffer 中写入已有的计算结果,但是该buffer 并不一定能将全部的map 输出缓存下来,当map 输出超出一定阈值(比如100M ),那么map 就必须将该buffer 中的数据写入到磁盘中去,这个过程在mapreduce 中叫做spill 。map 并不是要等到将该buffer 全部写满时才进行spill ,因为如果全部写满了再去写spill ,势必会造成map 的计算部分等待buffer 释放空间的情况。所以,map 其实是当buffer 被写满到一定程度(比如80% )时,就开始进行spill 。这个阈值也是由一个job 的配置参数来控制,即 io.sort.spill.percent ,默认为0.80 或80% 。这个参数同样也是影响spill 频繁程度,进而影响map task 运行周期对磁盘的读写频率的。但非特殊情况下,通常不需要人为的调整。调整io.sort.mb 对用户来说更加方便。

merage

当map task 的计算部分全部完成后,如果map 有输出,就会生成一个或者多个spill 文件,这些文件就是map 的输出结果。map 在正常退出之前,需要将这些spill 合并(merge )成一个,所以map 在结束之前还有一个merge 的过程。merge 的过程中,有一个参数可以调整这个过程的行为,该参数为: io.sort.factor 。该参数默认为10 。它表示当merge spill 文件时,最多能有多少并行的stream 向merge 文件中写入。比如如果map 产生的数据非常的大,产生的spill 文件大于10 ,而io.sort.factor 使用的是默认的10 ,那么当map 计算完成做merge 时,就没有办法一次将所有的spill 文件merge 成一个,而是会分多次,每次最多10 个stream 。这也就是说,当map 的中间结果非常大,调大io.sort.factor ,有利于减少merge 次数,进而减少map 对磁盘的读写频率,有可能达到优化作业的目的。

Reducer

OutputFormat

outputFormat的默认实现是TextOutputFormat

输出到纯文本文件,格式为:key+” ”+value

TextOutputFormat

属性newline

//新的行的产生

private static final byte[] newline    换行符

//用一个换行符产生了新的一行

static {

try {

newline = "\n".getBytes(utf8);

} catch (UnsupportedEncodingException uee) {

throw new IllegalArgumentException("can‘t find " + utf8 + " encoding");

}

}

Write方法

public synchronized void write(K key, V value)

throws IOException {

boolean nullKey = key == null || key instanceof NullWritable;

boolean nullValue = value == null || value instanceof NullWritable;

//下面的代码都是为了拼接一行数据

if (nullKey && nullValue) {

return;

}

if (!nullKey) {

writeObject(key);    一行中的第一个组成部分:key

}

if (!(nullKey || nullValue)) {

out.write(keyValueSeparator); 一行中的第二个组成部分:tab

}

if (!nullValue) {

writeObject(value);   一行中的第三个组成部分:value

}

out.write(newline);     一行中的第四个组成部分:\n   换行符

}

时间: 2024-07-28 13:40:44

mapreducer计算原理的相关文章

OpenGL中摄像机矩阵的计算原理

熟悉OpenGL|ES的朋友,可能会经常设置摄像机的view矩阵,iOS中相对较好,已经封装了方向,只需要设置摄像机位置,目标点位置以及UP向量即可.下面先介绍下摄像机view矩阵的计算原理.此处假设知道摄像机位置eye,目标点位置target以及UP向量. 主要是u,v,w三个向量的计算: 1.w向量: (1)计算向量eyeToTarget = eye - target; (2)向量w 等于 向量eyeToTarget与向量UP的叉乘. 2.u向量:向量w与向量UP的叉乘 3.v向量:向量w与

前端移动端的rem适配计算原理

rem是什么? rem(font size of the root element)是指相对于根元素的字体大小的单位.简单的说它就是一个相对单位.看到rem大家一定会想起em单位,em(font size of the element)是指相对于父元素的字体大小的单位.它们之间其实很相似,只不过一个计算的规则是依赖根元素一个是依赖父元素计算. 计算原理: 1 屏幕宽为 clientWidth(px). 设计稿宽度为 750 (px), 假设 n = clientWidth(px)/750(px)

【原创】xgboost 特征评分的计算原理

xgboost是基于GBDT原理进行改进的算法,效率高,并且可以进行并行化运算: 而且可以在训练的过程中给出各个特征的评分,从而表明每个特征对模型训练的重要性, 调用的源码就不准备详述,本文主要侧重的是计算的原理,函数get_fscore源码如下, 源码来自安装包:xgboost/python-package/xgboost/core.py 通过下面的源码可以看出,特征评分可以看成是被用来分离决策树的次数,而这个与 <统计学习基础-数据挖掘.推理与推测>中10.13.1 计算公式有写差异,此处

通俗解析莱文斯坦距离(Levenshtein Distance)计算原理(最小编辑距离)

[版权声明]:本文章由danvid发布于http://danvid.cnblogs.com/,如需转载或部分使用请注明出处 最近看到一些动态规划的东西讲到莱文斯坦距离(编辑距离)的计算,发现很多都讲的不是很清楚,比较难理解,自己思考过后重新给大家讲解一下: 维基百科解析:莱文斯坦距离,又称Levenshtein距离,是编辑距离的一种.指两个字串之间,由一个转成另一个所需的最少编辑操作次数.允许的编辑操作包括将一个字符替换成另一个字符,插入一个字符,删除一个字符.例如将kitten转成sittin

机器学习:基于sklearn的AUC的计算原理

AUC原理 一.AUC起源 AUC是一种用来度量分类模型好坏的一个标准.这样的标准其实有很多,例如:大约10年前在 machine learning文献中一统天下的标准:分类精度:在信息检索(IR)领域中常用的recall和precision,等等.其实,度量反应了人们对” 好”的分类结果的追求,同一时期的不同的度量反映了人们对什么是”好”这个最根本问题的不同认识,而不同时期流行的度量则反映了人们认识事物的深度的变 化.近年来,随着machine learning的相关技术从实验室走向实际应用,

TCP校验和计算原理与实现

1. 概述 TCP首部校验和计算三部分:TCP首部+TCP数据+TCP伪首部. TCP校验和覆盖TCP首部和TCP数据,而IP首部中的校验和只覆盖IP的首部,不覆盖IP数据报中的任何数据. 伪首部是为了增加TCP校验和的检错能力:如检查TCP报文是否收错了(目的IP地址).传输层协议是否选对了(传输层协议号)等.伪首部来自IP首部. RFC 793的TCP校验和定义 The checksum field is the 16 bit one's complement of the one's co

数学计算相关算法原理及实现

http://blog.csdn.net/pipisorry/article/details/46008603 欧几里德算法 欧几里德算法又称辗转相除法,用于计算两个整数a,b的最大公约数. 计算原理 定理:gcd(a,b) = gcd(b,a mod b) 证明:a可以表示成a = kb + r ,则r = a mod b 假设d是a,b的一个公约数,则有 d|a, d|b,而r = a - kb,因此d|r ,因此d是(b,a mod b)的公约数 假设d 是(b,a mod b)的公约数,

[转]浅谈协方差矩阵(牢记它的计算是不同维度之间的协方差,而不是不同样本之间。)

注意:方差就是方差:方差的平方就是方差的平方.有的时候以为方差就是方差的平方. cov11 = sum((dim1-mean(dim1)).*(dim1-mean(dim1)))/(size(MySample,1)-1) cov11 = 296.7222 >> std(dim1) ans = 17.2256 >> std(dim1).^2 ans = 296.7222 一.统计学的基本概念 统计学里最基本的概念就是样本的均值.方差.标准差.首先,我们给定一个含有n个样本的集合,下面

ipv4校验和计算

ipv4校验和的计算 原理: 计算方法一:除去校验和的两位,将其他的位相加:45+00+00+3c+55+81+00+00+40+01+ac+1c 0f+0d+ac+1c+0f+0e= 计算方法二: 校验和(checksum)算法,简单的说就是16位累加的反码运算: 计算函数如下: 我们在计算时是主机字节序,计算的结果封装成IP包时是网络字节序,注意这两者之间的区别,我们在从IP包里读取要转化为主机字节序,往IP包里存入时要转化为网络字节序在存入. UINT32 Checksum(UINT32