您的位置:首页 > 运维架构

【Hadoop权威指南】MapReduce简介(第二天)

2015-06-26 13:58 671 查看
MapReduce是一种用于数据处理的编程模型。该模型非常简单。同一个程序Hadoop可以运行于各种语言编写的MapReduce程序。MapReduce程序本质上是并行的,MapReduce的优势在于处理大型数据集。

使用Hadoop进行数据分析

MapReduce的工作过程分为两个阶段:map阶段和reduce阶段。每个阶段都有键/值对作为输入和输出,并且它们的类型可由程序员选择。程序员还具体定义了两个函数:map函数和reduce函数。

MapReduce作业(job)是客户端执行的单位:它包括输入数据、MapReduce程序和配置。Hadoop通过把作业分成若干个小任务(task)来工作,其包括两种类型的任务:map任务和reduce任务。

有两种类型的节点控制着作业执行过程:jobtracker和多个tasktracker。Jobtracker通过调度任务在tasktracker上运行,来协调所有运行在系统上的作业。Tasktracker运行任务的同时,把进度报告传送到jobtracker,jobtracker则记录着每项任务的整体进展。如果其中一个任务失败,jobtracker可以重新调度任务到另外一个tasktracker。Hadoop把输入数据划分成等长的小数据发送到MapReduce,称为输入分片(input
split)或分片。Hadoop为每个分片(split)创建一个map任务,由它来运行用户自定义的map函数来分析每个分片中的记录。

拥有许多分片就意味着处理每个分片的时间与处理整个输入的时间相比是比较小的。因此,如果我们并行处理每个分片,且分片是小块的数据,那么处理过程将有一个更好的负载均衡,因此更快的计算机讲能够比一台速度较慢的机器在作业过程中处理完比例更多的数据分片。即使是相同的机器,没有处理的或其他同时运行的作业也会使负载均衡得以实现,并且在分片变得更细时,负载平衡质量也会更佳。

另一方面,如果分片太小,那么管理分片的总时间和map任务创建的总时间将决定作业的执行的总时间。对于大多数作业,一个理想的分片大小往往是一个HDFS块的大小,默认是64MB,虽然这可以根据集群进行调整(对于所有新建文件)或在新建每个文件时具体进行指定。

map任务的执行节点和输入数据的存储节点是同一个节点,Hadoop的性能达到最佳。

map任务把输出写入本地硬盘,而不是HDFS。这是为什么?因为map的输出作为中间输出:而中间输出则被reduce任务处理后产生最终的输出,一旦作业完成,map的输出就可以删除了。

reduce任务并不具备数据本地读取的优势——一个单一的reduce任务的输入往往来自于所有mapper的输出。

reduce任务的数目并不是由输入的大小来决定,而是单独具体指定的。



图1:MapReduce中单一reduce任务的数据流图



图2:多个reduce任务的MapReduce数据流
集群的可用带宽限制了MapReduce作业的数量,因此map和reduce任务之间数据传输的代价是最小的。

运行分布式MapReduce作业

同一个程序将在一个完整的数据集中直接运行而不做更改。这是MapReduce的优势之一:它扩充数据大小和硬件规模。

Hadoop流

Hadoop提供了一个API来运行MapReduce,并允许你用除java以外的语言来编写自己的map和reduce函数。Hadoop流使用Unix标准流作为Hadoop和程序之间的接口,所以可以使用任何语言,只要编写的MapReduce程序能够读取标准输入,并写入到标准输出。

流适用于文字处理,在文本模式下使用时,它有一个面向行的数据视图。map的输入数据把标准输入流传输到map函数,其中是一行一行的传输,然后再把行写入标准输出。一个map输出的键/值对是以单一的制表符分割的行来写入的。reduce函数的输入具有相同的格式——通过制表符来分割的键/值对——传输标准输入流。reduce函数从标准输入流读入行,然后为保证结果的有序性用键来排列,最后讲结果写入标准输出。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  hadoop hdfs mapreduce