首页 技术 正文
技术 2022年11月16日
0 收藏 425 点赞 2,600 浏览 84034 个字

mapreducer计算原理

<img src="data:image/png;base64,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" alt="" />

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中,怎么样能确保读取到了完整的行呢?在这里用了两个方法搞定。

<img src="data:image/png;base64,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" alt="" />

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

<img src="data:image/png;base64,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" alt="" />

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

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

Map

<img src="data:image/png;base64,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" alt="" />

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   换行符

}

相关推荐
python开发_常用的python模块及安装方法
adodb:我们领导推荐的数据库连接组件bsddb3:BerkeleyDB的连接组件Cheetah-1.0:我比较喜欢这个版本的cheeta…
日期:2022-11-24 点赞:878 阅读:9,085
Educational Codeforces Round 11 C. Hard Process 二分
C. Hard Process题目连接:http://www.codeforces.com/contest/660/problem/CDes…
日期:2022-11-24 点赞:807 阅读:5,560
下载Ubuntn 17.04 内核源代码
zengkefu@server1:/usr/src$ uname -aLinux server1 4.10.0-19-generic #21…
日期:2022-11-24 点赞:569 阅读:6,409
可用Active Desktop Calendar V7.86 注册码序列号
可用Active Desktop Calendar V7.86 注册码序列号Name: www.greendown.cn Code: &nb…
日期:2022-11-24 点赞:733 阅读:6,182
Android调用系统相机、自定义相机、处理大图片
Android调用系统相机和自定义相机实例本博文主要是介绍了android上使用相机进行拍照并显示的两种方式,并且由于涉及到要把拍到的照片显…
日期:2022-11-24 点赞:512 阅读:7,819
Struts的使用
一、Struts2的获取  Struts的官方网站为:http://struts.apache.org/  下载完Struts2的jar包,…
日期:2022-11-24 点赞:671 阅读:4,902