MapReduce是一个用于大规模数据集的并行处理的分布式计算的编程框架。MapReduce将一个数据处理过程拆分为Map和Reduce两部分:Map是映射,负责数据的过滤分发;Reduce是规约,负责数据的计算归并。开发人员只需通过编写map和reduce函数,不需要考虑分布式计算框架的运行机制,即可在Hadoop集群上实现分布式运算。MapReduce可以帮助开发人员将精力集中在业务逻辑的开发上,分布式计算的复杂性交由框架来处理。MapReduce把对数据集的大规模操作分发到计算节点,计算节点会周期性地返回其工作的最新状态和结果。如果结点保持沉默超过一个预设时间,主节点则将该节点标记为死亡状态,并把已分配该节点数据发送到其他结点重新计算,从而实现数据处理任务的自动调度。
Hadoop支持多种语言进行MapReduce编程,包括Java、Ruby、Python和C++等。在Hadoop平台上运行MapReduce程序,主要人物是将HDFS存储的大文件数据分发给多个计算节点上的Map程序进行处理,然后再由计算节点上的Reduce程序合并或进一步处理多个节点上的计算机结果。步骤如下:
(1)编写Hadoop中org.apache.hadoop.mapreduce.Mapper类的子类,并实现map方法;
(2)编写Hadoop中org.apache.hadoop.mapreduce.Reducer类的子类,并实现reduce方法;
(3)编写main程序,设置MapReduce程序的配置,并指定任务的Map程序类(第一步的Java类),Reduce程序类等(第二步的Java类),指定输入/输出文件及格式,提交任务等;
(4)将(1)~(3)的类文件与Hadoop自带的包打包为jar文件,并分发到Hadoop集群的任意节点。
(5)运行main程序,任务自动在Hadoop集群上运行;
(6)到指定文件夹查看计算结果;
Map程序和Reduce程序的输入/输出都是以Key-Value对的形式出现的,定义map函数的输出和reduce函数的输入的Key-Value的格式必须一致,MapReduce的调度程序完成Map和Reduce间的数据传递。