写个Hadoop Map-Reduce分析NCDC的天气数据

我是Hadoop小白,写本文是总结笔记,怕之后忘了。

搭个Hadoop Cluster

因为手头有几个Raspberry Pi 3的板子,就花了点时间搭了一个小的Hadoop Cluster的集群,四个Slave with Raspbian, Master server在一个虚拟机里安装了Ubuntu 18.04。关于如何配置,IBM上的这篇Blog讲得非常详细。

NCDC的天气数据

在《Hadoop Definitive Guide》上讲到使用NCDC(National Climatic Data Center)的天气数据来分析每年最高的气温。这本书在Github上有1901年和1902年的数据,但如果你想试试更大的数据集就需要自己下载了。

这里有一个Shell Script可以帮你从NCDC的FTP上下载天气数据。你只需要给出起始和终止年份。

下载之后,天气数据会分到不同的zip文件里,但如果上传到HDFS上还要把它放到一个文件里。下面这段Python代码就做这个事情。

要注意的就是,这段代码要运行在天气的Zip同一个文件夹里。

我下载了1901年到1935年的数据,大约400多M,使用hadoop fs的命令上传到HDFS上,

然后就可以写一个简单的Map – Reduce了。

因为HDFS一个Block是128M,所以400M需要4个Block。

Map-Reduce

首先是Mapper,其实就是分析天气文件的每一行,从里面取出温度。

Reducer则是从前面得到的年份和温度的信息汇总在一些,求出当年里最高的气温。

这个过程很像Java 8里引入的Stream。

之后,还要实现一个Job来执行这个Map-Reduce任务。

这个程序需要两个路径,一是NCDC的数据文件,一是结果的输出路径。Job还要需要明确Mapper和Recuder的类名。

生成Jar文件后,使用下面的命令行运行Map-Reduce任务

结果会被发到output4文件夹里,几分钟后,就可以看到结果了。

好了,Hadoop里的HelloWorld算是完成了!

References