其实这个例子都是书上的,我也只是拿过来理解学习下。

WordCount是Hadoop中的Hello, world,这是我听得最多的一个表述。

下面是WordCount.java的源码

package org.apache.hadoop.examples;

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接口中的map方法,
* 输入参数中的value是文本文件中的一行,
* 利用StringTokenizer将这个字符串拆成单词,
* 然后将输出结果<单词,1>
* 写入到org.apache.hadoop.mapred.OutputCollector中
*/ public static class TokenizerMapper
extends Mapper<Object, Text, Text, IntWritable>{ private final static IntWritable one = new IntWritable(1);
private Text word = new Text(); /* 代码中LongWritable, IntWritable, Text
* 均是Hadoop中实现的用于封装Java数据类型的类,
* 这些类都能够被串行化从而便于在分布式环境中进行数据交换,
* 可以将它们分别视为long, int, String的替代品
*/ public void map(Object key, Text value, Context context
) throws IOException, InterruptedException {
StringTokenizer itr = new StringTokenizer(value.toString());
// 将每一行变为字符串, 并进行分析, 最后变为一个Iterator
while (itr.hasMoreTokens()) {
word.set(itr.nextToken());
context.write(word, one);
}
}
} /* 这个类实现Reducer接口中的reduce方法, 输入参数中的key, values是由Map任务输出的
* 中间结果, values是一个Iterator
*/
public static class IntSumReducer
extends Reducer<Text,IntWritable,Text,IntWritable> {
private IntWritable result = new IntWritable(); public void reduce(Text key, Iterable<IntWritable> values,
Context context
) throws IOException, InterruptedException {
int sum = 0;
/* 遍历这个Iterator, 就可以得到属于同一个key的所有的values.
* 此处, key是一个单词, values是词频
*/
// 依次获得每个词的词频
for (IntWritable val : values) {
sum += val.get();
}
result.set(sum);
context.write(key, result);
}
} public static void main(String[] args) throws Exception {
// 这个配置从何而来, 往哪里去呢
Configuration conf = new Configuration();
String[] otherArgs = new GenericOptionsParser(conf, args).getRemainingArgs();
if (otherArgs.length != 2) {
System.err.println("Usage: wordcount <in> <out>");
System.exit(2);
}
// 新建一个job, 并读取配置文件conf, 不知道是不是读取安装目录下的配置文件
Job job = new Job(conf, "word count");
// 下面这几行都是设置编译好的类
job.setJarByClass(WordCount.class);
// 实现map函数, 完成输入的<key, value>对到中间结果的映射
job.setMapperClass(TokenizerMapper.class);
// 实现combine函数, 将中间结果的重复key进行合并
job.setCombinerClass(IntSumReducer.class);
// 实现reduce函数, 对中间结果进行合并, 形成最终结果
job.setReducerClass(IntSumReducer.class);
// 输出的最终结果中key的类型
job.setOutputKeyClass(Text.class);
// 输出的最终结果中value的类型
job.setOutputValueClass(IntWritable.class);
// 设定job的输入目录, job运行时会处理输入目录下的所有文件
FileInputFormat.addInputPath(job, new Path(otherArgs[0]));
// 设定job的输出目录, job的最终结果会写入输出目录下
FileOutputFormat.setOutputPath(job, new Path(otherArgs[1]));
System.exit(job.waitForCompletion(true) ? 0 : 1);
}
}

由于要编译执行,用的是hadoop命令,就来看看hadoop吧

HADOOP_HOME/bin/hadoop
有这样三段话

# part 1
# 设置java命令的路径所在
JAVA=$JAVA_HOME/bin/java # part 2
# 假如我们在hadoop后面接的是jar, 则会进行一系列设置
elif [ "$COMMAND" = "jar" ] ; then
CLASS=org.apache.hadoop.util.RunJar
HADOOP_OPTS="$HADOOP_OPTS $HADOOP_CLIENT_OPTS" # 后面这一大段是处在文件的最后
# 主要分成安全模式和非安全模式下
# 安全模式下会执行一些设置, 才会运行
# 非安全模式下直接运行
# 说到底最后还是都是在java虚拟机上运行的 # part 3
# Check to see if we should start a secure datanode
if [ "$starting_secure_dn" = "true" ]; then
if [ "$HADOOP_PID_DIR" = "" ]; then
HADOOP_SECURE_DN_PID="/tmp/hadoop_secure_dn.pid"
else
HADOOP_SECURE_DN_PID="$HADOOP_PID_DIR/hadoop_secure_dn.pid"
fi if [[ $JSVC_HOME ]]; then
JSVC="$JSVC_HOME/jsvc"
else
if [ "$JAVA_PLATFORM" = "Linux-amd64-64" ]; then
JSVC_ARCH="amd64"
else
JSVC_ARCH="i386"
fi
JSVC="$HADOOP_HOME/libexec/jsvc.${JSVC_ARCH}"
fi if [[ ! $JSVC_OUTFILE ]]; then
JSVC_OUTFILE="$HADOOP_LOG_DIR/jsvc.out"
fi if [[ ! $JSVC_ERRFILE ]]; then
JSVC_ERRFILE="$HADOOP_LOG_DIR/jsvc.err"
fi exec "$JSVC" -Dproc_$COMMAND -outfile "$JSVC_OUTFILE" \
-errfile "$JSVC_ERRFILE" \
-pidfile "$HADOOP_SECURE_DN_PID" \
-nodetach \
-user "$HADOOP_SECURE_DN_USER" \
-cp "$CLASSPATH" \
$JAVA_HEAP_MAX $HADOOP_OPTS \
org.apache.hadoop.hdfs.server.datanode.SecureDataNodeStarter "$@"
else
# run it
exec "$JAVA" -Dproc_$COMMAND $JAVA_HEAP_MAX $HADOOP_OPTS -classpath "$CLASSPATH" $CLASS "$@"
fi

最后这个java执行的命令好长一串啊, 不过分析下觉得
前面的-Dproc_$COMMAND $JAVA_HEAP_MAX $HADOOP_OPTS感觉是对java虚拟机的设置
后面的-classpath则是执行需要那些jar包
"$CLASSPATH" 是根据命令设置的一些jar所在地
$CLASS 如果针对于hadoop运行MapReduce这里的就是org.apache.hadoop.util.RunJar这个jar包

总的过程包括有:
Map类的实现;
Reduce类的实现;
Job的创建以及设置;
运行Job。

也来看看hadoop的WordCount的更多相关文章

  1. Hadoop中wordcount程序

    一.测试过程中 输入命令: 首先需要在hadoop集群中添加文件 可以首先进行查看hadoop集群中文件目录 hadoop fs -ls / hadoop fs -ls -R / hadoop fs ...

  2. [Linux][Hadoop] 运行WordCount例子

    紧接上篇,完成Hadoop的安装并跑起来之后,是该运行相关例子的时候了,而最简单最直接的例子就是HelloWorld式的WordCount例子.   参照博客进行运行:http://xiejiangl ...

  3. 伪分布式环境下命令行正确运行hadoop示例wordcount

    首先确保hadoop已经正确安装.配置以及运行. 1.     首先将wordcount源代码从hadoop目录中拷贝出来. [root@cluster2 logs]# cp /usr/local/h ...

  4. 一个可以跑的Hadoop的WordCount程序

    搭个新环境时总要折腾一下,于是干脆记下来. 程序: package com.my; import java.io.IOException; import java.util.Iterator; imp ...

  5. hadoop执行wordcount例子

    1:下载hadoop.http://mirror.esocc.com/apache/hadoop/common/hadoop-1.2.1/hadoop-1.2.1.tar.gz 2:解压. tar - ...

  6. 【Hadoop】Hadoop mr wordcount基础

    1.基本概念 2.Mapper package com.ares.hadoop.mr.wordcount; import java.io.IOException; import java.util.S ...

  7. Windows用Eclipse来开发hadoop的WordCount的helloworld

    [学习笔记] 2.Win7用Eclipse来开发hadoop的WordCount的helloworld网上下载hadoop-eclipse-plugin-2.7.4.jar,将该jar包拷贝到Ecli ...

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

    初学编程的人,都知道hello world的含义,当你第一次从控制台里打印出了hello world,就意味着,你已经开始步入了编程的大千世界,这和第一个吃螃蟹的人的意义有点类似,虽然这样比喻并不恰当 ...

  9. hadoop:将WordCount打包成独立运行的jar包

    hadoop示例中的WordCount程序,很多教程上都是推荐以下二种运行方式: 1.将生成的jar包,复制到hadoop集群中的节点,然后运行 $HADOOP_HOME/bin/hadoop xxx ...

  10. Eclipse上运行第一个Hadoop实例 - WordCount(单词统计程序)

    需求 计算出文件中每个单词的频数.要求输出结果按照单词的字母顺序进行排序.每个单词和其频数占一行,单词和频数之间有间隔. 比如,输入两个文件,其一内容如下: hello world hello had ...

随机推荐

  1. 【mysql+RBAC】RBAC权限处理(转载:http://www.cnblogs.com/xiaoxi/p/5889486.html 平凡希)

    1.这里我只讲核心,mysql查询语句:FIND_IN_SET(str,strlist) 2.具体教程可以参考[童攀老师的RBAC],很清晰,赞一个. 3.详解:mysql的find_in_set 首 ...

  2. ASP.NET 加入返回参数ReturnValue

    说明:很多时候,在DBHelper函数中,都能看到以下的代码: cmd.Parameters.Add(, ParameterDirection.ReturnValue, , , string.Empt ...

  3. BeanUtils 装载java bean

    Topic topic=new Topic(); Enumeration<String> enums=request.getParameterNames(); try { while(en ...

  4. 如何显示Firefox插件(Plugins)的完整路径并删除

    在Firefox里面,插件firefox只提供禁用选项,无法直接卸载. 要卸载插件,可以按照下面的步骤: 1.在地址栏内,输入 about:config,回车:在过滤器那一栏输入 plugin.exp ...

  5. [转载]ubuntu发热问题解决

    原文地址:ubuntu发热问题解决作者:raosea 没事装了个ubuntu12.04玩玩. 用wubi安装,很省事的 .完了以后启动了系统,界面蛮好看.可是不久令人费心的事情出来了. 我发现本本的右 ...

  6. mybatis映射文件(转)

    以下内容为转载, 格式未调整,略丑,可直接空降至: [Mybatis框架]输出映射-resultType与resultMap 有时间或看: Mybatis 3.1中 Mapper XML 文件 的学习 ...

  7. HDUOJ----John

    John Time Limit: 5000/1000 MS (Java/Others)    Memory Limit: 65535/32768 K (Java/Others)Total Submis ...

  8. Java虚拟机学习 - 对象内存分配与回收 ( 5 )

    对象优先在Eden上分配 大多数情况下,对象优先在新生代Eden区域中分配.当Eden内存区域没有足够的空间进行分配时,虚拟机将触发一次 Minor GC(新生代GC).Minor GC期间虚拟机将E ...

  9. JS取date的前一天时间

    在javascript中取date的前一天时间: new Date(new Date()-24*60*60*1000),//取前一天的时间

  10. Python学习笔记015——汉字编码

    1 字符串的编码(encode)格式 GB2312   GBK   GB18030  UTF-8  ASCII 其中常用的编码格式有 国标系列:GB18030(GBK(GB2312)) (window ...