【图书连载】MapReduce是一种可用于数据处理的编程模型。该模型比较简单,但用于编写有用的程序并不简单。Hadoop可以运行由各种语言编写的MapReduce程序。本章中,我们将看到用Java、Ruby、Python 和C++语言编写的同一个程序。最重要的是,MapReduce程序本质上是并行运行的,因此可以将大规模的数据分析任务交给任何一个拥有足够多机器的运营商。MapReduce的优势在于处理大规模数据集,所以这里先来看一个数据集。
一个气象数据集
在我们的例子里,要编写一个挖掘气象数据的程序。分布在全球各地的很多气象传感器每隔一小时收集气象数据,进而获取了大量的日志数据。由于这些数据是半结构化数据且是按照记录方式存储的,因此非常适合使用MapReduce来处理。
数据的格式
我们将使用国家气候数据中心(National Climatic Data Center,简称NCDC,网址为http://www.ncdc.noaa.gov/)提供的数据。这些数据按行并以ASCII编码存储,其中每一行是一条记录。该存储格式能够支持众多气象要素,其中许多要素可以有选择性地列入收集范围或其数据所需的存储长度是可变的。为了简单起见,我们重点讨论一些基本要素(如气温等),这些要素始终都有且长度固定。
例2-1显示了一行采样数据,其中重要字段已突出显示。该行数据已被分成很多行以突出显示每个字段,在实际文件中,这些字段被整合成一行且没有任何分隔符。
例2-1. 国家气候数据中心数据记录的格式
0057 332130 # USAF weather station identifier
99999 # WBAN weather station identifier
19500101 # observation date
0300 # observation time
4 +51317 # latitude (degrees x 1000)
+028783 # longitude (degrees x 1000) F
M-12
+0171 # elevation (meters)
99999
V020
320 # wind direction (degrees)
1 # quality code
N
0072
1
00450 # sky ceiling height (meters)
1 # quality code
C
N
010000 # visibility distance (meters)
1 # quality code
N
9 -0128 # air temperature (degrees Celsius x 10)
1 # quality code -0139
# dew point temperature (degrees Celsius x 10)
1 # quality code 10268
# atmospheric pressure (hectopascals x 10)
1 # quality code
数据文件按照日期和气象站进行组织。从1901 年到2001 年,每一年都有一个目录,每一个目录中包含各个气象站该年气象数据的打包文件及其说明文件。例如,1999年对应文件夹下面包含如下记录:
% ls raw/1990 | head
010010-99999-1990.gz
010014-99999-1990.gz
010015-99999-1990.gz
010016-99999-1990.gz
010017-99999-1990.gz
010030-99999-1990.gz
010040-99999-1990.gz
010080-99999-1990.gz
010100-99999-1990.gz
010150-99999-1990.gz
因为有成千上万个气象台,所以整个数据集由大量的小容量文件组成。通常情况下,处理少量的大型文件显得更容易且有效,因此,这些数据需要经过预处理,将每年的数据文件拼接成一个独立文件。具体做法请参见附录C。