第一个MapReduce的例子
第一个MapReduce的例子
Hadoop Guide的第一个MapReduce的例子是处理气象数据的(数据来源ncdc),终于跑通了。总结一下步骤,安装hadoop不在本文中介绍
1 数据预处理
1.1 下载数据
测试数据需要在ncdc的官方ftp上进行下载,年份跨度范围1901到2016,不写个脚本下载,靠手工是行不通的,脚本如下:
download.sh
!bin/bash
for i in {1901..2015}
do
wget --execute robots=off -r -np -nH -P./ncdc/ --cut-dirs=4 -R index.html* ftp://ftp.ncdc.noaa.gov/pub/data/gsod/$i/gsod_$i.tar
done
执行命令[nohup sh download.sh &] 会把所有ftp上gsod_*.tar的压缩包下载下来,下载完之后需要预处理这些数据
1.2 数据预处理
每一个tar压缩包包含n个gz压缩包,每一个gz包含一个数据文本,关于ncdc气象数据的每个字段的描述在这里,格式举例如下
STN--- WBAN YEARMODA TEMP DEWP SLP STP VISIB WDSP MXSPD GUST MAX MIN PRCP SNDP FRSHTT
607450 99999 20100101 56.1 22 33.0 22 1012.4 8 975.5 8 5.6 22 9.1 22 19.0 999.9 63.9 48.2* 0.00G 999.9 000000
607450 99999 20100102 53.0 23 34.2 23 1019.5 8 982.2 8 5.8 23 6.7 23 12.0 999.9 66.7 39.0 0.00G 999.9 000000
607450 99999 20100103 50.5 23 34.3 23 1022.2 8 984.6 8 6.2 23 7.7 23 12.0 999.9 64.9 36.5 0.00G 999.9 000000
607450 99999 20100104 53.0 22 34.5 22 1016.5 8 979.3 8 6.4 22 6.5 22 15.9 999.9 64.9 42.8* 0.00G 999.9 000000
预处理的目标是把压缩包里面的数据按照一个年份一个txt的形式存在,为了Map阶段读书去数据方便,去除第一行的title。处理脚本如下,processh.sh
#!/bin/bash
for i in {1901..2017}
do
tar xf ./ncdc/gsod_$i.tar -C ./ncdc
gunzip ./ncdc/*.gz
rm -rf ncdc/input_gsod_$i.txt
touch ncdc/input_gsod_$i.txt
for file in ./ncdc/*.op
do
sed -i '1d' $file
cat $file >> ./ncdc/input_gsod_$i.txt
done
rm -rf ./ncdc/*.op
echo "file gsod_$i has processed "
done
1.3 Load数据到HDFS上
创建input目录:
hdfs dfs -mkdir /ncdc
put数据到hdfs上:
hdfs dfs -put ./ncdc/*.txt /ncdc/*
检查hdfs上的数据, 如果所有的年份的数据都load到了hdfs上就OK
hdfs dfs -ls /ncdc
2 MapReduce程序
2.1 MapReduce程序
package com.oldtrafford.hadoop;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.io.IntWritable;
import org.apache.hadoop.io.LongWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Job;
import org.apache.hadoop.mapreduce.Mapper;
import org.apache.hadoop.mapreduce.Reducer;
import org.apache.hadoop.mapreduce.lib.input.FileInputFormat;
import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat;
import java.io.IOException;
public class MaxTemperature {
public static void main (String[] args) throws IOException, ClassNotFoundException, InterruptedException {
if(args.length!=2){
System.err.println("usage: maxtemperature <input>");
System.exit(-1);
}
Job job = new Job();
job.setJarByClass(MaxTemperature.class);
job.setJobName("MaxTemperature");
FileInputFormat.addInputPath(job, new Path(args[0]));
FileOutputFormat.setOutputPath(job, new Path(args[1]));
job.setMapperClass(MaxTemperatureMapper.class);
job.setReducerClass(MaxTemperatureReducer.class);
job.setOutputKeyClass(Text.class);
job.setOutputValueClass(IntWritable.class);
job.waitForCompletion(true);
System.out.println("Finished");
}
static class MaxTemperatureMapper extends Mapper<LongWritable, Text, Text, IntWritable> {
private static final String MISSING = "9999.9";
@Override
public void map(LongWritable key, Text value, Mapper.Context context) throws IOException, InterruptedException {
String line = value.toString();
String year = line.substring(14, 18);
String tempretureStr = line.substring(24,30).trim();
int temperature = -1;
if(!MISSING.equals(tempretureStr)){
temperature = (int)(Double.parseDouble(tempretureStr)*10);
context.write(new Text(year), new IntWritable(temperature));
}
}
}
static class MaxTemperatureReducer extends Reducer<Text, IntWritable, Text, IntWritable> {
@Override
public void reduce(Text key, Iterable<IntWritable> values, Context context) throws IOException, InterruptedException {
int maxValue = Integer.MIN_VALUE;
for(IntWritable value : values) {
maxValue = Math.max(maxValue, value.get());
}
context.write(key, new IntWritable(maxValue));
}
}
}
2.2 打包代码&&执行
打包代码
打包mapreduce的代码用最简单的maven命令,会产生一个jar包。然后把这个jar传输到hadoop机器的上一台机器上。
执行hadoop
hadoop jar temperature.jar com.oldtrafford.hadoop.MaxTemperature /ncdc/* /ncdc_output
3 查看执行结果
查看mapreduce结果
hdfs dfs -cat /ncdc_output/*
第一个MapReduce的例子的更多相关文章
- RHadoop教程翻译系列 _Mapreduce(1)_第一个Mapreduce任务
如果单从概念上来说,Mapreduce和R中的函数lapply, tapply并无差别,它们都是把元素转化成列,然后计算索引(Mapreduce中的键),最后合并成一个定义好的组合.首先,让我们看一个 ...
- hadoop-0.23.9安装以及第一个mapreduce测试程序
hadoop是一个能够对大量数据进行分布式处理的软件框架.它实现了一个分布式文件系统(Hadoop Distributed File System),简称HDFS.HDFS有着高容错性的特点,并且设计 ...
- 一起学Hadoop——使用IDEA编写第一个MapReduce程序(Java和Python)
上一篇我们学习了MapReduce的原理,今天我们使用代码来加深对MapReduce原理的理解. wordcount是Hadoop入门的经典例子,我们也不能免俗,也使用这个例子作为学习Hadoop的第 ...
- HDFS设计思路,HDFS使用,查看集群状态,HDFS,HDFS上传文件,HDFS下载文件,yarn web管理界面信息查看,运行一个mapreduce程序,mapreduce的demo
26 集群使用初步 HDFS的设计思路 l 设计思想 分而治之:将大文件.大批量文件,分布式存放在大量服务器上,以便于采取分而治之的方式对海量数据进行运算分析: l 在大数据系统中作用: 为各类分布式 ...
- 云计算(6)--一些MapReduce的例子
例1:文件的字符串查找 这里reduce不做merge的工作,因为每行都是不一样的,不能merge. 与传统的grep程序相比,使用MapReduce可以加快处理,因为1它是Distributed的, ...
- 用一个简单的例子来理解python高阶函数
============================ 用一个简单的例子来理解python高阶函数 ============================ 最近在用mailx发送邮件, 写法大致如 ...
- Wordcount on YARN 一个MapReduce示例
Hadoop YARN版本:2.2.0 关于hadoop yarn的环境搭建可以参考这篇博文:Hadoop 2.0安装以及不停集群加datanode hadoop hdfs yarn伪分布式运行,有如 ...
- Spring-Context之一:一个简单的例子
很久之前就想系统的学习和掌握Spring框架,但是拖了很久都没有行动.现在趁着在外出差杂事不多,就花时间来由浅入深的研究下Spring框架.Spring框架这几年来已经发展成为一个巨无霸产品.从最初的 ...
- 高仿“点触验证码”做的一个静态Html例子
先上源码: <html> <head> <title>TouClick - Designed By MrChu</title> <meta htt ...
随机推荐
- [转]winform程序textbox滚动条保持在最下面 内容不闪烁
在开发winform程序时,会用到textbox控件来显示信息,当把textbox的Multiline属性改为Ture时(即多行显示状态),ScrollBars属性改为Vertical(内容过多时,显 ...
- atitit,it人怎么样才容易事业成功?? 有以下五种性格的人容易成功
atitit,it人怎么样才容易事业成功?? 有以下五种性格的人容易成功 有以下五种性格的人容易成功 一.不撞南墙不回头的人:由于这种人有脚踏实地,做事拼命.不撞南墙不回头的性格特点, 势有不到黄河心 ...
- spring 学习资料备份
易百教程 https://www.yiibai.com/spring/spring-autowiring-by-name.html
- 找电影资源最强攻略,知道这些你就牛B了!
找电影资源最强攻略,知道这些你就牛B了! 电影工厂 2015-07-01 · 分享 点击题目下方环球电影,关注中国顶尖电影微杂志 我们也许没有机会去走遍千山万水,却可以通过电影进入各种各样的角色来 ...
- DLL编写中extern “C”和__stdcall的作用
动态链接库的使用有两种方式,一种是显式调用.一种是隐式调用. (1) 显式调用:使用LoadLibrary载入动态链接库.使用GetProcAddress获取某函数地址. (2) ...
- 基于html5制作3D拳击游戏源码下载
今天给大家分享一款基于HTML5实现的3d拳王游戏源码.这款实例适用浏览器:360.FireFox.Chrome.Safari.Opera.傲游.搜狗.世界之窗. 不支持IE8及以下浏览器. 在线预览 ...
- C语言 · P1001(大数乘法)
算法提高 P1001 时间限制:1.0s 内存限制:256.0MB 当两个比较大的整数相乘时,可能会出现数据溢出的情形.为避免溢出,可以采用字符串的方法来实现两个大数之间的乘法.具体 ...
- Java调用doNet webService方法
doNet的webService 浏览器访问测试地址:http://192.168.4.17/JLWWS/sendCommand.asmx,出现 点击getDeviceValue方法,出现 上图的xm ...
- C++和Java函数传递数组参数比较
如果我想实现函数参数传递数组的业务需求,在Java中很容易实现,如下所示.因为Java有.length方法,可以获取数组的长度. public class Test { public static v ...
- jQuery分页小插件
源码如下: $.fn.pager = function (pagerInfo) { var recordCount = this.size(); if (recordCount <= pager ...