数据来自美国国家气候数据中心(National Climatic Data Center,简称NCDC)。这些数据按行并以ASCII格式存储,其中一行是一条记录。下面显示了一行采样数据,为了给读者了解字段,拆分解释。
从1901年到2001年,每一年都有一个目录,每个目录中包含各个气象站该年气象数据的打包文件及说明文件。
MapReduce任务过程分为两个处理阶段:map阶段和reduce阶段。每个阶段都以键值对作为输入和输出,其类型由程序员选择。
为了实现横向扩展,把数据存储在分布式文件系统中(典型的为HDFS),通过使用Hadoop资源管理系统YARN,Hadoop将MapReduce计算转移到存储有部分数据的各台机器上。
MapReduce 作业 (job)是客户端需要执行的一个工作单元:它包括输入数据、MapReduce程序和配置信息。Hadoop将作业分成若干个任务(task)来执行,其中包含两类任务:map任务和reduce任务。这些任务运行在集群的节点上,并通过YARN进行调度。如果一个任务失败,它将在另一个不同的节点上自动重新调度运行。
Hadoop将MapReduce的输入数据划分为等长的小数据块,称为输入分片(input split)。Hadoop为每个分片构建一个map任务,并由该任务来运行用户自定义的map函数从而处理分片中的每条记录。对于大多数作业来说,一个合理的分片大小趋向于HDFS的一个块的大小,默认是128MB。
Hadoop在存储有输入数据(HDFS中的数据)的节点上运行map任务,可以获得最佳性能,因为它无需使用宝贵的集群带宽资源。有时对于一个map任务的输入分片来说,存储该分片的HDFS数据块副本的所有节点可能正在运行其他map任务,此时作业调度需要从某一数据块所在事务机架中的一个节点上寻找一个空闲的map槽(slot)来运行该map任务分片。仅仅在非常偶然的情况下,会使用其他机架中的节点运行该map任务,这将导致机架与机架之间的网络传输。
map任务将其输出写入本地硬盘,而非HDFS。map输出的是中间结果,由reduce任务处理后才产生最终输出结果,而且一旦作业完成,map的输出结果就可以删除。如果把它存储在HDFS中并实现备份,难免有些小题大做。如果运行map任务的节点在将map中间结果传送给reduce任务之前失败,Hadoop将在另一个节点上重新运行这个map任务以再次构建map中间结果。
combiner函数:集群上的可用带宽限制了MapReduce作业的数量,因此尽量避免map和reduce任务之间的数据传输是有利的。Hadoop允许用户针对map任务的输出指定一个combiner(就像mapper和reduce一样),combiner函数的输出作为reduce函数的输入。由于combiner属于优化方案,所以Hadoop无法确定要对一个指定的map任务输出记录调用多少次combiner(如果需要)。换而言之,不管调用combiner多少次,0次、1次或多次,reducer的输出结果都是一样的。