《MapReduce设计模式》一1.3 MapReduce和Hadoop简介

Hadoop MapReduce作业被分成一系列运行在分布式集群中的map任务和reduce任务。每个任务都工作在被指定的小的数据子集上,因此负载是遍布集群中各个节点上的。map任务主要负责数据的载入、解析、转换和过滤。每个reduce任务负责处理map任务输出结果的一个子集。然后,reducer任务从mapper任务处复制map任务的中间数据,进行分组和聚合操作。从简单的数值聚合到复杂的关联操作以及笛卡儿积操作,MapReduce通过如此简洁的架构来解决范围广泛的诸多问题,这确实让人难以置信。

MapReduce作业的输入是一系列存储在Hadoop分布式文件系统(Hadoop Distributed File System,HDFS)上的文件。在Hadoop中,这些文件通过输入格式(input format)被分成了一系列的输入split(input split)。输入split可以看作是文件在字节层面的分块表示,每个split由一个map任务负责处理。

Hadoop中的每个map任务可以细分成4个阶段:record reader、mapper、combiner和partitioner。map任务的输出被称为中间键和中间值,会被发送到reducer做后续处理。reduce任务可以分为4个阶段:混排(shuffle)、排序(sort)、reducer和输出格式(output format)。map任务运行的节点会优先选择在数据所在的节点,因此,一般可以通过在本地机器上进行计算来减少数据的网络传输。

record reader
record reader通过输入格式将输入split解析成记录。record reader的目的是将输入数据解析成记录,但不负责解析记录本身。它将数据转换为键/值(key/value)对的形式,并传递给mapper处理。通常键是数据在文件中的位置,值是组成记录的数据块。定制record reader已经超出了本书的讨论范围,因此我们假设读者已经有合适的record reader来解析需要处理的数据。

map
在mapper中,用户定义的map代码通过处理record reader解析的每个键/值对来产生0个或多个新的键/值对结果。键/值的选择对MapReduce作业的完成效率来说非常重要。键是数据在reducer中处理时被分组的依据,值是reducer需要分析的数据。如何选择键/值对的更多细节会在本书后面的设计模式中进行详细解释。两个不同的MapReduce设计模式之间的一个重要区别就在于键/值对的语义。

combiner
combiner是一个可选的本地reducer,可以在map阶段聚合数据。combiner通过执行用户指定的来自mapper的中间键对map的中间结果做单个map范围内的聚合。例如,一个聚合的计数是每个部分计数的总和,用户可以先将每个中间结果取和,再将中间结果的和相加,从而得到最终结果。在很多情况下,这样可以明显地减少通过网络传输的数据量。在网络上发送一次(hello world,3)要比三次(hello world,1)节省更多的字节量。因为combiner的应用广泛,所以我们将在后续的模式中对其进行更深入的讲解。很多新Hadoop代码开发者可能会忽视combiner,但通常combiner可以产生特别大的性能提升,并且没有副作用。我们将在后续的章节中指出哪些模式可以通过使用combiner得到优化,以及哪些模式是不能使用combiner的。combiner不能保证执行,因此不能作为整个算法的一部分。

partitioner
partitioner的作用是将mapper(如果使用了combiner的话就是combiner)输出的键/值对拆分为分片(shard),每个reducer对应一个分片。默认情况下,partitioner先计算目标的散列值(通常为md5值)。然后,通过reducer个数执行取模运算key.hashCode()%(reducer的个数)。这种方式不仅能够随机地将整个键空间平均分发给每个reducer,同时也能确保不同mapper产生的相同键能被分发至同一个reducer。用户可以定制partitioner的默认行为,并可以使用更高级的模式,如排序。当然,一般情况下是不需要改写partitioner的。对于每个map任务,其分好区的数据最终会写入本地文件系统,等待其各自的reducer拉取。

混排和排序
reduce任务开始于混排和排序这一步骤。该步骤主要是将所有partitioner写入的输出文件拉取到运行reducer的本地机器上,然后将这些数据按照键排序并写到一个较大的数据列表中。排序的目的是将相同键的记录聚合在一起,这样其所对应的值就可以很方便地在reduce任务中进行迭代处理。这个过程完全不可定制,而且是由框架自动处理的。开发人员只能通过自定义Comparator对象来确定键如何排序和分组。

reduce
reducer将已经分好组的数据作为输入,并依次为每个键对应分组执行reduce函数。reduce函数的输入是键以及包含与该键对应的所有值的迭代器。在后文介绍的模式中,我们将看到在这个函数中有很多种处理方法。这些数据可以被聚合、过滤或以多种方式合并。当reduce函数执行完毕后,会将0个或多个键/值对发送到最后的处理步骤——输出格式。和map函数一样,因为reduce函数是业务处理逻辑的核心部分,所以不同作业的reduce函数也不相同。

输出格式
输出格式获取reduce函数输出的最终键/值对,并通过record writer将它写入到输出文件中。每条记录的键和值默认通过tab分隔,不同记录通过换行符分隔。虽然一般情况下可以通过自定义实现非常多的输出格式,但是,不管是什么格式,最终的结果都将写到HDFS上。和record reader一样,如何定制输出格式不在本书的讨论范围,因为那是对I/O的简单处理。

时间: 2024-08-27 21:04:23

《MapReduce设计模式》一1.3 MapReduce和Hadoop简介的相关文章

《MapReduce设计模式》一1.4 Hadoop示例:单词计数

1.4 Hadoop示例:单词计数 在介绍完MapReduce的整个处理过程之后,让我们来看一个简单的示例:单词计数(Word Count)."单词计数"程序是一个典型的MapReduce示例,因为它既简单,又很适合使用MapReduce高效地处理.很多人会抱怨说"单词计数"作为示例已经被用过太多次了,希望本书后面的内容能弥补这一点! 在这个特定的示例中,我们将对StackOverflow网站上用户提交的评论进行单词计数.网页中Text域的内容将被抽取出来并做一些预

《MapReduce设计模式》一导读

前 言 MapReduce设计模式欢迎阅读<MapReduce设计模式>!这是一本既独特又熟悉的书.首先,这显然是一本关于设计模式的书,为大家提供解决问题的模板或通用指南.我们看了一些以前出版的有关设计模式的书,特别是Gamma等人(1995)编著的<Design Patterns: Elements of Reusable Object-Oriented Software>(通常被成为"四人组"书),从中汲取了灵感.在每个模式的描述中,读者都会看到一个我们反复

hadoop MapReduce设计模式学习笔记

使用MapReduce解决任何问题之前,我们需要考虑如何设计.并不是任何时候都需要map和reduce job. 1 MapReduce设计模式(MapReduce Design Pattern)         1.1 Input-Map-Reduce-Output         1.2 Input-Map-Output         1.3 Input-Multiple Maps-Reduce-Output         1.4 Input-Map-Combiner-Reduce-Ou

《MapReduce设计模式》一1.1 设计模式

1.1 设计模式 近些年来,设计模式使开发者的工作变得更轻松.这些设计模式为解决问题提供了可复用的通用方法,开发者在遇到问题时可以花更少的时间来思考解决问题的策略,从而有更多的时间用来迎接新的挑战.与此同时,开发者积累的丰富经验也有了简洁的方式传递给新入门的开发者. 在软件工程的设计模式领域中,有一个重要里程碑,即<Design Patterns:Elements of Reusable Object-Oriented Software>一书(由Gamma等人所著),通常也被称为"四

《MapReduce设计模式》一1.5 Pig和Hive

1.5 Pig和Hive 在Hadoop生态系统中有了Hive和Pig这类工具,对MapReduce设计模式没有太强烈的需求.但我们还是想借本书的开始部分解释为什么MapReduce设计模式依然如此重要. Pig和Hive是对MapReduce更高层次的抽象.虽然它们提供的接口与"map"和"reduce"无关,但实际上它们会将较高级的语言翻译成一组MapReduce作业.就像关系型数据库管理系统(RDBMS)中的查询计划器(query planner)会将SQL语

《MapReduce设计模式》一设计模式与MapReduce

第1章 设计模式与MapReduce MapReduce设计模式MapReduce是处理数据分布在数百台机器上的计算框架,近些年来,随着其在Google.Hadoop及其他一些系统中的应用而越来越流行起来.这个计算框架超乎寻常地强大,但它并不是一种针对"大数据"问题的通用解决方案,因此,虽然可以很好地适用于一些问题,但对有些问题来说,解决起来还是非常具有挑战性的.本书将介绍哪些问题适合使用MapReduce计算框架来解决,以及如何高效地使用MapReduce计算框架. 很多初步了解Ma

《MapReduce设计模式》一1.2 MapReduce简史

1.2 MapReduce简史 是什么触动我们写一本MapReduce设计模式的书呢?当前,社区的发展势头和广泛使用的设计模式已经积累到了一个关键点,使得汇总整理一份设计模式清单供开发者分享成为可能.在前几年,Hadoop的发展初期,还没有足够的这方面的经验积累.但MapReduce的发展速度超乎寻常.从2004年Google公开发布MapReduce的论文开始,到2012年为止,Hadoop已经成长为了被广泛采用的分布式数据处理的业界标准. MapReduce的真实起源是存在争议的,但引领我们

《深入理解Hadoop(原书第2版)》——第2章 Hadoop中的概念 2.1 Hadoop简介

第2章 Hadoop中的概念 价格实惠的普通计算机经常满足不了应用程序的计算资源需求,很多企业的业务应用程序已经不再适合在单台廉价的计算机上运行.这时,一个简单昂贵的解决方案就是购买一些具有多CPU的高端服务器,这通常需要巨额资金.只要能买到最高端的服务器,这个解决方案就能够达到理想的效果,但预算往往是个大问题.另一个替代方案,就是搭建一个高可用的集群,这个集群经过专业的安装和精心的管理服务,使用起来就像一台计算机一样.很多高可用的集群都是企业专有的而且价格也十分贵. 为了获取所需的计算资源,一

hadoop简介

Apache Hadoop更准确的说是一个基础架构平台.主要提供分布式文件存储,云计算. 具体这个大平台包括Hadoop内核.MapReduce.Hadoop分布式文件系统(HDFS)以及一些相关项目,有Apache Hive和Apache HBase等等. 使用hadoop,要结合zookeeper,Hbase使用. 目前有2个主要版本,1.0和2.0.其中各个版本的文件结构都是不兼容的.但是原理都差不多.而对于map/reduce,2.0中采用了新的架构yarn.进一步解决了单点问题. 目前