mapreduce是hadoop生态中非常重要的一部分,顾名思义,主要分为两部分,map和reduce,他们各司其职,map的主要功能是用来对待处理的文档进行处理,主要是对数据进行按行读取,分割,然后根据用户需要进行不同的判断,清晰,直到得到目标的干净数据。reduce程序主要是对map传来的数据进行汇总,求和。最后经统计的结果输入到目标文件中。具体代码如下:

WCMapper.java

import java.io.IOException;

import org.apache.commons.lang.StringUtils;
import org.apache.hadoop.io.LongWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Mapper;

//4个泛型,前两个是mapper输入数据的类型KENY是输入的key的类型,VALUIN是指的value的类型
//map和reduce的数据的输入输出都是以key-value的形式存在的
//默认情况下框架传递给我们的mapper框架输入数据,key是要处理文本的中一行的起始位置的偏移量,这一行的内容作为value
public class WCMapper extends Mapper {

//mapredure框架每度一行数据就会调用一次方法,递归调用
@Override
protected void map(LongWritable key, Text value, Context context)
throws IOException, InterruptedException {

//具体业务逻辑写在这个方法中,而且我们要处理的数据已经被框架传递进来,在方法的key-value参数中
//key这一行数据的其实偏移量 value是这一行的内容

//将这一行的内容转换为String类型
String line = value.toString();
//将这一行内容进行分割
String[] words = StringUtils.split(line," ");
//遍历数组,以k-v的形式 k:单词 v:1
for(String word : words) {
context.write(new Text(word),new LongWritable(1));
}

}
}

WCReducer.java

import java.io.IOException;

import org.apache.hadoop.io.LongWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Reducer;

public class WCReducer extends Reducer{

//map的数据处理完成之后对,将所有的kv对缓存起来,进行分组,然后传递一个分组,调用一次reduce
//
@Override
protected void reduce(Text key, Iterable values,Context contest) throws IOException, InterruptedException {
long count = 0;
//遍历valueslist,进行累加求和
for(LongWritable value:values) {
count +=value.get();
}
//输出一个文件的统计结果
contest.write(key,new LongWritable(count));

}
}

WCRunner.java

import java.io.IOException;

import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.io.LongWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Job;
import org.apache.hadoop.mapreduce.lib.input.FileInputFormat;
import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat;

public class WCRunner {

//用来描述一个特定的job,比如改作业指定那个类是逻辑处理中的map,那个类是逻辑处理中发的reduce
//还可以指定改作业要处理的数据的所在的路径
//还可以指定作业完成后输出结果放到的哪个路径中
public static void main(String[] args) throws IOException, ClassNotFoundException, InterruptedException {
Configuration conf = new Configuration();

Job job = Job.getInstance(conf);
//设置整个job所要用到的jar包的类所在的位置
job.setJarByClass(WCRunner.class);

//本job所使用的mapper和reduce
job.setMapperClass(WCMapper.class);
job.setReducerClass(WCReducer.class);

//指定reduce的kv类型
job.setOutputKeyClass(Text.class);
job.setOutputValueClass(LongWritable.class);

//指定map的kv类型
job.setMapOutputKeyClass(Text.class);
job.setMapOutputValueClass(LongWritable.class);

//指定元数据指定在哪里
//这里的文件路径既可以windows中的文件路径,也可以是hdfs中的路径,前提是可以互相通讯
FileInputFormat.setInputPaths(job,new Path("/home/hadoop/data-shixun/wordcount/srcdata.txt"));
FileOutputFormat.setOutputPath(job, new Path("/home/hadoop/data-shixun/wordcount/output"));
//将job提交给集群
job.waitForCompletion(true);
}
}

代码中相应部分都有详细的注释。

mapreduce入门程序之---wordcount的更多相关文章

  1. Hadoop基础-MapReduce入门篇之编写简单的Wordcount测试代码

    Hadoop基础-MapReduce入门篇之编写简单的Wordcount测试代码 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 本文主要是记录一写我在学习MapReduce时的一些 ...

  2. MapReduce编程入门实例之WordCount:分别在Eclipse和Hadoop集群上运行

    上一篇博文如何在Eclipse下搭建Hadoop开发环境,今天给大家介绍一下如何分别分别在Eclipse和Hadoop集群上运行我们的MapReduce程序! 1. 在Eclipse环境下运行MapR ...

  3. 第02讲:Flink 入门程序 WordCount 和 SQL 实现

    我们右键运行时相当于在本地启动了一个单机版本.生产中都是集群环境,并且是高可用的,生产上提交任务需要用到flink run 命令,指定必要的参数. 本课时我们主要介绍 Flink 的入门程序以及 SQ ...

  4. 第1节 MapReduce入门:11、mapreduce程序的入门

    1.1.理解MapReduce思想 MapReduce思想在生活中处处可见.或多或少都曾接触过这种思想.MapReduce的思想核心是“分而治之”,适用于大量复杂的任务处理场景(大规模数据处理场景). ...

  5. map-reduce入门

    map-reduce入门 近期在改写mahout源代码,感觉自己map-reduce功力不够深厚,因此打算系统学习一下. map-reduce事实上是一种编程范式,从统计词频(wordCount)程序 ...

  6. 【Hadoop离线基础总结】MapReduce入门

    MapReduce入门 Mapreduce思想 概述 MapReduce的思想核心是分而治之,适用于大量复杂的任务处理场景(大规模数据处理场景). 最主要的特点就是把一个大的问题,划分成很多小的子问题 ...

  7. hadoop笔记之MapReduce的应用案例(WordCount单词计数)

    MapReduce的应用案例(WordCount单词计数) MapReduce的应用案例(WordCount单词计数) 1. WordCount单词计数 作用: 计算文件中出现每个单词的频数 输入结果 ...

  8. hadoop的第一个hello world程序(wordcount)

    在hadoop生态中,wordcount是hadoop世界的第一个hello world程序. wordcount程序是用于对文本中出现的词计数,从而得到词频,本例中的词以空格分隔. 关于mapper ...

  9. 大数据学习day32-----spark12-----1. sparkstreaming(1.1简介,1.2 sparkstreaming入门程序(统计单词个数,updateStageByKey的用法,1.3 SparkStreaming整合Kafka,1.4 SparkStreaming获取KafkaRDD的偏移量,并将偏移量写入kafka中)

    1. Spark Streaming 1.1 简介(来源:spark官网介绍) Spark Streaming是Spark Core API的扩展,其是支持可伸缩.高吞吐量.容错的实时数据流处理.Sp ...

随机推荐

  1. 软件设计师【UML】

    一.概述 二.核心概念 1.用例图 1.包含关系 当可以从两个或两个以上的用例中提取公共行为时,应该使用包含关系来表示他们.其中这个提取出来的公共用例称为抽象用例,而把原始用例称为基本用例或基础用例. ...

  2. 主流WEB服务器大对比(Apache,Nginx,Lighttpd)

    一.软件介绍(apache  lighttpd  nginx) 1. lighttpd  Lighttpd 是一个具有非常低的内存开销, cpu 占用率低,效能好,以及丰富的模块等特点. lightt ...

  3. 【转】TI DSP C6657学习之——编译静态库.lib

    熟悉C++开发的的小伙伴都知道,我们一般代码中往往要引入许多第三方编译好的库,有些是静态链接库static library, 有些是动态链接库dll.引入库的目的一是减少代码的编译时间,二是只提供函数 ...

  4. python面试总结2(函数常考题和异常处理)

    python函数常考题 可变类型为参数 不能类型为参数 python如何传递参数 传递值还是引用呢?都不是.唯一支持的参数传递是共享穿参 Call by Object(Call by Object R ...

  5. openstack虚拟机,采用ssh密钥登录

    在openstack中,制作出的镜像有两种登录方式 1:直接密码登录 2:秘钥登录 在openstack中加入了公钥对应自己会有一份秘钥,该怎样用秘钥进行登录, 可以直接如图在控制节点中,输入ssh ...

  6. 微信小程序~获取位置信息

    微信小程序提供的getlocation来获取用户的定位,能够得到用户的经纬度信息 (注:getloaction需要用户授权scope.userLocation)结合map组件能够得到用户的详细定位 & ...

  7. JDK源码那些事儿之ConcurrentLinkedDeque

    非阻塞队列ConcurrentLinkedQueue我们已经了解过了,既然是Queue,那么是否有其双端队列实现呢?答案是肯定的,今天就继续说一说非阻塞双端队列实现ConcurrentLinkedDe ...

  8. Bias vs. Variance(4)---根据是high bias还是high variance问题来判断接下来做些什么

    怎么区分哪些措施对我们有用呢?----首先根据learning curve来判断你的问题是high bias or variance 当你的算法是high bias问题时,如果你get more tr ...

  9. NPOI - .NET Excel & Word操作组件

    概要 NPOI 是 POI 项目的 .NET 版本.POI是一个开源的Java读写Excel.WORD等微软OLE2组件文档的项目. NPOI是构建在POI 3.x版本之上的,它可以在没有安装Offi ...

  10. celery retry发送的队列

    celery retry时,将发送到原有的队列,并在任务中加入执行的时间,以及当前重试的次数. worker立刻读取该任务,同时记录一条[任务]到 unacked中,表示该任务在worker中还未执行 ...