`
eastzhang
  • 浏览: 10391 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

Hadoop应用系列2--MapReduce原理浅析(上)

阅读更多
我们以《Hadoop权威指南》这本书上的例子,来分析一下,MapReduce是如何工作的。
我们引用它分析气温的例子。这个例子还是非常经典的,我个人认为小缺点就是,没有对传统的程序是如何工作的进行对比,如果加入此项,它将是一个完美的东西,现在就让我们,来完美它。

手写我们写一段Java程序,实现相同的功能<分析1901年和1902年最高气温>,当然程序略加改动就可以分析最低气温,在改动一下,就可以高和低同时出现,废话了,呵呵。

这里需要使用气温的数据, 我会提供下载链接。

我们提出一行数据,看看,年份在哪里

0029029070999991901010106004+64333+023450FM-12+000599999V0202701N015919999999N0000001N9-00781+99999102001ADDGF108991999999999999999999
package org.pcwl;

/**
 * @author QQ:81739279 e-mail: project_maker@sina.com 
 * 需要的基本知识 java.lang.String API
 * 本段程序的目的是找到我们要使用的数据在什么地方
 * 注意: NCDC的气温数据精确到小数点后1为
 */
public class MaxTemperatureReady {

	/** 在1901年数据中,复制出来第一行,用于寻找年份、气温 */
	private static final String data = "0029029070999991901010106004+64333+023450FM-12+000599999V0202701N015919999999N0000001N9-00781+99999102001ADDGF108991999999999999999999";
	
	public static void main(String[] args) {
		
		// 显示年份 运行结果 15 ,我们需要4为,至19 
		System.out.println(data.indexOf("1901"));
		
		// 气温,是一个数字,有正数和负数, 在字符串中,找看看,+/-在哪里 , 以确定截取区域
		// 在这里我没发现 有 +64333+025450FM-12+000599999V020........N9-00781+
		// 结论, N0000001N9至+这个位置之间是气温, 找他的位置
		// 运行结果 77 加上这10位,结果为87 , 如果低87为是+不需要 下一个符号+ 之前是5为
		System.out.println(data.indexOf("N0000001N9"));
		
		// 找一条看看
		String fmt = "%s年%d度";
		// 注意:不含92 也就是 这里能娶到-0078 零下7.8的意思, 如果零下78.1冻死人诶~~~
		System.out.println(String.format(fmt, data.substring(15,19), Integer.parseInt(data.substring(87, 92)) ));

		// 好了, 数据如何提取我们已经知道了.
	}

}


开始编写程序来分析最高气温吧.

package org.pcwl;
import java.io.BufferedReader;
import java.io.DataOutputStream;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.FileReader;
import java.io.IOException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;

/**
 * 
 * @author E-mail:project_maker@sina.com
 * 计算最高气温, 本程序分2个部分, 一个部分读取数据,一个部分对数据进行计算,输出结果
 */
public class JavaMaxTemperature {
	
	/** 用于存储读取到的年份和气温数据
	 *  一年中有很多天<valueList<Integer>>,
	 *  年份是固定的几个<key>
	 */
	private static Map<String, List<Integer>> temperatureMap= new HashMap<String, List<Integer>>();
	private static File outDirectory = null;
	private static DataOutputStream dos = null;
	/**
	 * @throws IOException 
	 */
	public static void main(String[] args) throws IOException {
		if(args.length != 2){
			System.out.println("请输入数据来源和数据目标");
		}
		/* 创建目标文件*/
		outDirectory = new File(args[1]);
		File outFile = new File(outDirectory, "part-0000");
		dos = new DataOutputStream(new FileOutputStream(outFile));
		
		/* 读取指定文件夹下的文件 */
		File inDirectory = new File(args[0]);
		for(File inFile : inDirectory.listFiles()){
			readData(inFile);
		}
		
		/* 关闭输出流 */
		dos.close();
		
	}
	/**
	 * 读取数据, 把年份作为map的Key, List<Integer>存放每一天的气温数据
	 * @param file
	 * @throws IOException
	 */
	static void readData(File file) throws IOException {
		BufferedReader br = new BufferedReader(new FileReader(file));
		String line = null;
		while(null != (line=br.readLine())){
			String year = line.substring(15, 19);
			int temperature;
			if(line.charAt(87) == '+'){
				temperature = Integer.parseInt(line.substring(88, 92));
			}else{
				temperature = Integer.parseInt(line.substring(87, 92));
			}
			/* 运行程序发现1901结果为9999, 黄金都能融化,显然999是个错误的数据,排除 */
			if(temperature != 9999 ){
				addYearAndTemperature(year, temperature);
			}
		}
		
		out();
	}
	/**
	 * 添加年份和气温数据到map中
	 * @param year
	 * @param temperature
	 */
	static void addYearAndTemperature(String year, int temperature){
		List<Integer> list;
		if(temperatureMap.containsKey(year)){
			list = temperatureMap.get(year);
		}else{
			list = new ArrayList<Integer>();
		}
		list.add(temperature);
		temperatureMap.put(year, list);
		
	}
	/**
	 * 计算最高气温并且输出
	 * @throws IOException 
	 */
	static void out() throws IOException{
		int max = Integer.MIN_VALUE;
		String year = null;
		for(Iterator<String> it = temperatureMap.keySet().iterator(); it.hasNext();){
			year= it.next();
			List<Integer> temperatures = temperatureMap.get(year);
			for(Integer i : temperatures){
				max = Math.max(max, i);
			}
		}
		dos.writeUTF(year +"\t" + max+"\n");
		
		temperatureMap.clear();
	}
}


src为代码,data为数据

宝宝醒了, 等会再来写 MapReduce,请期待.....
分享到:
评论
3 楼 Tracy-Lcz 2013-01-26  
看了文章,如果说是《《MapReduce原理浅析(上)》》,有点扯的感觉,希望继续加油~共同进步。
2 楼 sophie1162 2013-01-26  
老师,齐院长飘过~  嘿嘿
1 楼 sophie1162 2013-01-26  

相关推荐

    Hadoop HDFS和MapReduce架构浅析.pdf

    Hadoop HDFS和MapReduce架构浅析.pdf 更多资源请点击:https://blog.csdn.net/weixin_44155966

    Hadoop+HDFS和MapReduce架构浅析

    ### Hadoop+HDFS和MapReduce架构浅析 #### 摘要 本文旨在深入剖析Hadoop中的两大核心组件——HDFS(Hadoop Distributed File System)和MapReduce的工作原理及其实现机制。首先,我们将介绍Hadoop NameNode与...

    (hadoop HDFS 和 Mapreduce 架构浅析

    HDFS的设计理念是将大文件分割成固定大小的数据块(block),默认大小为128MB(在Hadoop 2.x版本中),这些数据块分散存储在集群的不同节点上。Namenode和Datanode是HDFS的两个关键组件,其中Namenode负责管理文件...

    大数据云计算技术 Hadoop应用浅析(共16页).pptx

    标题中的“大数据云计算技术 Hadoop应用浅析”指的是对Hadoop这一大数据处理框架在云计算环境下的应用进行简要探讨。Hadoop是Apache软件基金会开发的一个开源项目,它为大规模数据处理提供分布式计算解决方案。 ...

    大数据云计算技术 Hadoop应用浅析(共16页).rar

    本资料《大数据云计算技术 Hadoop应用浅析》旨在深入探讨Hadoop在大数据处理中的核心价值及其实际应用场景。 Hadoop是Apache软件基金会开发的一个开源框架,主要用于处理和存储海量数据。它基于分布式计算模型,即...

    大数据云计算技术 Hadoop的相关技术与应用案例分享 全套PPT 共9套PPT课件.rar

    大数据云计算技术 Hadoop应用浅析(共16页).pptx 大数据云计算技术 Hadoop运维杂记(共21页).pptx 大数据云计算技术 暴风集团基于hadoop的数据平台总体架构简介(共18页).ppt 大数据云计算技术 淘宝网Hadoop与...

    基于Hadoop的气象云储存与数据处理应用浅析.pdf

    基于Hadoop的气象云储存与数据处理应用浅析 本文主要介绍了Hadoop架构的构成,并对Hadoop架构的MapReduce实现进行了详细的描述。同时,本文还开发出一个在Hadoop架构的基础上进行气象数值统计的实例,并根据这个...

    Java编写Mapreduce程序过程浅析

    在大数据处理领域,Apache Hadoop的MapReduce框架是不可或缺的一部分,尤其对于Java开发者而言,学习如何用Java编写MapReduce程序是提升数据处理能力的关键。本文将深入浅出地解析Java MapReduce程序的编写过程,...

    精品资料(2021-2022年收藏)浅析云计算与计算机网络1.doc

    5. 大规模数据处理技术:如Apache Hadoop,用于处理和存储海量数据,是“蓝云”中的重要组成部分,其MapReduce编程模型简化了大数据分析。 6. 存储结构:云计算往往依赖于存储区域网络(SAN),提供高速、灵活的...

    《Hadoop开发者》第三期

    随着Hadoop生态系统的不断发展,越来越多的应用程序和工具开始支持运行在Hadoop上,利用其强大的数据处理能力。 #### 示例应用 - **Apache Spark**:一个快速通用的大规模数据处理引擎,可在Hadoop之上运行。 - **...

    MapReduce实例浅析

    HadoopMap/Reduce是一个使用简易的软件框架,基于它写出来的应用程序能够运行在由上千个商用机器组成的大型集群上,并以一种可靠容错的方式并行处理上T级别的数据集。一个Map/Reduce作业(job)通常会把输入的数据集...

    hadoop开发者第三期

    “Run on Hadoop”可能指的是如何在Hadoop平台上运行各种类型的应用程序和服务。这包括但不限于MapReduce作业、Spark作业、Hive查询等。 #### 在Hadoop上运行应用的关键要素 1. **集群配置**:确保Hadoop集群正确...

    WordCount 源码浅析(1)

    这篇博客将对 WordCount 的源码进行初步解析,帮助初学者理解 Hadoop MapReduce 的工作原理。 首先,我们要明白 WordCount 的基本流程。它分为两个主要阶段:Map 阶段和 Reduce 阶段。Map 阶段的任务是对输入数据...

    浅析大数据技术在测绘地理信息中的应用_孙安利1

    例如,利用 Spark 技术进行地理空间数据流处理,Spark 提供了更高效的内存计算,相比 Hadoop MapReduce 减少了数据读写磁盘的次数,提升了处理速度。此外,时空数据的可视化也是大数据技术的重要应用,通过GIS(地理...

    HDFS存储系统浅析.doc

    【HDFS 存储系统浅析】 Hadoop Distributed File System(HDFS)是Apache Hadoop框架的核心组件之一,是一个分布式文件系统,旨在处理和存储大量数据。HDFS的设计目标是提供高容错性和高吞吐量的数据访问,适用于...

    大数据挖掘技术在在线教育平台中的应用浅析.pdf

    而Hadoop和MapReduce则分别是分布式存储和分布式计算的重要技术,它们使得在海量数据上进行挖掘成为可能。 根据所提供的部分内容,可以观察到在参考文献中出现了关于大数据及数据挖掘的重要文章,如Manyika等人撰写...

Global site tag (gtag.js) - Google Analytics