Hadoop 一: NCDC 数据准备
本文介绍Hadoop- The Definitive Guide一书中的NCDC数据准备,为后面的学习构建大数据环境;
环境
3节点 Hadoop 2.7.3 集群; java version "1.8.0_111"
1 下载数据
从NCDC下载20,21世纪天历史气数据;官网按年份命名文件夹,每个文件内包含N个gz打包的(*.op.gz)全年各地区天气数据文件和一个全年天气数据打包tar文件,比如1971年;
034700-99999-1971.op.gz
035623-99999-1971.op.gz
035833-99999-1971.op.gz
035963-99999-1971.op.gz
036880-99999-1971.op.gz
040180-16201-1971.op.gz
061800-99999-1971.op.gz
080870-99999-1971.op.gz
gsod_1971.tar
*1971.op.gz就是该年的某地区某天数据打包,而*1971.tar就是对全年*.op.gz文件的打包;只需要下载tar文件,再解压即可得到全年天气数据;在这里下载从1902年到2017年tar文件;
#!/bin/bash
for i in {1902..2017}
do
cd /home/lanstonwu/hapood/ncdc
wget --execute robots=off -r -np -nH --cut-dirs=4 -R index.html* ftp://ftp.ncdc.noaa.gov/pub/data/gsod/$i/*.tar
done
2 上传数据
为了便于使用,文件下载完成后,推荐使用hadoop将全年的天气数据合并为一个文件;由于下载的数据保存在本地,为了使用hadoop并行处理这些数据,需要将数据上传到HDFS;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.net.URI;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.io.IOUtils;
/**
* 将本地文件上传到hadoop集群 hdfs 提示权限不足时设置环境变量export HADOOP_USER_NAME=hadoop再运行
*
* @author lanstonwu
*
*/
public class UpLoadFile {
public static void main(String[] args) throws IOException {
// hdfs目录
String target = "hdfs://192.168.56.12:9000/gsod";
// 本地文件目录
File file = new File("/home/lanstonwu/hapood/ncdc");
if (file.exists()) {
File[] files = file.listFiles();
if (files.length == 0) {
System.out.println("文件夹是空的!");
return;
} else {
for (File file2 : files) {// 遍历本地文件目录
if (file2.isDirectory()) {
System.out.println("文件夹:" + file2.getAbsolutePath() + "," + file2.getName());
} else {
System.out.println("文件:" + file2.getAbsolutePath() + ",name:" + file2.getName());
// 读取本地文件
FileInputStream fis = new FileInputStream(new File(file2.getAbsolutePath()));
Configuration config = new Configuration();
// Returns the FileSystem for this URI's scheme and authority
FileSystem fs = FileSystem.get(URI.create(target + "/" + file2.getName()), config);
// Create an FSDataOutputStream at the indicated Path
OutputStream os = fs.create(new Path(target + "/" + file2.getName()));
// 复制数据
IOUtils.copyBytes(fis, os, 4096, true);
System.out.println("拷贝完成...");
}
}
}
} else {
System.out.println("文件不存在!");
}
}
}
3 合并数据
由于hadoop处理大数据文件比处理小数据文件更有优势,这里将tar文件内的全年gz打包数据合并为一个文件;因为仅仅合并数据,用map即可,无需reduce,用hadoop的streaming并行完成这个工作;首先准备处理文件清单;
$ vi ncdc_file_list.txt
hdfs://gp-sdw1:9000/gsod/gsod_1981.tar
hdfs://gp-sdw1:9000/gsod/gsod_1977.tar
hdfs://gp-sdw1:9000/gsod/gsod_1978.tar
hdfs://gp-sdw1:9000/gsod/gsod_1979.tar
hdfs://gp-sdw1:9000/gsod/gsod_1980.tar
hdfs://gp-sdw1:9000/gsod/gsod_1981.tar
hdfs://gp-sdw1:9000/gsod/gsod_1982.tar
hdfs://gp-sdw1:9000/gsod/gsod_1983.tar
.....
文件清单中记录所有要处理的文件,每一行即代表一个文件,hadoop streaming逐行读取传递给map函数处理;接着编写map脚本,每一个步骤有序号和说明;
#!/bin/bash
HADOOP_HOME=/opt/hadoop/2.7.3
cd /tmp
#1 NLineInputFormat give a signle line:offset is key,hdfile is HDFS
read offset hdfile
#2 restrive file from hdfs
echo "reporter:status:Restrivering $hdfile" >&2
$HADOOP_HOME/bin/hadoop fs -get $hdfile .
#3 get short name from tar file
target=`basename $hdfile .tar`
#4 create directory by name of target
mkdir $target
#5 un-tar the local file to target directory
tar xvf `basename $hdfile` -C $target
#6 un-zip the local file and merge them to one file
echo "reporter:status:Un-gzipping $target" >&2
for file in $target/*
do
gunzip -c $file>>$target.all
echo "repoter:status:Processed $file" >&2
done
#7 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 - /ncdc_year_gz/$target.gz
#8 remove the local file
rm -Rf $target
rm -f $target.all
rm -f $target.tar
hadoop从HDFS中读取文件到本地(第2步),获取文件名(第3步),根据获取到的文件名创建目录(第4步),解压该年的全年数据到目录里(第5步),循环解压和读取全年数据合并到一个文件里(第6步),将合并的文件压缩并上传到HDFS ncdc_year_gz目录(第7步),删除本地文件目录和文件(第8步).reporter 的目的是返回状态信息,便于监控mapper运行.注意:必须设置HADOOP_HOME变量,如果不设置该变量,所有调用hadoop的地方必须全路径,因为在运行时操作系统上配置的HADOOP_HOME变量是不可见,会导致运行报如下错误;
No such file or directory
PipeMapRed.waitOutputThreads(): subprocess failed with code 127
1.4 运行mapper 将准备好的NCDC文件清单上传到HDFS(hadoop集群节点需要);
$ hadoop fs -put ncdc_file_list.txt /
运行map;
hadoop jar $HADOOP_HOME/share/hadoop/tools/lib/hadoop-streaming-*.jar \
-D mapred.reduce.tasks=0 \
-D mapred.map.tasks.speculative.execution=false \
-D mapred.task.timeout=12000000 \
-input /ncdc_file_list.txt \
-inputformat org.apache.hadoop.mapred.lib.NLineInputFormat \
-output output \
-mapper load_ncdc_map.sh \
-file /home/hadoop/script/load_ncdc_map.sh
禁用reduce,设置超时,设置input为准备好的ncdc清单文件,设置mapper和file为map脚本.
17/10/01 13:05:36 WARN streaming.StreamJob: -file option is deprecated, please use generic option -files instead.
packageJobJar: [/home/hadoop/script/load_ncdc_map.sh, /tmp/hadoop-unjar708897410907700502/] [] /tmp/streamjob2755689666173396550.jar tmpDir=null
17/10/01 13:05:37 INFO client.RMProxy: Connecting to ResourceManager at gp-sdw1/192.168.56.12:8032
17/10/01 13:05:37 INFO client.RMProxy: Connecting to ResourceManager at gp-sdw1/192.168.56.12:8032
17/10/01 13:05:38 INFO mapred.FileInputFormat: Total input paths to process : 1
17/10/01 13:05:38 INFO mapreduce.JobSubmitter: number of splits:114
17/10/01 13:05:38 INFO Configuration.deprecation: mapred.reduce.tasks is deprecated. Instead, use mapreduce.job.reduces
17/10/01 13:05:38 INFO Configuration.deprecation: mapred.map.tasks.speculative.execution is deprecated. Instead, use mapreduce.map.speculative
17/10/01 13:05:38 INFO Configuration.deprecation: mapred.task.timeout is deprecated. Instead, use mapreduce.task.timeout
17/10/01 13:05:38 INFO mapreduce.JobSubmitter: Submitting tokens for job: job_1506832924184_0001
17/10/01 13:05:39 INFO impl.YarnClientImpl: Submitted application application_1506832924184_0001
17/10/01 13:05:39 INFO mapreduce.Job: The url to track the job: http://gp-sdw1:8088/proxy/application_1506832924184_0001/
17/10/01 13:05:39 INFO mapreduce.Job: Running job: job_1506832924184_0001
17/10/01 13:05:46 INFO mapreduce.Job: Job job_1506832924184_0001 running in uber mode : false
17/10/01 13:05:46 INFO mapreduce.Job: map 0% reduce 0%
17/10/01 13:06:00 INFO mapreduce.Job: map 1% reduce 0%
17/10/01 13:06:04 INFO mapreduce.Job: map 2% reduce 0%
17/10/01 13:06:09 INFO mapreduce.Job: map 3% reduce 0%
17/10/01 13:06:12 INFO mapreduce.Job: map 4% reduce 0%
17/10/01 13:06:17 INFO mapreduce.Job: map 5% reduce 0%
17/10/01 13:06:23 INFO mapreduce.Job: map 6% reduce 0%
17/10/01 13:06:25 INFO mapreduce.Job: map 7% reduce 0%
17/10/01 13:06:28 INFO mapreduce.Job: map 11% reduce 0%
17/10/01 13:06:32 INFO mapreduce.Job: map 12% reduce 0%
17/10/01 13:06:34 INFO mapreduce.Job: map 13% reduce 0%
17/10/01 13:06:37 INFO mapreduce.Job: map 14% reduce 0%
17/10/01 13:06:38 INFO mapreduce.Job: map 17% reduce 0%
17/10/01 13:06:39 INFO mapreduce.Job: map 19% reduce 0%
17/10/01 13:06:56 INFO mapreduce.Job: map 20% reduce 0%
17/10/01 13:07:02 INFO mapreduce.Job: map 21% reduce 0%
17/10/01 13:07:12 INFO mapreduce.Job: map 22% reduce 0%
17/10/01 13:07:14 INFO mapreduce.Job: map 23% reduce 0%
17/10/01 13:07:16 INFO mapreduce.Job: map 24% reduce 0%
17/10/01 13:07:17 INFO mapreduce.Job: map 25% reduce 0%
17/10/01 13:07:52 INFO mapreduce.Job: map 27% reduce 0%
Status即为map脚本reporter返回信息;map完成,检查hadoop 合并后的文件;
$ hadoop fs -ls /ncdc_year_gz
-rw-r--r-- 3 hadoop supergroup 14809707 2017-10-01 13:11 /ncdc_year_gz/gsod_1966.gz
-rw-r--r-- 3 hadoop supergroup 14771822 2017-10-01 13:13 /ncdc_year_gz/gsod_1967.gz
-rw-r--r-- 3 hadoop supergroup 13592592 2017-10-01 13:12 /ncdc_year_gz/gsod_1968.gz
-rw-r--r-- 3 hadoop supergroup 20475061 2017-10-01 13:14 /ncdc_year_gz/gsod_1969.gz
-rw-r--r-- 3 hadoop supergroup 20012492 2017-10-01 13:14 /ncdc_year_gz/gsod_1970.gz
-rw-r--r-- 3 hadoop supergroup 11205341 2017-10-01 13:12 /ncdc_year_gz/gsod_1971.gz
-rw-r--r-- 3 hadoop supergroup 4556815 2017-10-01 13:11 /ncdc_year_gz/gsod_1972.gz
-rw-r--r-- 3 hadoop supergroup 21961972 2017-10-01 13:18 /ncdc_year_gz/gsod_1974.gz
-rw-r--r-- 3 hadoop supergroup 23030229 2017-10-01 13:18 /ncdc_year_gz/gsod_1976.gz
-rw-r--r-- 3 hadoop supergroup 23293175 2017-10-01 13:18 /ncdc_year_gz/gsod_1978.gz
-rw-r--r-- 3 hadoop supergroup 24564712 2017-10-01 13:18 /ncdc_year_gz/gsod_1980.gz
-rw-r--r-- 3 hadoop supergroup 29662599 2017-10-01 13:19 /ncdc_year_gz/gsod_1988.gz
-rw-r--r-- 3 hadoop supergroup 29092407 2017-10-01 13:19 /ncdc_year_gz/gsod_1993.gz
-rw-r--r-- 3 hadoop supergroup 25363736 2017-10-01 13:19 /ncdc_year_gz/gsod_1994.gz
-rw-r--r-- 3 hadoop supergroup 22179093 2017-10-01 13:19 /ncdc_year_gz/gsod_1995.gz
Hadoop 一: NCDC 数据准备的更多相关文章
- Hadoop 1: NCDC 数据准备
本文介绍Hadoop- The Definitive Guide一书中的NCDC数据准备,为后面的学习构建大数据环境; 环境 3节点 Hadoop 2.7.3 集群; java version &qu ...
- Hadoop! | 大数据百科 | 数据观 | 中国大数据产业观察_大数据门户
你正在使用过时的浏览器,Amaze UI 暂不支持. 请 升级浏览器 以获得更好的体验! 深度好文丨读完此文,就知道Hadoop了! 来源:BiThink 时间:2016-04-12 15:1 ...
- Hadoop权威指南:从Hadoop URL读取数据
[TOC] Hadoop权威指南:从Hadoop URL读取数据 使用java.net.URL对象从Hadoop文件系统读取文件 实现类似linux中cat命令的程序 文件名 HDFSCat.java ...
- 学习Hadoop+Spark大数据巨量分析与机器学习整合开发-windows利用虚拟机实现模拟多节点集群构建
记录学习<Hadoop+Spark大数据巨量分析与机器学习整合开发>这本书. 第五章 Hadoop Multi Node Cluster windows利用虚拟机实现模拟多节点集群构建 5 ...
- Hadoop生态圈-大数据生态体系快速入门篇
Hadoop生态圈-大数据生态体系快速入门篇 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.大数据概念 1>.什么是大数据 大数据(big data):是指无法在一定时间 ...
- Hadoop基础-HDFS数据清理过程之校验过程代码分析
Hadoop基础-HDFS数据清理过程之校验过程代码分析 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 想称为一名高级大数据开发工程师,不但需要了解hadoop内部的运行机制,还需 ...
- Hadoop,大数据,云计算三者之间的关系
大数据和云计算是何关系?关于大数据和云计算的关系人们通常会有误解.而且也会把它们混起来说,分别做一句话直白解释就是:云计算就是硬件资源的虚拟化;大数据就是海量数据的高效处理.大数据.hadoop及云计 ...
- Hadoop hadoop 之hdfs数据块修复方法
hadoop 之hdfs数据块修复方法: .手动修复 hdfs fsck / #检查集群的健康状态 hdfs debug recoverLease -path 文件位置 -retries 重试次数 # ...
- hadoop ncdc数据下载方法
我在看<Hadoop权威指南>时,里面提供了NCDC天气数据样本,提供的下载链接是:点击打开链接,但是里面只提供了1901和1902这两年的数据,这未免也太少了点!完全称不上“BIG DA ...
随机推荐
- [js高手之路]node js系列课程-创建简易web服务器与文件读写
web服务器至少有以下几个特点: 1.24小时不停止的工作,也就是说这个进程要常驻在内存中 2.24小时在某一端口监听,如: http://localhost:8080, www服务器默认端口80 3 ...
- Spring框架Controller层(表现层)针对方法参数是Bean时HttpServletRequest绑定参数值问题解释
在做项目的时候,有一个需求是将数据库中的信息封装到实体类返回到jsp界面 传过来的参数只是实体类的id属性,然后根据id属性去查数据库,事情就是这样,然后 结果遇到很奇怪的事情,在jsp页面中使用EL ...
- ADO.NET的学习
ADO.NET的几个对象 Connection:管理数据库的连接 Command:对数据库执行命令 DataReader:数据流读取器,返回的数据都是快速的且只是"向前"的数据流. ...
- C# 文件的上传和下载
本文主要介绍一下,在APS.NET中文件的简单上传于下载,上传是将文件上传到服务器的指定目录下,下载是从存入数据库中的路径,从服务器上下载. 1.上传文件 (1)页面代码 <table alig ...
- MyEclipse安装步骤和破解
Myeclipse的安装步骤 MyEclipse简介: MyEclipse,是在eclipse 基础上加上自己的插件开发而成的功能强大的企业级集成开发环境,主要用于Java.Java EE以及移动应用 ...
- 201521123040 《Java程序设计》第6周学习总结
1.本章学习总结 1.1 面向对象学习暂告一段落,请使用思维导图,以封装.继承.多态为核心概念画一张思维导图,对面向对象思想进行一个总结. 2. 书面作业 clone方法1.1 Object对象中的c ...
- 201521123121 《Java程序设计》第1周学习总结
1. 本周学习总结 我们将要重点接触的JAVA SE主要分为4个部分:JVM.JRE.JDK.java语言. 其中JVM作为运行虚拟机隶属于JRE运行环境中,是JAVA通用性.跨平台适应性高的基础保证 ...
- PHP fwrite 函数:将字符串写入文件(追加与换行)(转)
PHP fwrite() fwrite() 函数用于向文件写入字符串,成功返回写入的字符数,否则返回 FALSE . 语法: int fwrite( resource handle, string s ...
- json:JSONObject包的具体使用(JSONObject-lib包是一个beans,collections,maps,java arrays和xml和JSON互相转换的包)
1.JSONObject介绍 JSONObject-lib包是一个beans,collections,maps,java arrays和xml和JSON互相转换的包. 2.下载jar包 http:// ...
- 将缓冲区的数字字符串转化成BCD码数据_INT PubNumericToBCDStr(_UCHR *pcNStr, _INT iNLen, _UCHR *pcBCDStr)
INT PubNumericToBCDStr(_CHR *pcNStr, _INT iNLen, _CHR *pcBCDStr) { _UCHR *pN = pcNStr; _UCHR *pB = p ...