`
wangwei3
  • 浏览: 120351 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

初探map/reduce原理

 
阅读更多
下面的代码来自于hadoop官网,但是那个例子很繁琐,我对此作了简化

运行下面代码必须在linux系统上,并且已经成功部署安装hadoop


package com.hadoop.test3;

import java.io.IOException;
import java.util.*;

import org.apache.hadoop.fs.Path;
import org.apache.hadoop.conf.*;
import org.apache.hadoop.io.*;
import org.apache.hadoop.mapred.*;
import org.apache.hadoop.util.*;

public class WordCount {
	public static class Map extends MapReduceBase implements Mapper<LongWritable, Text, Text, IntWritable>{
		private final static IntWritable one=new IntWritable(1);
		private Text word=new Text();
		
		public void map(LongWritable key,Text value,OutputCollector<Text, IntWritable>output,Reporter reporter)throws IOException{
			String line=value.toString();
			StringTokenizer tokenizer=new StringTokenizer(line);
			while(tokenizer.hasMoreElements()){
				word.set(tokenizer.nextToken());
				output.collect(word,one);
			}
		}
	}
	
	public static class Reduce extends MapReduceBase implements Reducer<Text, IntWritable, Text, IntWritable>{
		public void reduce(Text key,Iterator<IntWritable>values,OutputCollector<Text, IntWritable>output,Reporter reporter)throws IOException{
			int sum=0;
			while(values.hasNext()){
				sum+=values.next().get();
			}
			output.collect(key, new IntWritable(sum));
		}
	}
	
	public static void main(String[] args) throws Exception{
		JobConf conf=new JobConf(WordCount.class);
		conf.setJobName("wordcount");
		
		conf.setOutputKeyClass(Text.class);
		conf.setOutputValueClass(IntWritable.class);
		
		conf.setMapperClass(Map.class);
		conf.setCombinerClass(Reduce.class);
		conf.setReducerClass(Reduce.class);
		
		conf.setInputFormat(TextInputFormat.class);
		conf.setOutputFormat(TextOutputFormat.class);
		
		FileInputFormat.setInputPaths(conf, new Path("/home/root/test/input"));
		FileOutputFormat.setOutputPath(conf, new Path("/home/root/test/output"));
		
		JobClient.runJob(conf);
	}
}




假设:

•/home/root/test/input - 是HDFS中的输入路径
•/home/root/test/output - 是HDFS中的输出路径

1.创建 /home/root/test/input
2.在此目录下创建三个文本文件,分别命名为:file01,file02,file03
  file01输入内容"Hello World Bye World"
  file02输入内容"Hello Hadoop Goodbye Hadoop"
  file03输入内容"hello Hadoop Goodbye hadoop"

3.运行程序

运行结果为
Bye      1
Goodbye  2
Hadoop   3
Hello    2
World    2
hadoop   1
hello    1

从运行结果可以看出 mapreduce是区分大小写的,而且仅仅是以空格来划分字符的

在运行程序中可能会报"org.apache.hadoop.mapred.FileAlreadyExistsException"那是因为程序会自动创建输出目录,如果此目录已存在就会报此异常,所以运行前注意先删除"/home/root/test/output"目录

下面我们来看看原理

Mapper(14-26行)中的map方法通过指定的 TextInputFormat一次处理一行。然后,它通过StringTokenizer 以空格为分隔符将一行切分为若干tokens,之后,输出< <word>, 1> 形式的键值对。

对于示例中的第一个输入,map输出是:
< Hello, 1>
< World, 1>
< Bye, 1>
< World, 1>


第二个输入,map输出是:
< Hello, 1>
< Hadoop, 1>
< Goodbye, 1>
< Hadoop, 1>

第三个输入,map输出是:
< hello, 1>
< Hadoop, 1>
< Goodbye, 1>
< hadoop, 1>

WordCount还指定了一个combiner 因此,每次map运行之后,会对输出按照key进行排序,然后把输出传递给本地的combiner(按照作业的配置与Reducer一样),进行本地聚合。

第一个map的输出是:
< Bye, 1>
< Hello, 1>
< World, 2>


第二个map的输出是:
< Goodbye, 1>
< Hadoop, 2>
< Hello, 1>

第三个map的输出是:
< Goodbye, 1>
< hadoop, 1> 
< Hadoop, 1>
< hello, 1>

Reducer中的reduce方法 仅是将每个key(本例中就是单词)出现的次数求和。

因此这个作业的输出就是:
< Bye, 1>
< Goodbye, 2>
< Hadoop, 3>
< Hello, 2>
< World, 2>
< hadoop, 1>
< hello, 1>

代码中的run方法中指定了作业的几个方面, 例如:通过命令行传递过来的输入/输出路径、key/value的类型、输入/输出的格式等等JobConf中的配置信息。随后程序调用了JobClient.runJob来提交作业并且监控它的执行。

0
0
分享到:
评论

相关推荐

    SNORT原理简介和优化和GNORT初探_SNORT原理简介和优化和GNORT初探_

    **GNORT初探** GNORT是SNORT的一个变种或扩展,可能是一个社区项目或者研究性的尝试,用于增强SNORT的功能或改善其性能。由于信息有限,无法提供详细说明,但通常这样的项目可能会涉及以下方面: 1. **增强功能**...

    关于物联网智能家居的初探

    关于物联网智能家居的初探. 关于物联网智能家居的初探

    JVM初探内存分配GC原理与垃圾收集器共16页.pdf.z

    深入理解JVM内存分配、垃圾收集(Garbage Collection, GC)原理以及垃圾收集器的工作方式对于优化程序性能至关重要。 首先,我们要了解JVM内存结构。在Java中,内存主要分为以下几个区域: 1. **堆内存(Heap)**...

    初探浏览器缓存实现原理-提高性能

    本文将深入探讨浏览器缓存的实现原理。 首先,浏览器缓存的获取路径包括服务器、本地缓存以及缓存服务器。当用户发起一个HTTP请求时,浏览器会根据服务器返回的HTTP响应头信息来决定是从哪个来源获取内容。页面文件...

    ROM刷机原理及ROM制作技术初探

    ROM刷机原理及ROM制作技术初探 一、刷机原理 说起来,刷机就是两种方法: 一是recovery方法,就是我们平时将update.zip入到SD卡,然后alt-s的方法,这种方法是调用了recovery的方法将各种img或文件进行复制等操作。...

    Spy++ 原理初探VC++相关源代码

    它是由Microsoft提供的一款开发工具,可以帮助开发者深入了解Windows操作系统底层的工作原理。本篇文章将深入探讨Spy++的原理,并结合VC++的相关源代码进行解析。 首先,我们需要了解Spy++的核心功能。它能够实时...

    Android系统ROM刷机原理及ROM制作技术初探.doc

    Android 系统 ROM 刷机原理及 ROM 制作技术初探 Android 系统 ROM 刷机原理及 ROM 制作技术初探是一篇关于 Android 系统 ROM 刷机原理及 ROM 制作技术的初步探索文章。文章主要介绍了 Android 系统 ROM 刷机原理、...

    生物芯片原理初探.pptx

    生物芯片原理初探.pptx

    Spy++原理初探

    本文将深入探讨Spy++的工作原理,并通过VC++源码来解析其内部机制。 首先,让我们理解Spy++的基本功能。Spy++能够显示Windows系统中的所有窗口,包括隐藏的窗口,并提供详细的窗口属性信息,如类名、句柄、父窗口...

    JVM初探- 内存分配、GC原理与垃圾收集器

    再者,GC原理涉及到垃圾收集算法,主要包括分代收集算法和分区收集算法。分代收集算法是目前主流的收集方式,它将堆内存分为新生代和老年代,根据对象的存活周期不同,采用不同的收集策略。新生代采用复制算法,因为...

    大数据背景下高职院校《数据结构》课程的教学改革初探.pdf

    例如,Hadoop框架中的Map/Reduce机制,其排序过程使用了循环队列原理以提高内存利用率,而分布式文件系统HDFS的管理则依赖于数据结构中的哈希方法。这些实际应用案例的引入,可以加深学生对于数据结构理论知识的理解...

    量子信息网络概念原理与发展前景初探.docx

    ### 量子信息网络概念原理与发展前景初探 #### 一、引言 随着量子信息技术的快速发展,特别是量子计算、量子通信以及量子精密测量等领域取得了显著的进步,这些技术成为了当前科技界的研究热点。量子信息网络作为...

    白光747吸锡器工作原理初探

    该设备的工作原理是利用高温将焊锡熔化,然后通过吸力将其吸走,使得操作过程更加精准且高效。下面,我们将深入探讨白光747吸锡器的电路结构和工作原理。 首先,白光747吸锡器的核心部分是加热元件,它通常采用的是...

    生物芯片原理初探.ppt编程资料

    生物芯片原理初探.ppt编程资料

    基于Java的编译原理课程案例教学方法初探.pdf

    基于 Java 的编译原理课程案例教学方法初探 本文探讨基于 Java 的编译原理课程案例教学方法,旨在提高学生对编译原理的理解和掌握。文章首先介绍了编译原理在软件科学中的重要性,然后探讨了基于 Java 的编译原理...

    索引原理初探,帮你写出更棒的索引

    ### 索引原理初探:提升数据库性能的关键 #### 一、引言 在现代企业信息化建设中,管理信息系统(MIS)扮演着至关重要的角色。MIS系统的高效运行不仅依赖于前端用户界面的设计与优化,更离不开后端数据库的有效管理...

    13- 初探B5G&6G终端_中文版 _final(1).pdf

    B5G和6G终端技术是目前通信行业研究的前沿领域。随着5G技术的商用化,业界开始探索下一代移动通信技术,即6G。预计6G将在2030年开始商用化,其研究工作已引起全球通信界的广泛关注。国际电信联盟(ITU)和ITU网络...

    SpringBoot自动装配原理分析(初探).xmind

    SpringBoot自动装配原理分析(初探)思维导图

    利用Google Map API开发轻量级GIS桌面应用程序之初探.pdf

    "利用Google Map API开发轻量级GIS桌面应用程序之初探" 本文旨在探讨如何利用Google Map API开发轻量级GIS桌面应用程序。Google Map API是Google公司为开发者提供的Maps编程API,它允许开发者在不必建立自己的地图...

Global site tag (gtag.js) - Google Analytics