《R与Hadoop大数据分析实战》一2.2 Hadoop MapReduce技术简介

本节书摘来自华章出版社《R与Hadoop大数据分析实战》一书中的第2章,第2.2节,作者 (印)Vignesh Prajapati,更多章节内容可以访问云栖社区“华章计算机”公众号查看

2.2 Hadoop MapReduce技术简介

一般而言,MapReduce模型可以使用多种语言实现,除此之外,Hadoop MapReduce也是一个用于方便编写应用程序的流行Java语言框架。通过把大数据在大机群(一般有数千台计算机)上并行运算,实现整个系统的高可靠性和高容错性。MapReduce分为Map和Reduce两阶段,并主要处理键值对类型的数据。Map和Reduce任务运行于集群中,Map阶段的输出作为Reduce阶段的输入。
所有数据的输入元素在MapReduce处理时均不能被更新,一旦Map任务的输入数据(键值对数据)发生变化,也不会影响输入文件。Map执行单元的输出将会以键为基础分配到适当的Reduce执行单元中,并作为其输入。这种数据的次序处理方式在Hadoop MapReduce算法以及Hadoop集群的帮助下将会对并行运算发挥极大的益处。
MapReduce程序会将以列表形式输入的数据集同样转化为列表形式输出。这种列表的转化过程几乎在Map和Reduce阶段中要重复两次。我们也可以在这些重复过程中配置Map和Reduce执行单元的个数。在下一节中,我们将介绍基于旧版本API内MapReduce的基本概念。

2.2.1 MapReduce中包含的实体

Hadoop用于分析大数据时使用的概念如下:
Client:用于作业的初始化
JobTracker:用于作业的状态监控
TaskTracker:用于作业的实际执行
HDFS:用于存储输入和输出数据

2.2.2 MapReduce中的主要执行进程

Hadoop MapReduce处理数据的四个主要过程如下:
数据导入HDFS中
Map阶段的执行
重组(shuffing)并排序(sorting)
Reduce阶段的执行
数据导入HDFS中
将输入数据集上传到Hadoop的目录中,才能被MapReduce所使用。Hadoop分布式文件系统(Hadoop Distributed File System,HDFS)将会把输入数据分割为多个分支并存储于集群的多个数据节点中,并通过重复复制实现容错机制。所有的这些数据分支将会通过Map任务和Reduce任务的TaskTracker进程以并行方式来处理。
这里还有另外一些Hadoop组件用于从HDFS中获取数据集:
Sqoop:这是一个开源的设计工具,主要用于在Apache Hadoop和结构化关系型数据库之间传输大量数据。假如你的应用中已经配置了MySQL数据库,同时还想使用该数据进行数据分析,那么推荐使用Sqoop工具把数据库内的数据导入HDFS文件系统中。同时当完成数据分析后,Sqoop工具也用于把分析结果数据导出MySQL数据库。
Flume:它是一种用于向HDFS文件系统中提供高效收集、聚合、移动大量日志数据的服务,其性能可靠,并以分布式方式运行。Flume可以读取几乎所有的源数据,例如日志文件、系统日志、其他UNIX系统进程的标准化输出。
使用上面这些数据收集和移动的框架,可以使MapReduce在处理大数据分析时的数据迁移过程变得非常简单。
Map阶段的执行
执行client应用程序以启动Hadoop MapReduce进程。然后在Map阶段复制作业资源并存储于HDFS中,之后调用JobTracker以执行作业。JobTracker首先初始化作业,然后检索输入数据并分割信息,最后为每个作业创建一个Map任务。
JobTracker将会调用TaskTracker以运行Map任务,其输入是已分配好的数据集。Map任务以键值对形式读取分割后的数据作为输入。键值对提供了后续产生键值对格式中间数据的映射方法。对于每个键值对数据,至少对应一个输出。
《R与Hadoop大数据分析实战》一2.2 Hadoop MapReduce技术简介

之后会产生多个键值对数据,以至于键会被重复很多次。所以可这些键将会被再次应用于Reduce执行单元中。只要格式正确,Map阶段的输出数值和Reduce阶段的输入数值也一定会是一致的。
当完成Map阶段的操作后,TaskTracker会把结果放于它的缓冲存储区或本地磁盘中(如果输出数据的大小超过某一阈值时)。
例如,假设我们有个用于把输入文本数据转化为小写格式的Map函数,它将会把一系列的输入字符串转化为小写字符串。
键与值:在MapReduce中,根据不同的键,每个值都有它的定义。Map处理单元接收这些键值对数据,并且与输入数据的数据类型相关,其数据类型在作业配置文件中进行说明。
重组并排序
为了优化MapReduce程序,Map阶段与Reduce阶段的中间衔接阶段很重要。
只要Map输出了有效的数据,那么中间阶段的处理程序就将会被自动调用。当完成了Map阶段处理过程,所有产生的键值对中间数据将会被Partitioner函数分割。Partitioner函数的输出将会依据键进程排序。排序操作的输出数据将会存储于该节点计算机的缓冲区和TaskTracker内。
Combiner函数通常就是Reduce执行单元自身。因此数据压缩不是通过Gzip或者与之相似的压缩形式,而是通过映射输出数据节点上的Reduce执行单元进行压缩。数据通过Combiner函数回归然后重组,再传输到Reduce节点上。为了加快数据从Map执行单元输出到TaskTracker上Reduce执行单元之间的数据传输,需要用Combiner函数压缩输出结果。默认情况下,Map执行单元输出结果将会被存入缓冲存储器,如果输出大小大于临界值,输出结果会被存储在本地磁盘上。输出数据将可以通过超文本传输协议获取(HTTP)。
Reduce阶段的执行
一旦Map执行单元输出了有效数据,Reduce节点计算机的TaskTracker将会接收到被分割的Map阶段的输出数据,然后数据将会被重新组成为一个大的数据文件,并再排序后提供给Reducer方法进行处理。
Reducer方法接收到一系列输入数据,格式为(key,list(value)),并基于一般逻辑进行聚集(aggregates),最后产生(key,value)格式的输出。

《R与Hadoop大数据分析实战》一2.2 Hadoop MapReduce技术简介

Reducer方法输出后的结果以指定的格式直接写入HDFS系统中,指定格式的方式是在MapReduce job的配置中进行设定。

2.2.3 MapReduce的局限

Hadoop MapReduce的局限性:
MapReduce框架难以利用在诸如实时流、图形处理以及信息传递这样的复杂逻辑中。
相比于有索引的数据库,在分散的、无索引的数据中进行数据查询是无效的。然而,如果数据的索引是后来产生的,在移动或是增加数据时,需要维持该索引。
不能同时运行Reduce任务和Map任务来减少整体的处理时间,因为只有获取Map任务的结果后,Reduce任务才能开始。(Reduce执行单元的输入完全依赖于Map执行单元的输出)并且,我们不能控制Map和Reduce任务执行的顺序。但是有时候,基于应用逻辑,在Map任务结束需要进行数据收集的情况下,我们可以理所当然地为Reduce任务配置延迟启动。
如果Reduce任务花费太多时间但是最后以失败告终,或者没有其他Reduce任务槽可供重新安排Reduce任务,糟糕的资源利用情况会使长期运行的Reduce任务无法完成(这可以通过YARN来解决)。

2.2.4 MapReduce 可以解决的问题

既然本书要对数据分析给出解决方案,那就应该提供一些分析数据的相关实例。例如,如果某读者对以前他人提及的内容有相似的问题,Hadoop将发挥作用。Hadoop不是一个对所有大数据问题的通用解决方案。它只是把欲处理的大数据分割成小块,并通过分布式的服务实现并行处理而已。这使得在处理超大数据时,可以节省更多的时间并把成本降低。
如果可以把问题设计为Map和Reduce两个阶段处理的方式,那么就可以使用MapReduce技术进行解决。一般而言,Hadoop技术在处理数据时不会局限于机器的内存大小(R语言在运行数据处理进程时,则会经常出现如下错误提示:cannot allocate vector of size 2.5 GB)

2.2.5 使用Hadoop编程时用到不同的Java概念

一些经典的Java概念使得Hadoop更加容易理解。如下:
远程过程调用:这是一项进程间通信,它允许计算机程序发起一个运行在另一个地址空间(通常是在共享网络的另一台计算机上)的子程序或过程,而不需要程序员编写远程交互的细节代码。也就是说,本质上无论子程序运行在本地程序还是远程程序,程序员都编写相同的代码。
序列化/反序列化:序列化指一台Java虚拟机(JVM)可以向一些流中输出对象的状态,这样我们能够基本上读出所有的成员并将其状态传输或存储到流、磁盘等。默认机制是二进制格式,因此它比文本格式更紧凑。通过序列化,机器能够通过网络传输数据。反序列化亦然,它被用于通过网络接收数据对象。
Java泛型:当提供编译期类型安全性时,它允许用一种类型或是方法来操纵各种不同类型的对象,让Java成为一种完全静态类型的语言。
Java集合:这个框架是一组类和接口,用于使用简单的Java对象收集各种不同类型的数据。
Java并发:它支持并行程序设计,并且所有程序执行由线程内容完成。它主要用于在单一操作系统进程中作为一组线程执行计算过程。
简单的Java对象(POJO):实际就是普通的JavaBeans。POJO暂时用于设置以及检索数据对象的值。

上一篇:LinqToExcel.Extend 源码分析


下一篇:jquery插件制作 -- 1.我们的第一个插件:txtHover