Hadoop编程1:天气数据AWK & MapReduce
本文介绍通过AWK和MapReduce两种方式统计出每年温度到最高气温直。awk速度虽然快,而且简短,但是数据量巨大到时候,就遇到力瓶颈,及时分布式执行awk脚本,也会出现机器死掉等问题,需要容错机制保障分布式运行,所以就出现力MapReduce计算模型到Hadoop机制。
1 数据集样式
++023450FM-+000599999V0202701N015919999999N0000001N9-+99999102001ADDGF108991999999999999999999 ++023450FM-+000599999V0202901N008219999999N0000001N9-+99999102001ADDGF104991999999999999999999 ++023450FM-+000599999V0209991C000019999999N0000001N9-+99999102001ADDGF108991999999999999999999
为了方便存储,上图所示为压缩样式,需要提取出相关字段:时间和温度。
2 AWK是linux系统有力到文本分析工具,awk逐行读入,以空格分割变量。对不了解awk到人,下面总结了一些基础知识。
(1)统计一年到最高气温:
#!/usr/bin/env bash
gunzip -c ' | \
awk '{ temp = substr($0, 88, 5) + 0;
q = substr($, , );
&& q ~ /[]/ && temp > max) max = temp }
END { print max }'
输入是.gz的压缩包,输出结果是:317
(2)统计多年到最高气温:
#!/usr/bin/env bash
for year in *.gz
do
echo $year
gunzip -c $year | \
awk '{temp = substr($0, 88, 5) + 0;
q = substr($, , );
&& q ~ /[]/ && temp > max) max = temp}
END { print max}'
done
输入是多年到数据,实例为两年到1901.gz 1902.gz 数据,输出每年到最高气温,37, 44
3 MapReduce计算模型求最高气温
(1)MaxTemperatureMapper.java
public class MaxTemperatureMapper extends Mapper<Object, Text, Text, IntWritable> {
;
@Override
protected void map(Object key, Text value, Mapper<Object, Text, Text, IntWritable>.Context context)
throws IOException, InterruptedException {
String line = value.toString();
String year = line.substring(, );
;
) == '+'){
airTemperature = Integer.parseInt( line.substring(,) );
}else {
airTemperature = Integer.parseInt(line.substring(, ));
}
String quality = line.substring(, );
if (airTemperature != MISSING && quality.matches("[01459]")) {
context.write(new Text(year), new IntWritable(airTemperature));
}
}
}
(2)MaxTemperatureReducer.java
public class MaxTemperatureReducer extends Reducer<Text, IntWritable, Text, IntWritable>{
@Override
protected void reduce(Text arg0, Iterable<IntWritable> arg1,
Reducer<Text, IntWritable, Text, IntWritable>.Context context) throws IOException, InterruptedException {
int max = Integer.MIN_VALUE;
for (IntWritable temp : arg1){
max = Math.max(temp.get(), max);
}
context.write(arg0, new IntWritable(max));
}
}
(3)MaxTemperature.java
public class MaxTemperature {
public static void main(String[] args) throws Exception {
args = new String[] {
"/home/hadoop/Develop/hadoop-develop/data-authorized/input-file/file",
"/home/hadoop/Develop/hadoop-develop/data-authorized/output/maxtemperature" };
) {
System.err.println("Usage: MaxTemperature <input path> <output path>");
System.exit(-);
}
Job job = new Job();
job.setJarByClass(MaxTemperature.class);
job.setJobName("Max temperature");
FileInputFormat.addInputPath(job, ]));
FileOutputFormat.setOutputPath(job, ]));
job.setMapperClass(MaxTemperatureMapper.class);
job.setReducerClass(MaxTemperatureReducer.class);
job.setCombinerClass(MaxTemperatureReducer.class);
job.setOutputKeyClass(Text.class);
job.setOutputValueClass(IntWritable.class);
System.exit(job.waitForCompletion( : );
}
}
(4)运行结果,成功
// :: INFO mapred.Task: Task 'attempt_local184459823_0001_r_000000_0' done. // :: INFO mapred.LocalJobRunner: Finishing task: attempt_local184459823_0001_r_000000_0 // :: INFO mapred.LocalJobRunner: reduce task executor complete. // :: INFO mapreduce.Job: map % reduce % // :: INFO mapreduce.Job: Job job_local184459823_0001 completed successfully
4 附录-awk基础
基本语法 awk -F '分隔符' '{命令}' 路径
(1)awk输出管道last输入流到第一个变量
last -n | awk '{print $1}'
(2)-F指定分隔符:
cat /etc/passwd |awk -F ':' '{print $1}'
(3)begin和 end 可以分别指定开始和结束执行到一段命令;中间{}部分逐行执行。
cat /etc/passwd |awk -F ':' 'BEGIN {print "name,shell"} {print $1","$7} END {print "blue,/bin/nosh"}'
(4)正则模式匹配,以root开头到行
awk -F: '/^root/' /etc/passwd
正则+命令到格式
awk -F: '/root/{print $7}' /etc/passwd
(5)if语句
ls -l |awk 'BEGIN {size=0;print "[start]size is ", size} {if($5!=4096){size=size+$5;}} END{print "[end]size is ", size/1024/1024,"M"}'
(6)for语句和数组
awk -F ':' 'BEGIN {count=0;} {name[count] = $1;count++;}; END{for (i = 0; i < NR; i++) print i, name[i]}' /etc/passwd
(7)awk内部变量表
ARGC 命令行参数个数 ARGV 命令行参数排列 ENVIRON 支持队列中系统环境变量的使用 FILENAME awk浏览的文件名 FNR 浏览文件的记录数 FS 设置输入域分隔符,等价于命令行 -F选项 NF 浏览记录的域的个数 NR 已读的记录数 OFS 输出域分隔符 ORS 输出记录分隔符 RS 控制记录分隔符
包含内部变量到格式
#awk -F ':' '{print "filename:" FILENAME ",linenumber:" NR ",columns:" NF ",linecontent:"$0}' /etc/passwd
参考: 《hadoop权威指南》
Hadoop编程1:天气数据AWK & MapReduce的更多相关文章
- 大数据学习笔记——Hadoop编程实战之Mapreduce
Hadoop编程实战——Mapreduce基本功能实现 此篇博客承接上一篇总结的HDFS编程实战,将会详细地对mapreduce的各种数据分析功能进行一个整理,由于实际工作中并不会过多地涉及原理,因此 ...
- hadoop编程技巧(6)---处理大量的小型数据文件CombineFileInputFormat申请书
代码测试环境:Hadoop2.4 应用场景:当需要处理非常多的小数据文件,这种技术的目的,可以被应用到实现高效的数据处理. 原理:申请书CombineFileInputFormat,能够进行切片合并的 ...
- Hadoop学习之旅三:MapReduce
MapReduce编程模型 在Google的一篇重要的论文MapReduce: Simplified Data Processing on Large Clusters中提到,Google公司有大量的 ...
- 后Hadoop时代的大数据架构(转)
原文:http://zhuanlan.zhihu.com/donglaoshi/19962491 作者: 董飞 提到大数据分析平台,不得不说Hadoop系统,Hadoop到现在也超过10年 ...
- Hadoop学习记录(4)|MapReduce原理|API操作使用
MapReduce概念 MapReduce是一种分布式计算模型,由谷歌提出,主要用于搜索领域,解决海量数据计算问题. MR由两个阶段组成:Map和Reduce,用户只需要实现map()和reduce( ...
- 大数据开发 | MapReduce介绍
1. MapReduce 介绍 1.1MapReduce的作用 假设有一个计算文件中单词个数的需求,文件比较多也比较大,在单击运行的时候机器的内存受限,磁盘受限,运算能力受限,而一旦将单机版程序扩展 ...
- Hadoop自学笔记(三)MapReduce简单介绍
1. MapReduce Architecture MapReduce是一套可编程的框架,大部分MapReduce的工作都能够用Pig或者Hive完毕.可是还是要了解MapReduce本身是怎样工作的 ...
- Windows下Hadoop编程环境配置指南
刘勇 Email: lyssym@sina.com 本博客记录作者在工作与研究中所经历的点滴,一方面给自己的工作与生活留下印记,另一方面若是能对大家有所帮助,则幸甚至哉矣! 简介 鉴于最近在研究 ...
- 后Hadoop时代的大数据架构
提到大数据分析平台,不得不说Hadoop系统,Hadoop到现在也超过10年的历史了,很多东西发生了变化,版本也从0.x进化到目前的2.6版本.我把2012年后定义成后Hadoop平台时代,这不是说不 ...
随机推荐
- gitlab的使用方法
Git global setup: git全局建立 git config --global user.name "Your Name" git config --global us ...
- html中隐藏域hidden的作用介绍及使用示例
基本语法: <input type="hidden" name="field_name" value="value"> 作用: ...
- 记录JVM内存模型,参数含义和优化
一.JVM内存模型 (图片来自网络) 根据Java虚拟机规范,JVM将内存划分为: New(年轻代) Tenured(年老代) Perm (永久代) 其中New和Tenured属于堆内存,堆内存会从J ...
- html图片和文字的细节
ul中的每一个li如果里面添加“一个图,一行字”, 这样图片会紧贴在左侧,而文字会居中,这两个元素不会紧贴着. 产生这种问题的原因我推测是:我图片设置了左浮动,但文字没有设置浮动,而一旦将文字设置为浮 ...
- HDU1978 记忆化搜索
How many ways Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Tot ...
- jquery中对动态生成的标签响应click事件(二)…与ajax交互使用
<%@ page language="java" contentType="text/html; charset=GB18030" pageEncodin ...
- Android错误:W/ResourceType(2411): No package identifier when getting value for resource number 0x
报错信息: 07-04 11:14:43.064: W/ResourceType(2411): No package identifier when getting value for resourc ...
- Silverlight控件——如何提升应用程序信任度与问题解决
从silverlight5开始,可以在项目设置中勾选“在浏览器内运行时需要提升的信任”来达到在浏览器内运行提权silverlight客户端的目的,在个特性很有用处. 可我使用这个功能时遇到了一个奇怪的 ...
- IOS第18天(6,CAKeyframeAnimation关键帧动画)
******* #import "HMViewController.h" @interface HMViewController () @property (weak, nonat ...
- Python简明语法