hadoop统计全球每年的最高气温和最低气温

1、课程设计题目及要求
(1)从ftp://ftp.ncdc.noaa.gov/pub/data/gsod下载2014到2018年的天气数据,然后对数据进行清洗,仅保留日期和当天的气温,数据文件保存为temperature.txt;
(2)根据temperature.txt,统计全球每年的最高气温和最低气温;要求:按每年每月统计最高和最低气温;按每年每月统计平均气温,并按年月由近到远排序;按年月筛选15-25度之间的气温数据,并按2014到2016年分别存储到3个文件中。

实验一(按每年每月统计最高和最低气温):
截取100000万行数据进行分析

package wordcount;
import java.io.IOException;
import org.apache.hadoop.io.DoubleWritable;
import org.apache.hadoop.io.IntWritable;
import org.apache.hadoop.io.LongWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Reducer;
import org.apache.hadoop.mapreduce.Reducer.Context;

public class MaxTAndMinTCombiner extends Reducer<Text, DoubleWritable, Text, DoubleWritable>{
   
	@Override
	/*
	 * reduce方法提供给reduce task进程来调用
	 * 
	 * reduce task会将shuffle阶段分发过来的大量kv数据对进行聚合,聚合的机制是相同key的kv对聚合为一组
	 * 然后reduce task对每一组聚合kv调用一次我们自定义的reduce方法
	 * 比如:<hello,1><hello,1><hello,1><tom,1><tom,1><tom,1>
	 *  hello组会调用一次reduce方法进行处理,tom组也会调用一次reduce方法进行处理
	 *  调用时传递的参数:
	 *  		key:一组kv中的key
	 *  		values:一组kv中所有value的迭代器
	 */
	protected void reduce(Text key, Iterable<DoubleWritable> values,Reducer< Text, DoubleWritable,Text, DoubleWritable>.Context context) throws IOException, InterruptedException {
   
       double maxvalue=0;
       double minvalue=100;
       for(DoubleWritable value:values) {
   
    	   if(maxvalue<value.get())
    	       maxvalue=value.get();
    	   if(minvalue>value.get())
    	   minvalue=value.get();
       }
context.write(key, new DoubleWritable(maxvalue));
context.write(key, new DoubleWritable(minvalue));}
}
package wordcount;


import java.io.IOException;
import java.util.StringTokenizer;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.conf.Configured;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.io.DoubleWritable;
import org.apache.hadoop.io.IntWritable;
import org.apache.hadoop.io.NullWritable;
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 org.apache.hadoop.util.GenericOptionsParser;
import org.apache.hadoop.util.Tool;
import org.apache.hadoop.util.ToolRunner;	
public class wordcount  extends Configured implements Tool{
   
	@Override
    public int run(String[] args) throws Exception {
   
		Configuration conf = getConf();		
	
        Job wordCountJob = Job.getInstance(conf,"word count");
		
		//重要:指定本job所在的jar包
		wordCountJob.setJarByClass(wordcount.class);
		
		//设置wordCountJob所用的mapper逻辑类为哪个类
		wordCountJob.setMapperClass(WordCountMapper.class);
		//设置wordCountJob所用的reducer逻辑类为哪个类
		wordCountJob.setReducerClass(WordCountReducer.class);
		
		//设置map阶段输出的kv数据类型
		wordCountJob.setMapOutputKeyClass(Text.class);
		wordCountJob.setMapOutputValueClass(DoubleWritable.class);
		
		//设置最终输出的kv数据类型
		wordCountJob.setOutputKeyClass(NullWritable.class);
		wordCountJob.setOutputValueClass(YearMaxTAndMinT.class);
		wordCountJob.setCombinerClass(MaxTAndMinTCombiner.class);
		//设置要处理的文本数据所存放的路径
		FileInputFormat.setInputPaths(wordCountJob, new Path("hdfs://hadoop:8020/data/hadoop/temperature30.txt"));
		FileOutputFormat.setOutputPath(wordCountJob, new Path("hdfs://hadoop:8020/output28"));
		
		//提交job给hadoop集群
		wordCountJob.waitForCompletion(true);
        return 0;
    }

    public static void main(String[] args) throws Exception {
   
        //获取当前环境变量
    	Configuration conf =  new Configuration();
    	conf.set("fs.defaultFS", "hdfs://hadoop:8020");// 指定namenode
    	
    	//使用ToolRunner的run方法对自定义的类型进行处理
    	conf.set("mapreduce.job.jar",JarUtil.jar(wordcount.class));
          	
    	try {
   
    	   ToolRunner.run(conf, new wordcount(), args);
    	} catch (Exception e) {
   
			e.printStackTrace();
		}	
    }
    
}
package wordcount;

import java.io.IOException;

import org.apache.hadoop.io.DoubleWritable;
import org.apache.hadoop.io.IntWritable;
import org.apache.hadoop.io.LongWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Mapper;
import org.apache.hadoop.mapreduce.Mapper.Context;

public class WordCountMapper extends Mapper<LongWritable, Text, Text, DoubleWritable>{
   
	YearMaxTAndMinT  yearmaxtandmint=new YearMaxTAndMinT();
	/*
	 * map方法是提供给map task进程来调用的,map task进程是每读取一行文本来调用一次我们自定义的map方法
	 * map task在调用map方法时,传递的参数:
	 * 		一行的起始偏移量LongWritable作为key
	 * 		一行的文本内容Text作为value
	 */
	@Override
	protected void map(LongWritable key, Text value,Mapper<LongWritable, Text, Text, DoubleWritable>.Context context) throws IOException, InterruptedException {
   
		//拿到一行文本内容,转换成String 类型
		String line = value.toString();
		//将这行文本切分成单词
		//int[] indexs=getIndexs(line);
		String[] words=line.split(" ");
	    String s1=words[0].substring(0,
  • 5
    点赞
  • 50
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
Mapreduce实验报告 前言和简介 MapReduce是Google提出的一种编程模型,在这个模型的支持下可以实现大规模并行化计 算。在Mapreduce框架下一个计算机群通过统一的任务调度将一个巨型任务分成许多部分 ,分别解决然后合并得到最终结果。Mapreduce可以让程序员以简单的程序来解决实际问 题,而隐藏了诸如分布、工作调度、容错、机器间通信,使得大规模任务简单而迅速地 完成。 1. Mapreduce的基本原理 1. 核心思想。 "Divide and Conquer"是Mapreduce的核心思想。面对一个规模庞大的问题,要 处理是以TB计的数据,Mapreduce采用"输入"------"分解"------"解决"----- -"聚合"------"输出结果"的基本过程。 2. 基本原理 Map和Reduce是两个核心操作,用户定义的map函数接收被切割过的原始的key/ value对集并且计算出一个中间key/value对集。Mapreduce库函数将所有的具有 相同key值的value聚合在一起交给用户定义的reduce函数处理。reduce函数将 同一key值的所有value合并成得到输出文件。在整个过程中,Mapreduce库函数 负责原始数据的切割,中间key/value对集的聚合,以及任务的调度,容错、通 信控制等基础工作。而用户定义的map和reduce函数则根据实际问题确定具体操 作。 2. 框架的基本结构和执行流程 基本结构 Mapreduce框架的主要程序分为三种即Master,Map和Reduce。 1. Master:主要功能有两个,任务的分割和任务的调度。Master把输入文件切成许 多个split,每个split文件一般为几十M。Master同时还要调度任务监视各个 map worker和reduce worker的工作状态,以做出相应的安排。Master还要监视各个子任务的完成进 展情况。 Master用到的数据结构 Struct Split[] //文件切割后的信息 struct MapSTATE[] //记录各个map任务的情况。 struct ReduceSTATE[R] //各个reduce任务的情况。 Type Map=0,Reduce=0 //记录map任务和reduce任务的完成个数。 MapWorkerSTATE[] ReduceWorkerSTATE[] //各个工作机器的忙闲状态 FileSplit(string inputfilename) //输入文件切割 JobAssign() //工作任务分配 2. Map:主要功能是读取经过切割split文件形成一个map任务,分析map任务,得到 中间结构并且将同一类型的中间文件存放在同一个区域内等待特定的reduce程 序读取。 3. Reduce:不同的Reduce读取各个Map得到的特定的中间文件,将所有相同的中间 文件整合成最后的输出文件。 任务执行基本流程 基本流程图见下一页 首先输入收据文件被Mapreduce库函数分割成M个split集。用户定义的程序被 拷贝到机群中,其中一个是master,其它的都是worker。M个map任务和R个reduc e任务将被分配。Master负责调度任务和过程监视。随时检测worker的工作状况, 任务的完成进度。Map worker每完成一个子任务向master报告。 一个被分配了map任务的worker读取一个split集,该worker从这个split集中 分析出key/value对,然后有map函数来处理这些key/value对并得到中间key/val ue对,这些key/value对将最终存放在map worker的本地硬盘上。每完成一个任务报告master。 中间key/value对被存在本地硬盘的R个不同的区域中,由于可能的key值很可 能不止R个,故必须利用一个分割函数来划分中间文件,常用的是散列的方法(如 hash(key) mod R)。保证key值相同的key/value对被存放同一区域中,并且将位置报告给maste r。如果同一个key的中间文件多而小可以考虑用cmobine函数在本地进行合并。 当所有的split都被分析完成之后,reduce worker开始工作,每个reduce根据master的安排和信息指示利用机群的内部文件 系统读取map worker本地磁盘中特定位置的中间文件。 Reduce开始聚合中间文件,得到自己的输出文件。在聚合的过程中由于有很 多key值,一般将用到排序。Reduce worker完成自己的工作后向master报告。 控制 分析key/value对 分区写入磁盘 读取 *单向箭头表示控制,双向箭头表示控制
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值