附录C 准备NCDC气象数据

这里首先简要介绍如何准备原始气象数据文件,以便我们能用Hadoop对它们进行分析。如果打算得到一份数据副本供Hadoop处理,可按照本书配套网站(网址为http://www.hadoopbook.com/)给出的指导进行操作。接下来,首先说明如何处理原始的气象文件。

原始数据实际是一组经过bzip2压缩的tar文件。每个年份的数据单独放在一个文件中。部分文件列举如下:


  1. 1901.tar.bz2
  2. 1902.tar.bz2
  3. 1903.tar.bz2
  4. ...
  5. 2000.tar.bz2

各个tar文件包含一个gzip压缩文件,描述某一年度所有气象站的天气记录。(事实上,由于在存档中的各个文件已经预先压缩过,因此再利用bzip2对存档压缩就稍显多余了)。示例如下:


  1. % tar jxf 1901.tar.bz2
  2. % ls -l 1901 | head
  3. 011990-99999-1950.gz
  4. 011990-99999-1950.gz
  5. ...
  6. 011990-99999-1950.gz

由于气象站数以万计,所以整个数据集实际上是由大量小文件构成的。鉴于Hadoop对少量的大文件的处理更容易、更高效(参见7.2.1节),所以在本例中,我们将每个年度的数据解压缩到一个文件中,并以年份命名。上述操作可由一个MapReduce程序来完成,以充分利用其并行处理能力的优势。下面具体看看这个程序。

该程序只有一个map函数,无reduce函数,因为map函数可并行处理所有文件操作,无需整合步骤。这项处理任务能够用一个Unix脚本进行处理,因而在这里使用面向MapReduce的Streaming接口比较恰当。请看范例C-1。

范例C-1. 利用bash脚本来处理原始的NCDC数据文件并将其存储在HDFS中

Example C-1. Bash script to process raw NCDC datafiles and store them in HDFS
#!/usr/bin/env bash

# NLineInputFormat gives a single line: key is offset, value is S3 URI
read offset s3file
#读取每一行 第一个参数到offset 第二个打牌s3file
# Retrieve file from S3 to local disk
echo "reporter:status:Retrieving $s3file" >&2
$HADOOP_HOME/bin/hadoop fs -get $s3file . # Un-bzip and un-tar the local file
target=`basename $s3file .tar.bz2`
mkdir -p $target
echo "reporter:status:Un-tarring $s3file to $target" >&2
tar jxf `basename $s3file` -C $target # Un-gzip each station file and concat into one file
echo "reporter:status:Un-gzipping $target" >&2
for file in $target/*/*
do
gunzip -c $file >> $target.all
echo "reporter:status:Processed $file" >&2
done # Put gzipped version into HDFS
echo "reporter:status:Gzipping $target and putting in HDFS" >&2
gzip -c $target.all | $HADOOP_HOME/bin/hadoop fs -put - gz/$target.gz

输入是一个小的文本文件(ncdc_files.txt),列出了所有待处理文件(这些文件放在S3文件系统中,因此能够以Hadoop所认可的S3 URI的方式被引用)。示例如下:


  1. s3n://hadoopbook/ncdc/raw/isd-1901.tar.bz2
  2. s3n://hadoopbook/ncdc/raw/isd-1902.tar.bz2
  3. ...
  4. s3n://hadoopbook/ncdc/raw/isd-2000.tar.bz2

通过将输入格式指定为NLineInputFormat,每个mapper接受一行输入(包含必须处理的文件)。处理过程在脚本中解释,但简单说来,它会解压缩bzip2文件,然后将该年份所有文件整合为一个文件。最后,该文件以gzip进行压缩并复制至HDFS之中。注意,使用指令hadoop fs –put - 能够从标准输入中,获得数据。

状态消息输出到“标准错误”(以reporter:status为前缀),可以解释为MapReduce状态更新。这告诉Hadoop该脚本正在运行,并未挂起。

运行Streaming作业的脚本如下:


  1. % hadoop jar $HADOOP_INSTALL/contrib/streaming/hadoop-*-streaming.jar \
  2. -D mapred.reduce.tasks=0 \
  3. -D mapred.map.tasks.speculative.execution=false \
  4. -D mapred.task.timeout=12000000 \
  5. -input ncdc_files.txt \
  6. -inputformat org.apache.hadoop.mapred.lib.NLineInputFormat \
  7. -output output \
  8. -mapper load_ncdc_map.sh \
  9. -file load_ncdc_map.sh

易知,这是一个“只有map”的作业,因为reduce任务数为0。以上脚本还关闭了推测执行(speculative execution),因此重复的任务不会写相同的文件(6.5.3节所讨论的方法也是可行的)。任务超时参数被设置为一个比较大的值,使得Hadoop不会杀掉那些运行时间较长的任务(例如,在解档文件或将文件复制到HDFS时,或者当进展状态未被报告时。)

最后,调用distcp将文件从HDFS中复制出来,再存档到S3文件系统中。

附录C 准备NCDC气象数据(加解释)的更多相关文章

  1. pyhton读取json格式的气象数据

    原文关于读取pm25.in气象数据的pyhton方法,以及浅析python json的应用 以pm25.in网站数据为例. 1.方法介绍 首先感谢pm25.in提供了优质的空气污染数据,为他们的辛勤劳 ...

  2. 基于python的《Hadoop权威指南》一书中气象数据下载和map reduce化数据处理及其可视化

    文档内容: 1:下载<hadoop权威指南>中的气象数据 2:对下载的气象数据归档整理并读取数据 3:对气象数据进行map reduce进行处理 关键词:<Hadoop权威指南> ...

  3. JQuery 之 在数据加载完成后才自动执行函数

    数据加载完成执行: $(window).load(function(){ ... }); 进入页就执行,不论等数据是否加载完成: $(document).ready(function(){ ... } ...

  4. GreenPlum数据加载

    1. copy命令 对于数据加载,GreenPlum数据库提供copy工具,copy工具源于PostgreSQL数据库,copy命令支持文件与表之间的数据加载和表对文件的数据卸载.使用copy命令进行 ...

  5. 中国气象网 气象数据开放平台 API用法 (Android)

    因为要做个天气应用.须要找个天气的API.上网上搜了下都是那几个,并且基本都过时了.百度有个天气API,只是貌似仅仅能提供当天的.网上提到的中国气象接口的文章,大都用的时旧API,有的被封了,有的永远 ...

  6. Hadoop MapReduce编程 API入门系列之挖掘气象数据版本2(十)

    下面,是版本1. Hadoop MapReduce编程 API入门系列之挖掘气象数据版本1(一) 这篇博文,包括了,实际生产开发非常重要的,单元测试和调试代码.这里不多赘述,直接送上代码. MRUni ...

  7. ScrollView嵌套ListView,GridView数据加载不全问题的解决

    我们大家都知道ListView,GridView加载数据项,如果数据项过多时,就会显示滚动条.ScrollView组件里面只能包含一个组件,当ScrollView里面嵌套listView,GridVi ...

  8. python多种格式数据加载、处理与存储

    多种格式数据加载.处理与存储 实际的场景中,我们会在不同的地方遇到各种不同的数据格式(比如大家熟悉的csv与txt,比如网页HTML格式,比如XML格式),我们来一起看看python如何和这些格式的数 ...

  9. flask+sqlite3+echarts3+ajax 异步数据加载

    结构: /www | |-- /static |....|-- jquery-3.1.1.js |....|-- echarts.js(echarts3是单文件!!) | |-- /templates ...

随机推荐

  1. Android系统开发 编译系统签名的APP

    前言 一般情况下,我们使用的签名都是自己生成的Java签名来编译APP. 但是,如果需要开发一些特定设备的APP(对权限有更高的要求,需求一些系统基本的权限,比如让APP可以控制设备的休眠),那就需要 ...

  2. 8.spark Core 进阶1

        (e.g. standalone manager, Mesos, YARN)   In "cluster" mode, the framework launches the ...

  3. [JZOJ3337] 【NOI2013模拟】wyl8899的TLE

    题目 题目大意 给你两个字符串\(A\)和\(B\),可以修改\(A\)中的一个字符,求修改后最长的\(A\)的前缀,使它是\(B\)的子串. 思考历程 看到这道题之后,第一眼想到的就是后缀自动机! ...

  4. SpringBoot生产/开发/测试多环境的选择

    多环境选择 一般一套程序会被运行在多部不同的环境中,比如开发.测试.生产环境,每个环境的数据库地址,服务器端口这些都不经相同,若因为环境的变动而去改变配置的的参数,明显是不合理且易造成错误的 对于不同 ...

  5. csps模拟92数列,数对,最小距离题解

    题面:https://www.cnblogs.com/Juve/articles/11767225.html 数列: 简化题意:已知a,b,c,求满足$a*x+b*y=c$的$x+y$最小值 然后ex ...

  6. LUOGU P2860 [USACO06JAN]冗余路径Redundant Paths (双联通,缩点)

    传送门 解题思路 刚开始是找的桥,后来发现这样不对,因为一条链就可以被卡.后来想到应该缩点后找到度数为1 的点然后两两配对. #include<iostream> #include< ...

  7. 第一个servlet小程序

    第一个servlet小程序 com.fry.servlet.HelloServlet package com.fry.servlet; import javax.servlet.ServletExce ...

  8. redis 本地连接可以 远程连接不上问题

    1.所连主机防火墙关一下. 1:查看防火状态 systemctl status firewalld service  status iptables  2:暂时关闭防火墙 systemctl stop ...

  9. 用pymysql实现的注册登录公告练习

    import pymysql #1.连接服务器 conn=pymysql.connect( host='127.0.0.1', port=3306, user='root', password='12 ...

  10. OpenLayers的view与layer:控制显示内容

    view与layer都可以进行显示内容的控制.这两者负责的功能是由区别的. view即显示的地图容器,有以下几个属性: center:[经度,纬度] ,对应的设置函数为view.setCenter() ...