MapReduce的基础知识

MapReduce的基础知识,第1张

MapReduce的基础知识 MapReduce的小小知识

文章名称:MapRudece的小小知识

文章内容:将简单描述MapReduce的知识点,和一些概念的东西还有一些工作原理,以及Wordcount案例的流程和主体代码,将大致的内容梳理一下,核心部分还需自行参阅。

文章作者:爱划水的潇洒哥

提示:以下内容为个人学习的总结,更多详细资料需您自行查阅。

前言:Hadoop采用Java语言开发,是对Goolgle的 MapReduce、GFS 和 BigData等核心技术的开源实现。基于谷歌的三驾马车开源实现的分布式大数据开发平台,MapReduce是Hadoop的核心组件。


目录

MapReduce是什么

MapReduce有什么用

MapReduce优缺点

MapReduce工作原理

Apache MapReduce关键术语

WordCount的流程和代码实现

总结


目录

MapReduce是什么 MapReduce有什么用 MapReduce优缺点 MapReduce工作原理 Apache MapReduce关键术语 WordCount的流程和代码实现 总结


MapReduce是什么

MapReduce是一个分布式运算程序的编程框架,是用户开发基于Hadoop的数据分析应用的核心框架。

Map计算阶段:将一个大任务,拆分成多个小任务,同时运行并行

Reduce汇总阶段:把Map阶段的所有小任务执行结果汇总到一起组成部分


MapReduce有什么用

海量数据在单机上处理因为硬件资源限制,无法胜任而一旦将单机版程序扩展到集群来分布式运行,将极大增加程序的复杂度和开发难度引入mapreduce框架后,开发人员可以将绝大部分工作集中在业务逻辑的开发上,而将分布式计算中的复杂性交由框架来处理。 mapreduce分布式方案考虑的问题

简言之,MapReduce可以做大数据处理,所谓大数据处理,即以价值为导向,对大数据加工、挖掘和优化等各种处理。


MapReduce优缺点

优点

MapReduce易于编程 (它简单的实现一些接口,可以完成一个分布式程序)

良好的扩展性 (计算资源不能满足是,可以通过简单的增加机器来扩展它的计算能力)

高容错性 (Eg:其中一台机器挂了,它可以把上面的计算任务转移到另一个结点,不至于任务运行失败)

适合PB级以上的海量数据的离线处理 (实现千台服务器集群并发工作)

缺点

不擅长实时计算 (MapReduce不像Mysql那样在毫米或秒级返回结果(推荐使用Hbase))

不擅长流式计算 (流式计算输入数据是动态的,MapReduce输入数据集是静态的,自身的设计特点决定了数据源必须是静态的(推荐Spark、StromFlink))

不擅长DAG(有向无环图)计算 (多个应用程序存在依赖关系,后一个应用程序的输入为前一个的输出。在这种情况下,MapReduce并不是不能做,而是使用后,每个MapReduce作业的 输出结果都会写入到磁盘,会造成大量的磁盘IO,导致性能非常的低下。(推荐使用Spark))


MapReduce工作原理

 通过做饭原理说明

最终稍微详细:

输入文件

首先,MapReduce 任务的目的是处理数据,那数据从哪里来?一般一个 MapReduce 任务的输入数据是来自于 HDFS 文件,这里的数据文件就叫做 MapReduce 任务的输入文件,而 HDFS 上文件的格式多种多样,比如有文本文件,二进制文件等。

InputFormat

InputFormat 是 MapReduce 框架的一个类,它对输入文件进行分割和读取,并创建数据分片 InputSplit。

InputSplit

InputSplit 对象即数据分片对象,由 InputFormat 生成的,一个数据分片由一个 Mapper 来处理,数据分片是逻辑上的划分,并非物理分割。每一个分片都会相应创建一个 map 任务,因此,map 任务的数量等于分片的数量,即有多少个分片就有多少个 map 任务。分片会被划分成记录,并且每个记录都会被对应 mapper 处理。

RecordReader

它会跟 InputSplit 交互,并把数据转换成适合 mapper 读取的键值对(key-value pair)记录。默认情况下,它用的是 TextInputFormat 类来做转换。RecordReader 与 InputSplit 交互一直到文件读取完成。它会给文件的每一行数据分配一个字节偏移量(byte offset)作为唯一编号。后续这些键值对将被发送给 mapper 做进一步处理。

Mapper

它负责处理每一个来自 RecordReader 的记录,并生成新的键值对数据,这些 Mapper 新生成的键值对跟输入键值对是不一样的。Mapper 的输出也就是我们前面说的中间结果将会被写到本地磁盘。Mapper 的输出数据并不是存储在 HDFS 的,因为这是临时数据,如果把临时数据写到 HDFS ,将造成不必要的复制,会导致 map 任务性能低下。Mapper 的输出数据被传输给 Combiner 做下一步处理。

Combiner

它会对 mapper 的输出数据做本地聚合,也就是说它是在输出数据的 mapper 所在的机器上执行的。主要为了减少 mapper 和 reducer 之间的数据传输。combiner 执行完成之后,它的输出结果就会被传输到 partitioner 做下一步处理。

Partitioner

如果一个 MapReduce 作业在 reduce 阶段有多个 reducer 任务参与,才会有 Partitioner 这一步,即数据分区。如果只有一个 reducer 任务,Partitioner 是不会执行的,即不会对数据分区。

Partitioner 对来自 combiner 的输出数据分区并排序,其实就是对数据的 key 做哈希运算,具有相同 key 的记录会被分到相同的分区,然后每个分区会被发送给 reducer。

Shuffle 和排序

现在,Partitioner 的输出被 shuffle 到 reduce 节点( 这里的 reduce 节点其实就是正常的 slave 节点,由于在上面跑 reduce 任务所以才叫 reduce 节点)。shuffle 是对数据进行跨网络的物理移动,需要消耗网络带宽资源。在所有 mapper 都完成之后,他们的输出数据才会被 shuffle 到 reduce 节点,并且这些 mapper 产生的数据会被合并和排序,然后作为 reduce 阶段的输入数据。

Reducer

在 reduce 阶段,它把 mapper 输出的键值对数据作为输入,然后对每个键值对数据记录应用 reducer 函数并输出结果。reducer 的输出数据是 MapReduce 作业的最终计算结果,它会被存储到 HDFS。

RecordWrite

它负责把来自 Reducer 输出的键值对数据写到输出文件。

OutputFormat

RecordWriter 将 Reducer 输出的键值对写入输出文件的方式由 OutputFormat 决定。OutputFormat 是由 Hadoop 提供的用于把数据写到 HDFS 或者本地磁盘的接口。因此,reducer 的最终输出数据是由 Outputformat 实例负责写入到 HDFS 的。

(在完整的工作原理中,在有些项目里Reduce这一步骤可以被省略)


Apache MapReduce 关键术语

1. 什么是 MapReduce Job(作业)

一个 MapReduce Job 过程分成两个阶段:Map 阶段和 Reduce 阶段。

每个阶段都用 key/value 作为输入和输出;每个阶段都需要定义函数,也就是 map 函数和 reduce 函数;可以简单认为 map 函数是对原始数据提出出有用的部分,而 reduce 函数则是对提取出来的数据进行处理。

2. 什么是 MapReduce Task

MapReduce 里面的 task 可以分两种,即 Map task 和 Reduce task,即处理分片数据的 Mapper 和 Reducer 任务,这里的 Mapper 和 Reducer 的业务逻辑由开发者定义。

MrAppMaster:负责整个程序的过程调度及状态协调。

MapTask:负责Map阶段的整个数据处理流程。

ReduceTask:负责Reduce阶段的整个数据处理流程。

3. 什么是 Task Attempt

Task Attempt,即任务尝试。集群的机器在任何时间都可能发生故障,比如,正在处理数据的机器挂了,MapReduce 把任务重新调度到其他机器节点。当然这里的重新调度次数并非不受限制的,它是有上限的,默认是 4 次,如果一个任务(Mapper 任务或者 Reducer 任务)失败 4 次,那么整个 Job 就被认为失败了。对于高优先级的作业或者大型作业,这个值可以调高一点。


WordCount的流程和代码实现

WordCount的基本执行流程

word.txt----->Split----->map task----->group by sorting----->reduce----->hdfs

编程实例,以WordCount为例来说明

伪代码:

mapper(key,value);

for each word w in value

emit(w,1)

reducer(key,values);

result = 0

for each count v in valuse

result += v

emit(key,result)

部分代码

Mapper的实现

public class WordcoutMapper extends Mapper{
    protected void map(LongWritable key,Text value,Context context)
        throws IOEception, InterruptedException{
        String str = value.toString();
        String [] words = str.split("");
        for(String word:words){
            context.write(new Text(word),new LongWritable(1));
        }
    }
}

Reducer的实现

public class WordcountReduce extendsReducer{
    protected void reduce(Text word,Iterablevalue,Context context)
        throws IOException,InterruptedException{
        long sum = 0;
    	for(longWritable v:value){
            sum += v.get();
        }
        context.write(new Text(word),new LongWritable(sum));
    }
}

补充:mapreduce默认的排序规则

1.字符串:按照字典排序

2.数字:升序

可以改变排序顺序


总结

以上就是个人对于Hadoop中mapreduce知识点粗略总结,里面涉及一些详细的知识点和具体架构还需您自行参考其他文献,本次的总结参考了 《云计算与大数据技术应用》安俊秀 靳宇倡等编著 这本书, 大象教程中的MapReduce工作原理和关键术语:(MapReduce 教程 | MapReduce 教程) 里面的较多内容是大学老师中教学ppt的内容以上内容涉及来源我也不懂。这次的总结,真的还有很多未知内容没有写进去,自己的认识也非常的浅薄,还需大家自行去了解。本次封面选图来自大象教程中的生态系统中的图片。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/5700980.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-17
下一篇 2022-12-17

发表评论

登录后才能评论

评论列表(0条)

保存