MapReduce编程实例(一)

MapReduce编程实例(一)前提准备:1.hadoop安装运行正常,请参考2.集成开发环境正常,请参考Ubuntu搭建Hadoop源码阅读环境开发示例:WordCount本示例详细的介绍如何在集成环境中运行第一个MapReduce程序WordCount

大家好,又见面了,我是你们的朋友全栈君。

前提准备:

1.hadoop安装运行正常。Hadoop安装配置请参考:Ubuntu下 Hadoop 1.2.1 配置安装

2.集成开发环境正常。集成开发环境配置请参考 :Ubuntu 搭建Hadoop源码阅读环境

MapReduce编程实例:

MapReduce编程实例(一),详细介绍在集成环境中运行第一个MapReduce程序 WordCount及代码分析

MapReduce编程实例(二),计算学生平均成绩

MapReduce编程实例(三),数据去重

MapReduce编程实例(四),排序

MapReduce编程实例(五),MapReduce实现单表关联


开发示例:WordCount

本文例详细的介绍如何在集成环境中运行第一个MapReduce程序 WordCount,以及WordCount代码分析

新建MapReduce项目:

 MapReduce编程实例(一)MapReduce编程实例(一)

Finish生成项目如下,建立WordCount.java类

MapReduce编程实例(一)

WordCount.java类代码以下详细解,先运行起来。

在HDFS建立新目录并上传若干实验用的文本,上传后如下:

MapReduce编程实例(一)

配置Run Configuration 参数:

hdfs://localhost:9000/user/dat/input hdfs://localhost:9000/user/dat/output

MapReduce编程实例(一)

Run On Hadoop,

MapReduce编程实例(一)

OK,运行成功,检查HDFS的文件生成

MapReduce编程实例(一)

Eclipse中可以直接查看也可以在命令行中查看结果

MapReduce编程实例(一)

OK,第一个MapReduce程序 WordCount已经成功运行。下面开始解析代码部分

———————————————-烦人的分割线—————————————————–

代码:

import java.io.IOException;
import java.util.StringTokenizer;

import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.io.IntWritable;
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;


public class WordCount {
	
	//嵌套类 Mapper
	//Mapper<keyin,valuein,keyout,valueout>
	public static class WordCountMapper extends Mapper<Object, Text, Text, IntWritable>{
		private final static IntWritable one = new IntWritable(1);
		private Text word = new Text();
		
		@Override
		protected void map(Object key, Text value, Context context)
				throws IOException, InterruptedException {
			StringTokenizer itr = new StringTokenizer(value.toString());
			while(itr.hasMoreTokens()){
				word.set(itr.nextToken());
				context.write(word, one);//Context机制
			}
		}
	}
	
	
	//嵌套类Reducer
	//Reduce<keyin,valuein,keyout,valueout>
	//Reducer的valuein类型要和Mapper的va lueout类型一致,Reducer的valuein是Mapper的valueout经过shuffle之后的值
	public static class WordCountReducer extends Reducer<Text, IntWritable, Text, IntWritable>{
		private IntWritable result = new IntWritable();

		@Override
		protected void reduce(Text key, Iterable<IntWritable> values,
				Context context)
				throws IOException, InterruptedException {
			int sum  = 0;
			for(IntWritable i:values){
				sum += i.get();
			}
			result.set(sum);
			context.write(key,result);//Context机制
		}

		
		
	}
	
	public static void main(String[] args) throws Exception{
		Configuration conf = new Configuration();//获得Configuration配置 Configuration: core-default.xml, core-site.xml
		String[] otherArgs = new GenericOptionsParser(conf, args).getRemainingArgs();//获得输入参数 [hdfs://localhost:9000/user/dat/input, hdfs://localhost:9000/user/dat/output]
		if(otherArgs.length != 2){//判断输入参数个数,不为两个异常退出
			System.err.println("Usage:wordcount <in> <out>");
			System.exit(2);
		}
		
		设置Job属性
		Job job = new Job(conf,"word count");
		job.setJarByClass(WordCount.class);
		job.setMapperClass(WordCountMapper.class);
		job.setCombinerClass(WordCountReducer.class);//将结果进行局部合并
		job.setReducerClass(WordCountReducer.class);
		job.setOutputKeyClass(Text.class);
		job.setOutputValueClass(IntWritable.class);
		
		
		FileInputFormat.addInputPath(job, new Path(otherArgs[0]));//传入input path
		FileOutputFormat.setOutputPath(job, new Path(otherArgs[1]));//传入output path,输出路径应该为空,否则报错org.apache.hadoop.mapred.FileAlreadyExistsException。
		
		System.exit(job.waitForCompletion(true)?0:1);//是否正常退出
	}
	
}

先解释两个Java基础问题

———————————-StringTokener类————————————————————–

Java语言中,提供了专门用来分析字符串的类StringTokenizer(位于java.util包中)。该类可以将字符串分解为独立使用的单词,并称之为语言符号。语言符号之间由定界符(delim)或者是空格、制表符、换行符等典型的空白字符来分隔。其他的字符也同样可以设定为定界符。StringTokenizer类的构造方法及描述见表15-6所示。

表15-6                                          StringTokenizer类的构造方法及描述

构 造 方 法

描    述

StringTokenizer(String str)

为字符串str构造一个字符串分析器。使用默认的定界符,即空格符(如果有多个连续的空格符,则看作是一个)、换行符、回车符、Tab符号等

StringTokenizer(String str, String delim)

为字符串str构造一个字符串分析器,并使用字符串delim作为定界符

StringTokenizer类的主要方法及功能见表15-7所示。

表15-7                                          StringTokenizer类的主要方法及功能

方    法

功    能

String nextToken()

用于逐个获取字符串中的语言符号(单词)

boolean hasMoreTokens()

用于判断所要分析的字符串中,是否还有语言符号,如果有则返回true,反之返回false

int countTokens()

用于得到所要分析的字符串中,一共含有多少个语言符号

 

下面是一个例子。

String s1 = “|ln|ln/sy|ln/dl|ln/as|ln/bx|”;
StringTokenizer stringtokenizer1 = new StringTokenizer(s1, “|”);

while(stringtokenizer1 .hasMoreTokens()) {

 String s3 = stringtokenizer.nextToken();
 System.out.println(s3);
}

输出:
ln
ln/sy
ln/dl
ln/as
ln/bx

——————————————-Java 静态内部类 内部类———————————————–

请参考文章:http://blog.csdn.net/yakihappy/article/details/3979858

——————————————-Java的反射机制——————————————————–

请参考文章:http://www.cnblogs.com/rollenholt/archive/2011/09/02/2163758.html

请参考文章:http://lavasoft.blog.51cto.com/62575/15433/

请参考文章: http://lavasoft.blog.51cto.com/62575/43218/

—————————————-WordCount MapReduce代码分析————————————-

代码分为三部分,一个主函数,一个嵌套类WordCountMapper继承Mapper,一个嵌套类WordCountReducer继承Reducer。

主函数通过反射设置Job属性,设置输入输出路径.。

WordCountMapper:

一个常量IntWritable做valueout,一个Text做keyout.

重写map方法,用StringTokener解析字符串,写入context

WordCountReducer:

一个Intwritable变量,记录输出个数。

reduce函数解析values计算数量,设置context的keyout,valueout。

ok,就是这么easy。。。

注意map和reduce都是回调函数,是由MapReduce框架控制的,还未深入研究。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/150507.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • 网络游戏开发基础篇

    本篇的内容,会介绍几个内容:单例,dll动态加载以及一些跨平台的处理。       1、单例:单例模式是一种使用广泛而又比较简单的设计模式,他的定义我就不多介绍了,大家上网一查就知道了,基本都能理解。在游戏开发中,会有很多单件,所以封装一个单例类供后面的开发使用。       本单例使用模板实现,代码如下:[cpp] viewplaincopyprint?//

  • Activity详细解释(生命周期、以各种方式启动Activity、状态保存,等完全退出)

    Activity详细解释(生命周期、以各种方式启动Activity、状态保存,等完全退出)

    2021年12月17日
  • springboot整合mybatis实现增删改查

    springboot整合mybatis实现增删改查立志存高远,笃行践初心三更灯火五更鸡,正是男儿读书时。黑发不知勤学早,白首方悔读书迟。立志,标定人生方向;奋斗,创造人生价值,二者相辅相成,互相促进。大部分程序员的「目标」都是成为一名优秀的工程师,一名可以统览全局的「架构师」。千里之行始于足下对于大部分普通人而言,成为一名优秀的架构师还是有一定难度的,「千里之行始于足下,一步一个脚印,慢慢来」。????粉丝专属福利:包邮送书3本,如下书单四选一。????获取方式:1、参与文末投票,点赞,收藏即有机会获得精

  • mysql5.7卸载不干净_mysql卸载残留

    mysql5.7卸载不干净_mysql卸载残留一、在控制面板中卸载mysql软件,此时mysql没有卸载干净。二、卸载过后删除C:ProgramFiles(x86)MySQL该目录下剩余了所有文件,把mysql文件夹也删了三、windows+R运行“regedit”文件,打开注册表四、删除注册表:HKEY_LOCAL_MACHINESYSTEMControlSet001ServicesEventlogApplicationMySQL文件夹…

  • tracert工作原理简述_tracert三个时间

    tracert工作原理简述_tracert三个时间linux上为tracerouteTracert 命令用 IP 生存时间 (TTL) 字段和 ICMP 错误消息来确定从一个主机到网络上其他主机的路由。首先,tracert送出一个TTL是1的IP 数据包到目的地,当路径上的第一个路由器收到这个数据包时,它将TTL减1。此时,TTL变为0,所以该路由器会将此数据包丢掉,并送回一个「ICMPtimeexceeded」消息(包

  • 二进制与十进制的讲解与转换「建议收藏」

    二进制与十进制的讲解与转换「建议收藏」文章目录?什么是十进制呢??什么是二进制??十进制和二进制之间可以转换吗??十进制与二进制之间的转换?二进制转十进制?十进制转二进制?写在最后哈喽,大家好!这是我的第一篇博客,就先来介绍一下自己吧,我是Why,一名在读学生,目前刚刚开始进入自己的编程学习生涯。虽然学习起步较晚,但我坚信做了才有0或1的可能。学了一段时间以后也是选择在CSDN上分享自己的日常笔记,也希望能够在众多道友的大家庭中打成一片。本文主要讲解二进制以及进制之间的转换,如果大家读后觉得有用的话,还请大家多多支持博主:欢迎❤️点赞

    2022年10月18日

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号