也来看看hadoop的WordCount
其实这个例子都是书上的,我也只是拿过来理解学习下。
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的更多相关文章
- Hadoop中wordcount程序
一.测试过程中 输入命令: 首先需要在hadoop集群中添加文件 可以首先进行查看hadoop集群中文件目录 hadoop fs -ls / hadoop fs -ls -R / hadoop fs ...
- [Linux][Hadoop] 运行WordCount例子
紧接上篇,完成Hadoop的安装并跑起来之后,是该运行相关例子的时候了,而最简单最直接的例子就是HelloWorld式的WordCount例子. 参照博客进行运行:http://xiejiangl ...
- 伪分布式环境下命令行正确运行hadoop示例wordcount
首先确保hadoop已经正确安装.配置以及运行. 1. 首先将wordcount源代码从hadoop目录中拷贝出来. [root@cluster2 logs]# cp /usr/local/h ...
- 一个可以跑的Hadoop的WordCount程序
搭个新环境时总要折腾一下,于是干脆记下来. 程序: package com.my; import java.io.IOException; import java.util.Iterator; imp ...
- hadoop执行wordcount例子
1:下载hadoop.http://mirror.esocc.com/apache/hadoop/common/hadoop-1.2.1/hadoop-1.2.1.tar.gz 2:解压. tar - ...
- 【Hadoop】Hadoop mr wordcount基础
1.基本概念 2.Mapper package com.ares.hadoop.mr.wordcount; import java.io.IOException; import java.util.S ...
- Windows用Eclipse来开发hadoop的WordCount的helloworld
[学习笔记] 2.Win7用Eclipse来开发hadoop的WordCount的helloworld网上下载hadoop-eclipse-plugin-2.7.4.jar,将该jar包拷贝到Ecli ...
- 5行代码怎么实现Hadoop的WordCount?
初学编程的人,都知道hello world的含义,当你第一次从控制台里打印出了hello world,就意味着,你已经开始步入了编程的大千世界,这和第一个吃螃蟹的人的意义有点类似,虽然这样比喻并不恰当 ...
- hadoop:将WordCount打包成独立运行的jar包
hadoop示例中的WordCount程序,很多教程上都是推荐以下二种运行方式: 1.将生成的jar包,复制到hadoop集群中的节点,然后运行 $HADOOP_HOME/bin/hadoop xxx ...
- Eclipse上运行第一个Hadoop实例 - WordCount(单词统计程序)
需求 计算出文件中每个单词的频数.要求输出结果按照单词的字母顺序进行排序.每个单词和其频数占一行,单词和频数之间有间隔. 比如,输入两个文件,其一内容如下: hello world hello had ...
随机推荐
- android的download manager(1)
android 2.3中引入了Download manager.作为一个service来优化长时间下载操作的处理.Download Manager通过处理HTTP链接.监控链接的变化和系统又一次启动来 ...
- 给你出道题:依次去掉离中心最远的M个点
给定一个数组a[N],里面包含N个向量.现在要求进行删点操作,删点原则如下: 1.求出N个向量的中心O1,删除离O1最远的那个点 2.求出N-1个向量的中心O2,删除O2最远的那个点 ...... 重 ...
- Linux命令-终止进程命令:pkill
killall是杀死所有进程,而pkill是按照进程名称杀死进程,可以达到杀死所有进程的目的,因为linux里面同名的进程是分主进程和子进程的. pkill - httpd 按名称强制杀死httpd进 ...
- Linux命令-定时任务命令:crontab
linux定时任务命令相当于windows=>附件=>系统工具=>计划任务程序. 要想让linux定时任务生效,首先应该先启动crond服务,并且给这个服务设置开机自自动. 默认li ...
- 60款与DevOps相关的开源工具
原文地址:https://elasticbox.com/blog/de ... ools/ 你喜欢免费的东西吗?获得开发者社区支持的自动化,开源的工具是大家梦寐以求的.这里列举了 60+ 款最棒的开源 ...
- 以宽字符形式读整个文件的内容(wifstream的使用)
// TestShlwAPI.cpp : 定义控制台应用程序的入口点.// #include "stdafx.h" #include <iostream>using s ...
- GL_总账完整会计周期业务(流程)
2014-06-02 BaoXinjian
- Linux中断 - tasklet
一.前言 对于中断处理而言,linux将其分成了两个部分,一个叫做中断handler(top half),属于不那么紧急需要处理的事情被推迟执行,我们称之deferable task,或者叫做bott ...
- Python中的迭代和可迭代对象
什么是迭代(iteration)呢? 给定一个list或者tuple,通过for循环来遍历这个list或者tuple.这种遍历就是迭代(iteration).只要是可迭代的对象都可以进行迭代.怎么判断 ...
- -174dBm的含义
常温下(290K)一个热电阻会产生少量的噪声能量P=kTB k = 玻尔兹曼常数(1.38 x 10–23 J/K)T = 温度(K)B = 噪声带宽(Hz) 由于总噪声功率是测量带宽的函数,数值通常 ...