一、MapReduce简介

MapReduce是一种面向大数据平台的分布式并行计算框架,它允许使用人员在不会分布式并行编程的情况下,将程序运行在分布式系统上。它提供的并行计算框架,能自动完成计算任务的并行处理,自动划分计算数据,在集群节点上自动分配和执行计算任务,自动收集计算结果,使得开发人员只用关心业务的实现逻辑,大大降低开发负担。

二、MapReduce编程

1、MapReduce模型

在编写MapReduce程序时,一般由三部分构成,分别是Map、Reduce和Dirver,其中Map和Reduce部分负责业务逻辑的实现,Driver部分为驱动类,负责调用任务,执行MapReduce程序。在编写MapReduce程序之前,需要先创建一个Maven工程,创建的方法为:https://www.cnblogs.com/ynqwer/p/14540108.html,为了方便管理,可以在该目录下面创建一个包,然后在这个包下写代码来完成MapRecude程序。在这个包下面创建三个类,分别实现Map阶段、Reduce阶段和Driver三部分的程序。

2、Map阶段实现

Map函数默认按行从HDFS读取数据进行处理,即从HDFS一行一行的将数据读取过来,读取过来的格式为<行号,行内容>,然后按一定的分隔符切割,最后按key-value的格式输出,即MapReduce的默认输入为一对Key-value对,输出也是一对key-value对。在编写代码时,需要继承MapReduce的Mapper类,并重写Map方法,代码如下:

package com.qwer.mapreduce.wordcount;

import java.io.IOException;

import org.apache.hadoop.io.IntWritable;
import org.apache.hadoop.io.LongWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Mapper; /*
* WordCount案例Map阶段代码
* KEYIN, Map阶段输入K的类型:LongWritable
* VALUEIN, Map阶段输入V的类型:Text
* KEYOUT, Map阶段输出K的类型:Text
* VALUEOUT,Map阶段输出K的类型:IntWritable
*/
// Map阶段继承Mapper类
public class WordCountMapper extends Mapper<LongWritable, Text, Text, IntWritable> { // 定义输出kv对的数据类型
Text outK = new Text();
IntWritable outV = new IntWritable(1); @Override
protected void map(LongWritable key, Text value, Mapper<LongWritable, Text, Text, IntWritable>.Context context)
throws IOException, InterruptedException {
// TODO Auto-generated method stub
// 将输入的数据转换成String类型
String line = value.toString();
// 将数据按空格切分
String[] words = line.split(" ");
for (String word : words) {
outK.set(word);
context.write(outK, outV);
}
} }
3、Reduce阶段实现

Reduce阶段的输入数据类型和Map阶段的输出数据类型是一样的,再拿到输入数据之后,就可以进行业务逻辑的编写了,比如WordCount案例需要统计单词数量,然后按照key-value的格式输出。Recude阶段需要继承MapRecude的Reducer类,并重写Reduce方法,代码如下:

package com.qwer.mapreduce.wordcount;

import java.io.IOException;
import org.apache.hadoop.io.IntWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Reducer; /*
* WordCount案例Reduce阶段代码
* KEYIN, Reduce阶段输入K的类型:Text
* VALUEIN, Reduce阶段输入V的类型:IntWritable
* KEYOUT, Reduce阶段输出K的类型:Text
* VALUEOUT,Reduce阶段输出K的类型:IntWritable
*/
// Reduce阶段继承Reducer类
public class WordCountReducer extends Reducer<Text, IntWritable, Text, IntWritable> { // 定义Reduce阶段输出值的类型
IntWritable outV = new IntWritable(); @Override
protected void reduce(Text key, Iterable<IntWritable> values,
Reducer<Text, IntWritable, Text, IntWritable>.Context context) throws IOException, InterruptedException {
// TODO Auto-generated method stub
// 统计单词的个数
int sum = 0;
for (IntWritable value : values) {
sum += value.get();
}
outV.set(sum);
context.write(key, outV);
} }
4、Driver类实现

Driver部分为驱动类,负责调用任务,执行MapReduce程序。其程序大概可以分为八个步骤:

  1. 获取job
  2. 设置jar包路径
  3. 关联Mapper和Reducer
  4. 设置Map输出的KV类型
  5. 设置最终输出的KV类型
  6. 设置输入路径
  7. 设置输出路径
  8. 提交任务

根据上面步骤,写出代码如下:

package com.qwer.mapreduce.wordcount;

import java.io.IOException;

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.lib.input.FileInputFormat;
import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat; /*
* WordCount案例Driver代码
* 1、获取job
* 2、设置jar包路径
* 3、关联Mapper和Reducer
* 4、设置Map输出kv类型
* 5、设置最终输出kv类型
* 6、设置输入路径
* 7、设置输出路径
* 8、提交任务
*/
public class WordCountDriver {
public static void main(String[] args) throws ClassNotFoundException, IOException, InterruptedException { // 1、获取job
Configuration conf = new Configuration();
Job job = Job.getInstance(conf); // 2、设置jar包路径
job.setJarByClass(WordCountDriver.class); // 3、关联Mapper和Reducer
job.setMapperClass(WordCountMapper.class);
job.setReducerClass(WordCountReducer.class); // 4、设置Map输出kv类型
job.setMapOutputKeyClass(Text.class);
job.setMapOutputValueClass(IntWritable.class); // 5、设置最终输出kv类型
job.setOutputKeyClass(Text.class);
job.setOutputValueClass(IntWritable.class); // 6、设置输入地址
FileInputFormat.setInputPaths(job, new Path(args[0])); // 7、设置输出路径
FileOutputFormat.setOutputPath(job, new Path(args[1])); // 8、提交任务
boolean result = job.waitForCompletion(true); System.exit(result ? 0 : 1);
}
}

三、打包并执行

三个类都写好之后,就可以打成jar包放到集群中执行了。在eclipse的左侧工程目录里面,鼠标右键点击工程名,然后选择Run AS->Maven clean,完成之后再次鼠标右键点击工程名,然后选择Run AS->Maven install,完成之后会在工程目录中的target目录下出现一个jar包

将jar包放到集群上就可以执行了。在HDFS中创建一个目录/input,往该目录中随便上传一个文件,然后在jar包所在的目录下执行

hadoop jar MapReduceDemo-0.0.1-SNAPSHOT.jar com.qwer.mapreduce.wordcount.WordCountDriver /input /output

(注意:上面的com.qwer.mapreduce.wordcount.WordCountDriver为Driver类的全路径,/output为输出目录,如果在执行程序的时候该目录已经存在,程序会报错)

执行完毕后,会自动在HDFS中创建一个/output目录,该目录下为程序执行的结果。

Hadoop编程——Java编写MapReduce:WordCount案例的更多相关文章

  1. Java实现MapReduce Wordcount案例

    先改pom.xml: <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://ww ...

  2. [b0013] Hadoop 版hello word mapreduce wordcount 运行(三)

    目的: 不用任何IDE,直接在linux 下输入代码.调试执行 环境: Linux  Ubuntu Hadoop 2.6.4 相关: [b0012] Hadoop 版hello word mapred ...

  3. [b0004] Hadoop 版hello word mapreduce wordcount 运行

    目的: 初步感受一下hadoop mapreduce 环境: hadoop 2.6.4 1 准备输入文件 paper.txt 内容一般为英文文章,随便弄点什么进去 hadoop@ssmaster:~$ ...

  4. [b0012] Hadoop 版hello word mapreduce wordcount 运行(二)

    目的: 学习Hadoop mapreduce 开发环境eclipse windows下的搭建 环境: Winows 7 64 eclipse 直接连接hadoop运行的环境已经搭建好,结果输出到ecl ...

  5. 大数据学习笔记——Hadoop编程实战之Mapreduce

    Hadoop编程实战——Mapreduce基本功能实现 此篇博客承接上一篇总结的HDFS编程实战,将会详细地对mapreduce的各种数据分析功能进行一个整理,由于实际工作中并不会过多地涉及原理,因此 ...

  6. 【Hadoop测试程序】编写MapReduce测试Hadoop环境

    我们使用之前搭建好的Hadoop环境,可参见: <[Hadoop环境搭建]Centos6.8搭建hadoop伪分布模式>http://www.cnblogs.com/ssslinppp/p ...

  7. 在hadoop上进行编写mapreduce程序,统计关键词在text出现次数

    mapreduce的处理过程分为2个阶段,map阶段,和reduce阶段.在要求统计指定文件里的全部单词的出现次数时. map阶段把每一个关键词写到一行上以逗号进行分隔.并初始化数量为1(同样的单词h ...

  8. Hadoop通过HCatalog编写Mapreduce任务访问hive库中schema数据

    1.dirver package com.kangaroo.hadoop.drive; import java.util.Map; import java.util.Properties; impor ...

  9. 第三周(JAVA编写的 wordcount)

    import java.io.*; public class WordCount { public static int words=1; public static int lines=1; pub ...

  10. 一起学Hadoop——使用IDEA编写第一个MapReduce程序(Java和Python)

    上一篇我们学习了MapReduce的原理,今天我们使用代码来加深对MapReduce原理的理解. wordcount是Hadoop入门的经典例子,我们也不能免俗,也使用这个例子作为学习Hadoop的第 ...

随机推荐

  1. 关于在ItelliJ IDEA社区版找不到Spring Initializr

    搜了好几个版本都没找到,太难顶了... 打开「ItelliJ IDEA社区版」→「Configure」→「Plugins」→搜索框搜索「Spring Assistant」→「Install」 还要配置 ...

  2. Cgroup学习笔记3—代码实现—相关结构和全局变量

    基于 LInux-5.10 一.相关结构 1. 通过多次的 #define 和 #undef SUBSYS 宏来展开 cgroup_subsys.h 中通过 deconfig 使能的 cgroup 子 ...

  3. 浪潮QQ群成员提取器 V2022

    浪潮QQ群成员提取软件 V2021 最新升级版 使用扫描安全登录QQ,批量获取群列表,然后在读取指定群的群成员列表支持过滤群主.群管理员 支持按最后发言时间提取活跃用户 支持识别僵尸粉和过滤可以导出文 ...

  4. 前端面试-经典的Vue面试题

    面试总结三大模块:Vue双向绑定及原理.生命周期.组件通信.Vue官方API 目录:1.Vue双向绑定及原理 1.1你对MVVM是怎么理解的? 1.2你对Vue响应式原理是怎么理解的?是否可以实现一个 ...

  5. https://www.cnblogs.com/DKSoft/category/608549.html

    https://www.cnblogs.com/DKSoft/category/608549.html

  6. 百题计划-6 codeforces 651 div2 E. Binary Subsequence Rotation 01序列集合划分,2个队列处理

    https://codeforces.com/contest/1370/problem/E 队列元素以末尾字符为结尾的序列就好了,这里队列里的元素不重要,队列size重要 #include<bi ...

  7. VS2019+ Intel Fortran (oneAPI)+HDF5库的安装+测试

    最近需要读取hdf5文件(*.h5),处于对速度的追求,兼具VS调试程序的需要,使用Fortran+HDF5进行读写. 注意: 此处为动态库连接方式,静态库类似,差异主要为头文件有所差异. 参考网址: ...

  8. oracle WMSYS.WM_CONCAT 函数使用

    1.用法 WMSYS.WM_CONCAT(要连接的字段) 该函数返回来自同一个分组的指定字段的非NULL值的连接起来字符串,默认逗号连接,一般搭配分组函数使用 2.示例 select XFJ_ID,R ...

  9. 安装git-lfs

    git大文件报错: smudge filter lfs failedwarning: 克隆成功,但是检出失败.您可以通过 'git status' 检查哪些已被检出,然后使用命令'git checko ...

  10. go环境搭建及tjfoc-gm安装

    go环境搭建及tjfoc-gm安装 一.环境配置 1 首先进入usr/local文件夹,下载go语言环境配置压缩包 wget https://dl.google.com/go/go1.19.3.lin ...