WordCount是hadoop里hello word级的第一个程序,作为一个萌新,我也来跑一跑这个,附带针对新人的说明。
     所谓WordCount,就是统计一个或几个文档中相同的单词各有多少个。
     首先要有关于MapReduce的基础,用我自己通俗的话来说一下,MapReduce是一个用来计算大型数据的分布式计算框架,所谓框架,就是定义好了样子,我们只要去实现具体的类,它就可以高效的跑起来。
     MapReduce正如其名,分为两部分,一个是Map,一个是Reduce。
     输入(文件中的内容)-->Map-->Reduce-->输出(到文件中)。
     按照规定,Map的输入和Reduce的输出都是<key,value>形式的键值对,并且类型都是实现了hadoop序列化姐扣Writable的类。
     从文件中读取数据怎么变成键值对的呢,这个后边会设置,我们采用(FileInputFormat)的形式,这样,我们会从文件中得到内容,每行的内容作为value,它的偏移量作为key(key在当前是没用的)
     Mapper的代码:
public class WCMapper extends Mapper<LongWritable, Text, Text, LongWritable>{
@Override
protected void map(LongWritable key, Text value, Mapper<LongWritable, Text, Text, LongWritable>.Context context)
throws IOException, InterruptedException {
//accept
String line = value.toString();
//split
String[] words = line.split(" ");
//loop
for(String w : words){
//send
context.write(new Text(w), new LongWritable(1));
}
}
}

  Mapper这里继承的时候泛型限定了4个类型<LongWritable, Text, Text, LongWritable>,分别是输入的key,value,输出的key,value的类型,LongWritable是hadoop中long的序列化类,Text是String的序列化类。

  map函数中,Mapper从文档中得到偏移量(本程序不用,不管他)在key中,每行的值在value中,然后从value中用空格分开得到每个词,然后现在得到的每个词都是一次的,所以给content中添加<单词,1>,保存在content中,传给reduce。

  Reduce的代码:

public class WCReducer extends Reducer<Text, LongWritable, Text, LongWritable>{
@Override
protected void reduce(Text key, Iterable<LongWritable> values,
Reducer<Text, LongWritable, Text, LongWritable>.Context context) throws IOException, InterruptedException {
// TODO Auto-generated method stub
//define a counter
long counter = 0;
//loop
for(LongWritable l : values){
counter += l.get();
}
//write
context.write(key, new LongWritable(counter));
}
}

  Reduce继承的时候,限定的<Text, LongWritable, Text, LongWritable>是输入的<key,value>和输出的<key,value>,输入必须和Mapper的输出一样,输出自己定义,我们定义的是输出单词和它的次数。

  Mapper的输出传到Reduce的时候,中间会有一个过程(框架自动干的活,这就是框架的好处了),他会把Mapper输出的键值对中key相同的键值对合并,比如<hadoop,1>和<hadoop,1>会因为key都是hadoop二合并变成<hadoop,[1,1]>,如果再有一个<hadoop,1>,就会合并成<hadoop,[1,1,1]>。

  所以在reduce函数中,对每一个key对应的value迭代,每次得到一个次数(我们都设定的1),累加起来就是这个单词的次数了。

   然后,每个MapReduce程序都是一个job,需要开启。

  运行类(都有注释就不解释了):

  

public class WCRun {
public static void main(String[] args) {
try {
//下边4行代码设置job的基础信息,setJarByClass就是设置当前运行的main所在的class文件
Configuration conf = new Configuration();
Job job =Job.getInstance(conf);
job.setJarByClass(WCRun.class);
job.setJobName("wordcount"); //设置Mapper和Reduce的class文件是哪个
job.setMapperClass(WCMapper.class);
job.setReducerClass(WCReducer.class); //设置输出的key和value的类型
job.setOutputKeyClass(Text.class);
job.setOutputValueClass(LongWritable.class); //设置输入也就是从文件中得到键值对的方法,也就是我们之所以得到的是偏移量和一行文本,就是这个决定的
job.setInputFormatClass(TextInputFormat.class);
//设置输出的格式,同输入,不过内容是我们自己定义的
job.setOutputFormatClass(TextOutputFormat.class);
//得到输入路径和输出路径,这里用参数,注意输出目录不能存在
FileInputFormat.addInputPath(job, new Path(args[0]));
FileOutputFormat.setOutputPath(job, new Path(args[1]));
//启动job并等待运行结果
job.waitForCompletion(true);
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}

  !!!再次提醒,输出目录不能存在!!!

  运行的话,可以配置本地模式,可以集群运行,我们用集群跑一跑。

  首先吧整个程序打包成jar包,项目-->export-->java,jar

  然后把jar文件上传到我们的集群上。

  在hdfs里建一个输入文件夹,找一个文档放进去,输出的目录一定不要建(重要的事说三遍)。

  

  然后运行, 指令是 hadoop jar 你的程序的jar包 程序的main在的类 输入文件夹 输出文件夹

  

  程序运行成功,进入wcout看一看

  

  有两个文件,第一个表示我们成功了,第二个就是结果文件,吧第二个文件get到本地打开看一看

  

  统计的结果,大功告成。

  ps:都是学hadoop的新手,欢迎评论留言交流,一起进步。

Hadoop 新生报道(四) WordCount的更多相关文章

  1. Hadoop 新生报道(三) hadoop基础概念

    一.NameNode,SeconderyNamenode,DataNode NameNode,DataNode,SeconderyNamenode都是进程,运行在节点上. 1.NameNode:had ...

  2. Hadoop 新生报道(二) hadoop2.6.0 集群系统版本安装和启动配置

    本次基于Hadoop2.6版本进行分布式配置,Linux系统是基于CentOS6.5 64位的版本.在此设置一个主节点和两个从节点. 准备3台虚拟机,分别为: 主机名 IP地址 master 192. ...

  3. hadoop自带例子wordcount的具体运行步骤

    1.在hadoop所在目录“usr/local”下创建一个文件夹input root@ubuntu:/usr/local# mkdir input 2.在文件夹input中创建两个文本文件file1. ...

  4. HADOOP :: java.lang.ClassNotFoundException: WordCount

    I am using eclipse to export the jar file of a map-reduce program. When i am run the jar using comma ...

  5. Hadoop版Helloworld之wordcount运行示例

    1.编写一个统计单词数量的java程序,并命名为wordcount.java,代码如下: import java.io.IOException; import java.util.StringToke ...

  6. Hadoop最基本的wordcount(统计词频)

    package com.uniclick.dapa.dstest; import java.io.IOException; import java.net.URI; import org.apache ...

  7. 执行hadoop自带的WordCount实例

    hadoop 自带的WordCount实例可以统计一批文本文件中各单词出现的次数.下面介绍如何执行WordCount实例. 1.启动hadoop [root@hadoop ~]# start-all. ...

  8. Hadoop环境搭建及wordcount程序

    目的: 前期学习了一些机器学习基本算法,实际企业应用中算法是核心,运行的环境和数据处理的平台是基础. 手段: 搭建简易hadoop集群(由于机器限制在自己的笔记本上通过虚拟机搭建) 一.基础环境介绍 ...

  9. hadoop第一个例子WordCount

    hadoop查看自己空间 http://127.0.0.1:50070/dfshealth.jsp import java.io.IOException; import java.util.Strin ...

随机推荐

  1. Nexys3学习手记1:写在前面的话

    偶然的机会,结识了xilinx的几位大牛,便毫不客气的从他们的手中接过了基于Spartan-6的由Digilent公司研发的Nexys3开发板(如图1所看到的).记得非常久非常久曾经初识FPGA的时候 ...

  2. NHibernate之旅(13):初探马上载入机制

    本节内容 引入 马上载入 实例分析 1.一对多关系实例 2.多对多关系实例 结语 引入 通过上一篇的介绍,我们知道了NHibernate中默认的载入机制--延迟载入.其本质就是使用GoF23中代理模式 ...

  3. iOS_4_表情排列

    终于效果图: BeyondViewController.h // // BeyondViewController.h // 04_表情排列 // // Created by beyond on 14- ...

  4. hadoop用mutipleInputs实现map读取不同格式的文件

    mapmap读取不同格式的文件这个问题一直就有,之前的读取方式是在map里获取文件的名称,依照名称不同分不同的方式读取,比如以下的方式 //取文件名 InputSplit inputSplit = c ...

  5. 【quickhybrid】JSBridge的实现

    前言 本文介绍quick hybrid框架的核心JSBridge的实现 由于在最新版本中,已经没有考虑iOS7等低版本,因此在选用方案时没有采用url scheme方式,而是直接基于WKWebView ...

  6. 在Docker中运行asp.net core 跨平台应用程序

    概述 Docker已经热了有一两年了,而且我相信这不是一个昙花一现的技术,而是一个将深远影响我们日后开发和部署.运营应用系统的一种创新(很多人将其作为devops的一种非常重要的基石).学习docke ...

  7. AJAX扩展-POST传递参数并跳转页面

    拓展的代码: 这段代码的原理是创建一个表单,所有args都创建一个隐藏的input,用post方法把这些参数传递过去 注意form表单一定要加载到页面中,即下面代码中标红的部分,不然参数是无法被传递的 ...

  8. .Net 异步方法, await async 使用

    最近朋友问起await  和 async第一次听说这个await ,就查了一下这个await使用在于 异步方法async 中,中文意思就是等待,经过一系列的百度参考简单的明白了这个东西的意思,  异步 ...

  9. iOS pch文件创建使用,和info.plis文件路径改变,路径的设置

    一 路径报错: 二 pch创建设置: 一:如果要更改Info.plist与Prefix.pch文件实际路径,也就是实际文件的位置(不是在工程中的组织路径),需要到Build Settings中修改对应 ...

  10. win10 下 学习 xe10 误以为调试失效

    1. XE里面运行的有两个按扭,你点后面一个,就是debug 的了,前面一个是直接运行,不一样的!,被delphi7老思维导向错了  1)绿色箭头是直接运行,快捷键:ctrl+shfit+F9  2) ...