hadoop的wordcount的改动版

//这个是在原来的基础上改动以后得到的,将当中的分词的根据给换掉了,而且进行词频统计的时候会自己主动的忽略大写和小写

packageorg.apache.hadoop.mapred;

importjava.io.IOException;

importjava.util.ArrayList;

importjava.util.Iterator;

importjava.util.List;

importjava.util.StringTokenizer;

importorg.apache.hadoop.conf.Configuration;

import org.apache.hadoop.conf.Configured;

importorg.apache.hadoop.fs.Path;

importorg.apache.hadoop.io.IntWritable;

importorg.apache.hadoop.io.LongWritable;

importorg.apache.hadoop.io.Text;

importorg.apache.hadoop.mapred.FileInputFormat;

import org.apache.hadoop.mapred.FileOutputFormat;

importorg.apache.hadoop.mapred.JobClient;

importorg.apache.hadoop.mapred.JobConf;

importorg.apache.hadoop.mapred.MapReduceBase;

importorg.apache.hadoop.mapred.Mapper;

importorg.apache.hadoop.mapred.OutputCollector;

import org.apache.hadoop.mapred.Reducer;

importorg.apache.hadoop.mapred.Reporter;

importorg.apache.hadoop.util.Tool;

importorg.apache.hadoop.util.ToolRunner;

public classWordCount extends Configured implements Tool {

/*

这个类实现mapper接口的map方法,输入的是文本总的每一行。

利用StringTokenizer将字符串拆分成单词。然后将输出结果(word,
1)写入到OutputCollector中去

OutputCollector有hadoop框架提供,负责收集mapper和reducer的输出数据,实现map函数和reduce函数时。仅仅须要将输出的<key,value>对向OutputCollector一丢就可以,其余的事情框架会自己处理。

*/

public static class MapClass extendsMapReduceBase

implements Mapper<LongWritable, Text,Text, IntWritable> {

private final static IntWritable one = newIntWritable(1);

private Text word = new Text();

/*类中的LongWritable,  Text, IntWritable是hadoop中实现的用于封装Java数据类型的类,这些类都可以被串行化从而便于在分布式系统中进行数据交换。可以将它们等同的视为long,string,int的替代品

*/

public void map(LongWritable key, Textvalue,

OutputCollector<Text,IntWritable> output,

Reporter reporter) throwsIOException {

String line = value.toString();

StringTokenizer itr = new StringTokenizer(line,”\t\n\r\f,. : ; ? ! [] ‘ ”);

//原来仅仅是用空格来分词。如今利用标点和空格等进行分词

while (itr.hasMoreTokens()) {

word.set(itr.nextToken().toLowerCase());//单词统计的时候忽略大写和小写

output.collect(word, one);//输出结果(word。1)

}

}

}

/*

此类实现的是Reducer接口中的reduce方法。函数中的參数key.value是由mapper输出的中间结果。values是一个iterator(迭代器)

*/

public static class Reduce extendsMapReduceBase

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;

/*

遍历这个迭代器,就行得到有同样的key的全部的value值。

此处的key是一个单词,而value则是词频

*/

while (values.hasNext()) {

sum += values.next().get();

}

//遍历后得到这个单词出现的总次数。

output.collect(key, newIntWritable(sum));

}

}

static int printUsage() {

System.out.println("wordcount [-m<maps>] [-r <reduces>] <input> <output>");//输入输入路径

ToolRunner.printGenericCommandUsage(System.out);

return -1;

}

/*

Wordcount中map/reduce项目的主要驱动程序,调用此方法提交的map
/ reduce任务。

在hadoop中一次计算任务成为一个job,能够通过以一个JobConf对象设置怎样执行这个job,此处定义了输出的key
类型是text,而value的类型是IntWritable

*/

public int run(String[] args) throwsException {

JobConf conf = new JobConf(getConf(),WordCount.class);

conf.setJobName("wordcount");

// key是text(words)

conf.setOutputKeyClass(Text.class);

// value是IntWritable (ints)

conf.setOutputValueClass(IntWritable.class);

conf.setMapperClass(MapClass.class);

conf.setCombinerClass(Reduce.class);

conf.setReducerClass(Reduce.class);

List<String> other_args = newArrayList<String>();

for(int i=0; i < args.length; ++i) {

try {

if ("-m".equals(args[i])) {

conf.setNumMapTasks(Integer.parseInt(args[++i]));

} else if("-r".equals(args[i])) {

conf.setNumReduceTasks(Integer.parseInt(args[++i]));

} else {

other_args.add(args[i]);

}

} catch (NumberFormatException except) {

System.out.println("ERROR: Integerexpected instead of " + args[i]);

return printUsage();

} catch (ArrayIndexOutOfBoundsExceptionexcept) {

System.out.println("ERROR:Required parameter missing from " +

args[i-1]);

return printUsage();

}

}

// Make sure there are exactly 2 parametersleft.

if (other_args.size() != 2) {

System.out.println("ERROR: Wrongnumber of parameters: " +

other_args.size() +" instead of 2.");

return printUsage();

}

FileInputFormat.setInputPaths(conf,other_args.get(0));

FileOutputFormat.setOutputPath(conf, newPath(other_args.get(1)));

JobClient.runJob(conf);

return 0;

}

public static void main(String[] args) throwsException {

/* ToolRunner的run方法開始,run方法有三个參数。第一个是Configuration类的实例,第二个是wordcount的实例,args则是从控制台接收到的命令行数组

*/

int res = ToolRunner.run(newConfiguration(), new WordCount(), args);

System.exit(res);

}

}

时间: 2024-11-08 12:14:25

hadoop的wordcount的改动版的相关文章

Hadoop下面WordCount运行详解

单词计数是最简单也是最能体现MapReduce思想的程序之一,可以称为MapReduce版"Hello World",该程序的完整代码可以在Hadoop安装包的"src/examples"目录下找到.单词计数主要完成功能是:统计一系列文本文件中每个单词出现的次数,如下图所示. 现在我们以"hadoop"用户登录"Master.Hadoop"服务器. 1. 创建本地的示例数据文件: 依次进入[Home]-[hadoop]-[ha

[hadoop]hadoop权威指南例第二版3-1、3-2

hadoop版本1.2.1 jdk1.7.0 例3-1.通过URLStreamHandler实例以标准输出方式显示Hadoop文件系统的文件 hadoop fs -mkdir input 在本地创建两个文件file1,file2,file1的内容为hello world,file2内容为hello Hadoop,然后上传到input,具体方法如Hadoop集群(第6期)_WordCount运行详解中 2.1.准备工作可以看到. 完整代码如下: 1 import org.apache.hadoop

Hadoop中WordCount代码-直接加载hadoop的配置文件

Hadoop中WordCount代码-直接加载hadoop的配置文件 在Myeclipse中,直接编写WordCount代码,代码中直接调用core-site.xml,hdfs-site.xml,mapred-site.xml配置文件 package com.apache.hadoop.function; import java.io.IOException; import java.util.Iterator; import java.util.StringTokenizer; import 

在ubuntu上安装eclipse同时连接hadoop运行wordcount程序

起先我是在win7 64位上远程连接hadoop运行wordcount程序的,但是这总是需要网络,考虑到这一情况,我决定将这个环境转移到unbuntu上 需要准备的东西 一个hadoop的jar包,一个连接eclipse的插件(在解压的jar包里有这个东西),一个hadoop-core-*.jar(考虑到连接的权限问题) 一个eclipse的.tar.gz包(其它类型的包也可以,eclipse本身就是不需要安装的,这里就不多说了) 因为我之前在win7上搭建过这个环境,所以一切很顺利,但还是要在

5行代码怎么实现Hadoop的WordCount?

初学编程的人,都知道hello world的含义,当你第一次从控制台里打印出了hello world,就意味着,你已经开始步入了编程的大千世界,这和第一个吃螃蟹的人的意义有点类似,虽然这样比喻并不恰当. 如果说学会了使用hello world就代表着你踏入了单机编程的大门,那么学会在分布式环境下使用wordcount,则意味着你踏入了分布式编程的大门.试想一下,你的程序能够成百上千台机器的集群中运行,是不是一件很有纪念意义的事情呢?不管在Hadoop中,还是Spark中,初次学习这两个开源框架做

[hadoop]命令行编译并运行hadoop例子WordCount

首先保证JDK.Hadoop安装设置成功 可以参考[linux]ubuntu下安装hadoop [linux]ubutnu12.04 下安装jdk1.7 使用hadoop版本为1.2.1,jdk为1.7 在hadoop-1.2.1\src\examples\org\apache\hadoop\examples找到WordCount.java 源码如下: 1 /** 2 * Licensed under the Apache License, Version 2.0 (the "License&q

[Linux][Hadoop] 运行WordCount例子

紧接上篇,完成Hadoop的安装并跑起来之后,是该运行相关例子的时候了,而最简单最直接的例子就是HelloWorld式的WordCount例子.   参照博客进行运行:http://xiejianglei163.blog.163.com/blog/static/1247276201443152533684/   首先创建一个文件夹,并创建两个文件,目录随意,为以下文件结构: examples --file1.txt --file2.txt 文件内容随意填写,我是从新闻copy下来的一段英文: 执

【Hadoop】Hadoop mr wordcount基础

1.基本概念 2.Mapper package com.ares.hadoop.mr.wordcount; import java.io.IOException; import java.util.StringTokenizer; import org.apache.hadoop.io.LongWritable; import org.apache.hadoop.io.Text; import org.apache.hadoop.mapreduce.Mapper; //Long, String,

ArcSDE10.1配置Oracle 监听器来使用SQL操作ST_Geometry(个人改动版)

发了两天的时间来解决配置Oracle 监听器来使用SQL操作ST_Geometry的配置,网上搜索一大片,结果真正找到的只有方法可用,下面把这个方法我个人在总结下. ArcSDE10.1配置Oracle 监听器来使用SQL操作ST_Geometry和其他版本的配置区别还是有很多不同的,不过不像网上说的配置那么复杂也不需要配置监听,下面我按照步骤说下配置方法: 一.配置user_libraries库 找到arcgsSde下面对应库的路径,例如我的路径是在D:\Program Files\ArcGI