c++中两个key确定一个value_Hadoop基础MapReduce编程模型(二)认识三组Key和Value

      <>以sort和wordcount为例讲解了MapReduce的编程模型。今天进一步讲解MapReduce编程模型中涉及的三组Key和Value,分别是:(K1,V1),(K2,K2),和(K3,K3)。了解这三组key和value有助于深刻理解MapReduce编程模型。在详细进入讨论之前,先讲述两个背景知识。

一、背景知识

1.1 Map函数、Map任务、和Map阶段

      Map函数:在编写MapReduce程序时,用户需要实现两个函数。其中一个是Map函数,另一个是Reduce函数。Map函数的接口由框架确定,输入为一组(key, Value), 但具体逻辑由用户自己实现。需要注意的是,Map函数会被Map任务反复调用。 

     Map任务:指的是一个进程,实现了三部分功能:1、准备工作,以一个Block的数据为输入,将Block转化为一组(Key,Value);2、具体执行,遍历上一步中的(Key,Value)集合,循环调用Map函数,并以(Key,Value)作为Map函数的输入参数;3、结果收集,保存Map函数中的输出。

    Map阶段:是MapReduce编程模型的一部分,是数据处理流程逻辑上的功能划分,逻辑上对应数据读取,数据处理、数据结果保存等三部分功能。具体工作由Map任务实现。

1.2 Block和Split的关系

一个HDFS上文件会划分为多个Block(一个数据块的大小为64MB或128MB,也可配置成其它大小),不同的Block会分布到集群中多个DataNode上。NameNode的元数据中记录了两种映射,一个文件被分为了多少个Block,每个Block起止点(以字节数标记); 每个Block保存在那些DataNode上。

Block对一个文件进行了实际的物理分割,逻辑上相邻的两个Block一般存储在不同DataNode上(即使存储在同一个DataNode上,它们在磁盘上也相互独立)。改变这种分割需要付出很大的代价,需要将数据重新读入内存,按不同块大小Block Size将数据写入HDFS,会引起大量的IO操作。

Split记录了对文件一个逻辑上的分割,每个Split记录了自身在文件中的起止偏移量,并不存在一对一的物理实体。按照MapReduce的设计原理,每个Split对应一个Map任务。改变Split对应的这种分割基本不需要代价。

一般情况下一个Split对应一个Block,这样可以达到较好的数据局部性,调度器将Map任务放置在该Block对应的节点即可。假如一个Split跨越两个不同Block,Split对应的Map任务应该放置在那个节点?在这种情况下,Map任务会放置在其中一个Block对应的节点,并将另外一个Block远程拷贝到本地处理,引起了不必要的网络传输。

二、不同[Key,Value]出现的场景

c6c89584fe6435e1730be906f9a535c3.png

图1-1不同Key和Value在MapReduce编程模型中的位置,图片来自互联网。

通过背景知识的讨论,我们可以发现Split是对文件(file)的一个逻辑上的划分,记录了每个Split在文件中的起止偏移量。Block是对文件的一个物理上的划分,逻辑上相邻的Block,实际数据存储在不同DataNode。

在逻辑上Split可以大于,小于或等于一个Block;一个文件也可以只划分为一个Split。这也意味着每个Map的输入可以是Block的一部分,也可以是整个文件。一般情况下,一个Split对应一个Block。

如图1-1所示,每个Split对应一个Map任务,Map任务将Block变成多个[K1, V1]形式,此处[K1, V1]为Map函数的输入参数,[K2,V2]为Map函数的输出参数。

Shuffle操作通过分组Group操作,会将key相同(此处比较K2的值)的[K2, V2]组合聚集到一起,形成[K2, {V2,…}],此处{…}为V2的集合。

Reduce任务以[K2, {V2,…}]为输入,对{V2,…}进行聚合操作形成V3。

按照(Key,Value)的值域来比较,可以得出如下结论:

K1不等于K2,V1不等于V2;

K3等于K2,V3等于V2

接下来将结合具体的例子程序wordcount来讨论三组(Key,Value)分别对应什么。

三、不同[Key,Value]出现的场景-以wordcount为例

53696439161f31df78a82d07ccc52ef6.png

图1-2 程序wordcount在MapReduce框架下的三组Key和Value

如图1-2所示,此处 [K1, V1] 分别对应[文件偏移量,一行文本字符串];[K2, V2]分别对应[单个单词,单词出现的次数];[K2, {V2,…}]对应着[单个单词,次数的集合(来自每个Map任务)]。

以第一个Map任务的输入为例,[K1, V1] 分别对应[0,”hellobigdata cs”]

以第二个Map任务的输出为例,[K2, V2] 分别对应[bigdata,1]或[cs,2],

以第二个Reduce任务的输入为例,[K2, {V2,…}]对应着[cs,{1,2,1}]

以第二个Reduce任务的输出为例,[K3, V2]对应着[hello,2]

按照(Key,Value)的值域来比较,验证了该结论:

K1不等于K2,V1不等于V2;

K3等于K2,V3等于V2

四、思考题

假设sort要对一亿个长整型数据进行排序,该场景下Shuffle过程不存在Group操作,那么三组(Key,Value)分别对应什么?

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值