MapReduce编程规范及示例编写

article/2025/10/16 17:51:13

1、Mapper类

  • 用户自定义一个Mapper类继承Hadoop的Mapper类
  • Mapper的输入数据是KV对的形式(类型可以自定义)
  • Map阶段的业务逻辑定义在map()方法中
  • Mapper的输出数据是KV对的形式(类型可以自定义)

注意:map()方法是对输入的一个KV对调用一次!!

2、Reducer类

  • 用户自定义Reducer类要继承Hadoop的Reducer类
  • Reducer的输入数据类型对应Mapper的输出数据类型(KV对)
  • Reducer的业务逻辑写在reduce()方法中
  • Reduce()方法是对相同K的一组KV对调用执行一次

3、Driver阶段

        创建提交YARN集群运行的Job对象,其中封装了MapReduce程序运行所需要的相关参数入输入数据路径,输出数据路径等,也相当于是一个YARN集群的客户端,主要作用就是提交我们MapReduce程序运行。

 

4、WordCount代码实现

4.1、需求

  • 在给定的文本文件中统计输出每一个单词出现的总次数
  • 输入数据:wc.txt;
  • 输出:

    apache 2
    clickhouse 2
    hadoop 1
    mapreduce 1
    spark 2
    xiaoming 1

4.2、具体步骤

按照MapReduce编程规范,分别编写Mapper,Reducer,Driver。

(1)新建maven工程

  • 导入hadoop依赖
    <?xml version="1.0" encoding="UTF-8"?>
    <project xmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><groupId>com.lagou</groupId><artifactId>Wordcount</artifactId><version>1.0-SNAPSHOT</version><dependencies><dependency><groupId>org.apache.logging.log4j</groupId><artifactId>log4j-core</artifactId><version>2.8.2</version></dependency><dependency><groupId>org.apache.hadoop</groupId><artifactId>hadoop-common</artifactId><version>2.9.2</version></dependency><dependency><groupId>org.apache.hadoop</groupId><artifactId>hadoop-client</artifactId><version>2.9.2</version></dependency><dependency><groupId>org.apache.hadoop</groupId><artifactId>hadoop-hdfs</artifactId><version>2.9.2</version></dependency></dependencies><build><plugins><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-compiler-plugin</artifactId><version>3.5.1</version><configuration><source>1.8</source><target>1.8</target></configuration></plugin><!--maven打包插件 --><plugin><artifactId>maven-compiler-plugin</artifactId><version>2.3.2</version><configuration><source>1.8</source><target>1.8</target></configuration></plugin><plugin><artifactId>maven-assembly-plugin</artifactId><configuration><descriptorRefs><descriptorRef>jar-with-dependencies</descriptorRef></descriptorRefs></configuration><executions><execution><id>make-assembly</id><phase>package</phase><goals><goal>single</goal></goals></execution></executions></plugin></plugins></build></project>
  • 添加log4j.properties
    log4j.rootLogger=INFO, stdout
    log4j.appender.stdout=org.apache.log4j.ConsoleAppender
    log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
    log4j.appender.stdout.layout.ConversionPattern=%d %p [%c] - %m%n
    log4j.appender.logfile=org.apache.log4j.FileAppender
    log4j.appender.logfile.File=target/spring.log
    log4j.appender.logfile.layout=org.apache.log4j.PatternLayout
    log4j.appender.logfile.layout.ConversionPattern=%d %p [%c] - %m%n

(2)整体思路梳理(仿照源码)

Map阶段:

  1. map()方法中把传入的数据转为String类型
  2. 根据空格切分出单词
  3. 输出<单词,1>

Reduce阶段:

  1. 汇总各个key(单词)的个数,遍历value数据进行累加
  2. 输出key的总数

Driver

  1. 获取配置文件对象,获取job对象实例
  2. 指定程序jar的本地路径
  3. 指定Mapper/Reducer类
  4. 指定Mapper输出的kv数据类型
  5. 指定最终输出的kv数据类型
  6. 指定job处理的原始数据路径
  7. 指定job输出结果路径
  8. 提交作业

(3)编写Mapper类

package com.lagou.mr.wc;import org.apache.hadoop.io.*;
import org.apache.hadoop.mapreduce.Mapper;import java.io.IOException;// 继承Mapper类
// Mapper类的泛型参数共四个,2对kv
/**  第一对kv:map输入参数类型*  第二队kv:map输出参数类型*  LongWritable, Text ->文本偏移量(后面不会用到),一行文本内容*  Text, IntWritable ->单词,1*/
public class WordCountMapper extends Mapper<LongWritable, Text, Text, IntWritable> {// 重写Mapper类的map方法/*** 1、接收文本内容,转为String类型* 2、按照空格进行拆分* 3、输出<单词, 1>*/// 提升为全局方法,避免每次执行map方法,都执行此操作Text word = new Text();IntWritable one = new IntWritable(1);// LongWritable, Text ->文本偏移量,一行文本内容,map方法的输入参数,一行文本调用一次map方法@Overrideprotected void map(LongWritable key, Text value, Context context) throws IOException, InterruptedException {// 1、接收文本内容,转为String类型String str = value.toString();// 2、按照空格进行拆分String[] words = str.split(" ");// 3、输出<单词, 1>// 遍历数据for (String s : words) {word.set(s);context.write(word, one);}}
}

继承的Mapper类型选择新版本API:

(4)编写Reducer类

package com.lagou.mr.wc;import org.apache.hadoop.mapreduce.Reducer;
import org.apache.hadoop.io.*;import java.io.IOException;// 继承的Reducer类有四个泛型参数 2对kv
// 第一对kv:类型要与Mapper输出类型一致:Text, IntWritable
public class WordCountReducer extends Reducer<Text, IntWritable, Text, IntWritable> {// 1、重写reduce方法// Text key:map方法输出的key,本案中就是单词,// Iterable<IntWritable> values: 一组key相同的kv的value组成的集合/*** 假设map方法:hello 1; hello 1; hello 1* reduce的key和value是什么* key:hello* values:<1,1,1>* <p>* 假设map方法输出:hello 1, hello 1, hadoop 1, mapreduce 1, hadoop 1* reduce的key和value是什么?* reduce方法何时调用:一组key相同的kv中的value组成集合然后调用一次reduce方法* 第一次:key:hello ,values:<1,1,1>* 第二次:key:hadoop ,values<1,1>* 第三次:key:mapreduce ,values<1>*/IntWritable total = new IntWritable();@Overrideprotected void reduce(Text key, Iterable<IntWritable> values, Reducer<Text, IntWritable, Text, IntWritable>.Context context) throws IOException, InterruptedException {// 2、遍历key对应的values,然后累加结果int sum = 0;for (IntWritable value : values) {int i = value.get();sum += 1;}// 3、直接输出当前key对应的sum值,结果就是单词出现的总次数total.set(sum);context.write(key, total);}
}

选择继承的Reducer类

(5) 编写Driver驱动类

package com.lagou.mr.wc;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;import java.io.IOException;// 封装任务并提交运行
public class WordCountDriver {public static void main(String[] args) throws IOException, InterruptedException, ClassNotFoundException {/*1. 获取配置文件对象,获取job对象实例2. 指定程序jar的本地路径3. 指定Mapper/Reducer类4. 指定Mapper输出的kv数据类型5. 指定最终输出的kv数据类型6. 指定job处理的原始数据路径7. 指定job输出结果路径8. 提交作业*/// 1. 获取配置文件对象,获取job对象实例Configuration conf = new Configuration();Job job = Job.getInstance(conf, "WordCountDriver");/// jobName可以自定义// 2. 指定程序jar的本地路径job.setJarByClass(WordCountDriver.class);//  3. 指定Mapper/Reducer类job.setMapperClass(WordCountMapper.class);job.setReducerClass(WordCountReducer.class);//  4. 指定Mapper输出的kv数据类型job.setMapOutputKeyClass(Text.class);job.setMapOutputValueClass(IntWritable.class);// 5. 指定最终输出的kv数据类型job.setOutputKeyClass(Text.class);job.setOutputValueClass(IntWritable.class);// 6. 指定job处理的原始数据路径FileInputFormat.setInputPaths(job, new Path(args[0])); // 指定读取数据的原始路径//  7. 指定job输出结果路径FileOutputFormat.setOutputPath(job, new Path(args[1])); // 指定结果数据输出路径//  8. 提交作业boolean flag = job.waitForCompletion(true);// jvm退出:正常退出0,非0值则是错误退出System.exit(flag ? 0 : 1);}
}

 

运行任务

1、本地模式

直接Idea中运行驱动类即可

idea运行需要传入参数:

选择editconfiguration 

在program arguments设置参数 

运行时报错 ---->  参见博文org.apache.hadoop.io.nativeio.NativeIO$Windows.access0(Ljava/lang/String;I)Z的解决办法_zhouang770377的博客-CSDN博客

运行结束,去到输出结果路径查看结果

        注意本地idea运行mr任务与集群没有任何关系,没有提交任务到yarn集群,是在本地使用多线程方式模拟的mr的运行。 

2、Yarn集群模式

把程序打成jar包,改名为wc.jar;上传到Hadoop集群

选择合适的Jar包

准备原始数据文件,上传到HDFS的路径,不能是本地路径,因为跨节点运行无法获取数据!! 

启动Hadoop集群(Hdfs,Yarn)

使用Hadoop 命令提交任务运行

hadoop jar wc.jar com.lagou.wordcount.WordcountDriver /user/lagou/input /user/lagou/output

Yarn集群任务运行成功展示图


http://chatgpt.dhexx.cn/article/90LgQOIh.shtml

相关文章

MapReduce编程快速入门

MapReduce编程规范 用户编写的程序分成三个部分&#xff1a;Mapper&#xff0c;Reducer&#xff0c;Driver(提交运行mr程序的客户端) Mapper阶段继承Mapper类 &#xff08;1&#xff09;用户自定义的Mapper要继承自己的父类 &#xff08;2&#xff09;Mapper的输入数据是KV对…

java mapreduce编程_Hadoop实验——MapReduce编程(1)

实验目的 通过实验掌握基本的MapReduce编程方法。 掌握用MapReduce解决一些常见的数据处理问题&#xff0c;包括数据去重、数据排序和数据挖掘等。 通过操作MapReduce的实验&#xff0c;模仿实验内容&#xff0c;深入理解MapReduce的过程&#xff0c;熟悉MapReduce程序的编程方…

MapReduce编程初级实践

一、实验目的 通过实验掌握基本的MapReduce编程方法&#xff1b;掌握用MapReduce解决一些常见的数据处理问题&#xff0c;包括数据去重、数据排序和数据挖掘等。 二、 实验平台 操作系统&#xff1a;ubuntu18 Hadoop版本&#xff1a;3.2.2 HBase版本&#xff1a;2.2.2 JDK版…

MapReduce编程练习

目录 编程实现按日期统计访问次数 2.编程实现按访问次数排序 获取成绩表最高分 编译jar包方法 编程实现按日期统计访问次数 (1) 定义输入/输出格式 社交网站用户的访问日期在格式上属于文本格式&#xff0c;访问次数为整型数值格式。其组成的键值对为<访问日…

云计算实验 MapReduce编程

一、实验题目 MapReduce编程 二、实验内容 本实验利用 Hadoop 提供的 Java API 进行编程进行 MapReduce 编程。 三、实验目标 掌握MapReduce编程。 理解MapReduce原理 【实验作业】简单流量统计 有如下这样的日志文件&#xff1a; 13726230503 00-FD-07-A4-72-B8:CMCC 120.19…

Hadoop实验4:MapReduce编程

目录 一. 【实验准备】 1.工作目录 2.打开eclipse并配置工作空间 二、准备工作 1. 新建项目 2. 准备测试数据 3. 添加 MapReduce 编程框架 三、Map过程 四、Reduce过程 五、执行MapReduce任务 六、实验结果 七、准备工作 1. 新建项目 2. 准备relation.dat 3. 添加…

MapReduce 编程规范 (以WordCount为例)

先介绍一下常用的数据序列化类型 在MapReduce编程中&#xff0c;需要进行数据传输&#xff0c;比如将Mapper的结果传入Reducer中进行汇总&#xff0c;媒介就是context,所以需要可以序列化的数据类型。 MapReduce编程规范 Mapper阶段、Reducer阶段&#xff0c;Driver阶段 Map…

MapReduce 编程实战

MapReduce 采用了「分而治之」的思想。在分布式计算中&#xff0c;MapReduce 框架负责处理并行编程中分布式存储、工作调度、负载均衡、容错均衡、容错处理以及网络通信等复杂问题&#xff0c;把处理过程高度抽象为两个函数&#xff1a;map&#xff0c;把一个任务分解成多个任务…

实验三-MapReduce编程

前提&#xff1a;安装好Hadoop 参考文章&#xff1a; MapReduce编程实践(Hadoop3.1.3)_厦大数据库实验室博客 实验要求 基于MapReduce执行“词频统计”任务。 将提供的A&#xff0c;B&#xff0c;C文件上传到HDFS上&#xff0c;之后编写MapReduce代码并将其部署到hadoop&…

MapReduce编程模型

1.MapReduce简介 MapReduce是一个分布式运算程序的编程框架&#xff0c;核心功能是将用户编写的业务逻辑代码和自带默认组件整合成一个完整的分布式运算程序&#xff0c;并发运行在Hadoop集群上。 一个完整的mapreduce程序在分布式运行时有三类实例进程&#xff1a; MRAppMaste…

MapReduce编程框架

1、MapReduce思想 MapReduce思想在生活中处处可见。我们或多或少都曾接触过这种思想。MapReduce的思想核心是分而治之&#xff0c;充分利用了并行处理的优势。即使是发布过论文实现分布式计算的谷歌也只是实现了这种思想&#xff0c;而不是自己原创。 MapReduce任务过程是分为…

MapReduce编程实践

MapReduce编程实践 重要知识点&#xff1a; MapReduce是一种分布式并行编程模型,是Hadoop核心子项目之一,如果已经安装了Hadoop&#xff0c;就不需要另外安装MapReduce。主要的理论知识点包括&#xff1a;MapReduce概述、MapReduce的工作流程&#xff0c;WordCount实例分析&a…

mapreduce 编程模型

MapReduce是在总结大量应用的共同特点的基础上抽象出来的分布式计算框架&#xff0c;它适用的应用场景往往具有一个共同的特点&#xff1a;任务可被分解成相互独立的子问题。基于该特点&#xff0c;MapReduce编程模型给出了其分布式编程方法&#xff0c;共分5个步骤&#xff1a…

MapReduce编程基础

&#xff08;一&#xff09;实现词频统计的基本的MapReduce编程。 ①在/user/hadoop/input文件夹(该文件夹为空)&#xff0c;创建文件wordfile1.txt和wordfile2.txt上传到HDFS中的input文件夹下。 文件wordfile1.txt的内容如下&#xff1a; I love Spark I love Hadoop 文件wor…

(超详细)MapReduce工作原理及基础编程

MapReduce工作原理及基础编程&#xff08;代码见文章后半部分&#xff09; JunLeon——go big or go home 目录 MapReduce工作原理及基础编程&#xff08;代码见文章后半部分&#xff09; 一、MapReduce概述 1、什么是MapReduce&#xff1f; 2、WordCount案例解析MapRed…

【小白视角】大数据基础实践(五) MapReduce编程基础操作

目录 1. MapReduce 简介1.1 起源1.2 模型简介1.3 MRv1体系结构1.4 YARN1.4.1 YARN体系结构1.4.2 YARN工作流程 2. MapReduce 工作流程3. Java Api要点4. 实验过程最后 1. MapReduce 简介 1.1 起源 在函数式语言里&#xff0c;map表示对一个列表&#xff08;List&#xff09;中…

MapReduce编程

一、MapReduce编程规范 MapReduce的开发一共又八个步骤&#xff0c;其中Map阶段分为2个步骤&#xff0c;Shuffle阶段4个步骤&#xff0c;Reduce阶段分为2个步骤。 1.1 步骤流程 Map阶段2个步骤 设置InputFormat类&#xff0c;将数据切分为key-value&#xff08;k1和v1&#x…

SSL/TLS

SSL/TLS 一、SSL/TLS1.1 历史发展1.2 使用场景1.3 解决的问题1.4 工作流程 二、对称加密&#xff08;Symmetric Cryptography&#xff09;2.1 工作原理2.2 翻转攻击2.3 认证加密&#xff08;Authentication Encryption&#xff09;2.4 Diffie-Hellman2.5 KDF2.6 Diffie-Hellman…

HTTPS,SSL,TLS

SSL TLS secure sockets layer 安全套接字层&#xff0c;Netscape公司研发。 transport layer security 安全传输层协议 定义 协议 年份 SSL 1.0 未知 SSL 2.0 1995 SSL 3.0 1996 TLS 1.0 1999 TLS 1.1 2006 TLS 1.2 2008 TLS 1.3 2018 IETF&#xff08;The…

TLS传输协议

TLS&#xff1a;安全传输层协议&#xff08;TLS&#xff09;用于在两个通信应用程序之间提供保密性和数据完整性。 该协议由两层组成&#xff1a;TLS 记录协议&#xff08;TLS Record&#xff09;和 TLS 握手协议&#xff08;TLS Handshake&#xff09;。 传输层安全性协议&a…