MR实战:词频统计

news2024/11/18 15:25:09

文章目录

  • 一、实战概述
  • 二、提出任务
  • 三、完成任务
    • (一)准备数据
      • 1、在虚拟机上创建文本文件
      • 2、上传文件到HDFS指定目录
    • (二)实现步骤
      • 1、创建Maven项目
      • 2、添加相关依赖
      • 3、创建日志属性文件
      • 4、创建词频统计映射器类
      • 5、创建词频统计归并器类
      • 6、创建词频统计驱动器类
      • 7、启动应用,查看结果
  • 四、实战总结

一、实战概述

  • 本实战演练旨在利用Hadoop MapReduce框架在虚拟环境中执行一个简单的词频统计任务。首先,在master节点上创建了一个包含多个单词行的文本文件words.txt,并将该文件上传至HDFS中的指定目录/wordcount/input

  • 在集成开发环境IntelliJ IDEA中,我们创建了一个名为MRWordCount的Maven项目,并引入了Apache Hadoop 3.3.4版本的客户端依赖和JUnit测试框架。为了便于日志管理,添加了log4j.properties配置文件来定义日志输出格式及位置。

  • 接下来,实现了两个关键类:WordCountMapperWordCountReducerWordCountMapper继承自Mapper接口,负责读取输入文本文件中的每一行内容,将每行按空格分割成单词,并为每个单词生成一个键值对(<单词, 1>),以便后续计数处理。而WordCountReducer则继承自Reducer接口,它接收Mapper阶段产生的所有相同单词的键及其对应的次数,进行合并统计并输出格式化的"(单词, 出现次数)"键值对。

  • 最后,通过WordCountDriver驱动类完成整个MapReduce作业的设置与执行。此类初始化Hadoop Configuration对象、设置Job参数(包括Mapper和Reducer类、键值类型等)、指定了HDFS上的输入输出路径,并最终提交作业至集群执行。作业完成后,WordCountDriver还会从HDFS上读取结果并显示到控制台。

  • 经过上述步骤,当运行WordCountDriver主类时,程序将会读取HDFS上的输入文件,运用MapReduce模型进行分布式计算,最终得到期望的词频统计结果,并在控制台展示出来。这个实例展示了如何使用Hadoop MapReduce进行大规模数据处理的实际操作流程。

二、提出任务

  • 单词文件 - words.txt
hello hadoop world
hello hive world
hello hbase world
hadoop hive hbase
I love hadoop and hive
  • 使用MR框架,进行词频统计,输出如下结果
    在这里插入图片描述

三、完成任务

(一)准备数据

1、在虚拟机上创建文本文件

  • 在master虚拟机上创建words.txt文件
    在这里插入图片描述

2、上传文件到HDFS指定目录

  • 创建/wordcount/input目录,执行命令:hdfs dfs -mkdir -p /wordcount/input
    在这里插入图片描述

  • 将文本文件words.txt,上传到HDFS的/wordcount/input目录
    在这里插入图片描述

(二)实现步骤

  • 说明:集成开发环境IntelliJ IDEA版本 - 2022.3

1、创建Maven项目

  • Maven项目 - MRWordCount,设置了JDK版本 - 1.8,组标识 - net.huawei.mr
    在这里插入图片描述

  • 单击【Create】按钮,得到初始化项目
    在这里插入图片描述

2、添加相关依赖

  • pom.xml文件里添加hadoop-clientjunit依赖
    在这里插入图片描述
<dependencies>                                   
    <!--hadoop客户端-->                             
    <dependency>                                 
        <groupId>org.apache.hadoop</groupId>     
        <artifactId>hadoop-client</artifactId>   
        <version>3.3.4</version>                 
    </dependency>                                
    <!--单元测试框架-->                                
    <dependency>                                 
        <groupId>junit</groupId>                 
        <artifactId>junit</artifactId>           
        <version>4.13.2</version>                
    </dependency>                                
</dependencies>                                                  
  • 刷新项目依赖
    在这里插入图片描述

3、创建日志属性文件

  • resources目录里创建log4j.properties文件
    在这里插入图片描述
log4j.rootLogger=ERROR, stdout, logfile
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/wordcount.log
log4j.appender.logfile.layout=org.apache.log4j.PatternLayout
log4j.appender.logfile.layout.ConversionPattern=%d %p [%c] - %m%n

4、创建词频统计映射器类

  • 创建net.huawei.mr包,在包里创建WordCountMapper
    在这里插入图片描述
package net.huawei.mr;

import org.apache.hadoop.io.IntWritable;
import org.apache.hadoop.io.LongWritable;
import org.apache.hadoop.mapreduce.Mapper;
import org.apache.hadoop.io.Text;
import java.io.IOException;

/**
 * 功能:词频统计映射器类
 * 作者:华卫
 * 日期:2024年01月05日
 */
public class WordCountMapper extends Mapper<LongWritable, Text, Text, IntWritable> {
    @Override
    protected void map(LongWritable key, Text value, Context context)
            throws IOException, InterruptedException {
        // 获取行内容
        String line = value.toString();
        // 按空格拆分成单词数组
        String[] words = line.split(" ");
        // 遍历单词数组,生成输出键值对
        for (String word : words) {
            context.write(new Text(word), new IntWritable(1));
        }
    }
}
  • 该代码定义了一个Hadoop MapReduce作业中的词频统计Mapper类(WordCountMapper),继承自Mapper<LongWritable, Text, Text, IntWritable>。它接收输入键值对(LongWritable行偏移量,Text行内容),按空格分割每行文本为单词,并为每个单词输出一个键值对到上下文(<Text: 单词, IntWritable: 1>),用于后续Reducer进行计数汇总。

  • 映射任务与归并任务示意图
    在这里插入图片描述

5、创建词频统计归并器类

  • net.huawei.mr包里创建WordCountReducer
    在这里插入图片描述
package net.huawei.mr;

import org.apache.hadoop.io.IntWritable;
import org.apache.hadoop.io.NullWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Reducer;

import java.io.IOException;

/**
 * 功能:词频统计归并类
 * 作者:华卫
 * 日期:2024年01月05日
 */
public class WordCountReducer extends Reducer<Text, IntWritable, Text, NullWritable> {
    @Override
    protected void reduce(Text key, Iterable<IntWritable> values, Context context)
            throws IOException, InterruptedException {
        // 定义键(单词)出现次数
        int count = 0;
        // 遍历输入值迭代器
        for (IntWritable value : values) {
            count = count + value.get(); // 针对此案例,可以写为count++;
        }

        // 生成新的键,格式为(word,count)
        String newKey = "(" + key.toString() + "," + count + ")";

        // 输出新的键值对
        context.write(new Text(newKey), NullWritable.get());
    }
}
  • 该WordCountReducer类是Hadoop MapReduce中用于词频统计的归约器,继承自Reducer<Text, IntWritable, Text, NullWritable>。在reduce方法中,它接收一个单词键(Text类型)及其对应的出现次数迭代器(IntWritable类型)。通过遍历所有次数并将它们累加到变量count上,然后将单词与统计结果拼接成"(word,count)"格式的新键,并使用NullWritable作为值输出,从而实现单词及其词频的合并统计。

6、创建词频统计驱动器类

  • net.huawei.mr包里,创建WordCountDriver
    在这里插入图片描述
package net.huawei.mr;

import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.FSDataInputStream;
import org.apache.hadoop.fs.FileStatus;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.io.IOUtils;
import org.apache.hadoop.io.IntWritable;
import org.apache.hadoop.io.NullWritable;
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.net.URI;

/**
 * 功能:词频统计驱动器类
 * 作者:华卫
 * 日期:2024年01月05日
 */
public class WordCountDriver {
    public static void main(String[] args) throws Exception {
        // 创建配置对象
        Configuration conf = new Configuration();
        // 设置客户端使用数据节点主机名属性
        conf.set("dfs.client.use.datanode.hostname", "true");

        // 获取作业实例
        Job job = Job.getInstance(conf);
        // 设置作业启动类
        job.setJarByClass(WordCountDriver.class);

        // 设置Mapper类
        job.setMapperClass(WordCountMapper.class);
        // 设置map任务输出键类型
        job.setMapOutputKeyClass(Text.class);
        // 设置map任务输出值类型
        job.setMapOutputValueClass(IntWritable.class);

        // 设置Reducer类
        job.setReducerClass(WordCountReducer.class);
        // 设置reduce任务输出键类型
        job.setOutputKeyClass(Text.class);
        // 设置reduce任务输出值类型
        job.setOutputValueClass(NullWritable.class);

        // 定义uri字符串
        String uri = "hdfs://master:9000";

        // 创建输入目录
        Path inputPath = new Path(uri + "/wordcount/input");
        // 创建输出目录
        Path outputPath = new Path(uri + "/wordcount/output");

        // 获取文件系统
        FileSystem fs = FileSystem.get(new URI(uri), conf);
        // 删除输出目录(第二个参数设置是否递归)
        fs.delete(outputPath, true);

        // 给作业添加输入目录(允许多个)
        FileInputFormat.addInputPath(job, inputPath);
        // 给作业设置输出目录(只能一个)
        FileOutputFormat.setOutputPath(job, outputPath);

        // 等待作业完成
        job.waitForCompletion(true);

        // 输出统计结果
        System.out.println("======统计结果======");
        FileStatus[] fileStatuses = fs.listStatus(outputPath);
        for (int i = 1; i < fileStatuses.length; i++) {
            // 输出结果文件路径
            System.out.println(fileStatuses[i].getPath());
            // 获取文件系统数据字节输入流
            FSDataInputStream in = fs.open(fileStatuses[i].getPath());
            // 将结果文件显示在控制台
            IOUtils.copyBytes(in, System.out, 4096, false);
        }
    }
}
  • 该WordCountDriver类是Hadoop MapReduce框架中用于执行词频统计任务的驱动类。
  1. 初始化配置:首先创建一个Configuration对象,设置客户端使用数据节点主机名属性以便正确解析路径。

  2. 构建作业实例:通过Job.getInstance(conf)获取一个MapReduce作业实例,并将当前类(WordCountDriver)作为作业启动类,这样Hadoop在运行时能识别到主程序入口。

  3. 配置Mapper和Reducer:分别指定Map阶段使用的类为WordCountMapper,Reduce阶段使用的类为WordCountReducer。同时设定Map阶段输出键值对类型为TextIntWritable,Reduce阶段输出键值对类型也为TextNullWritable

  4. 定义文件系统URI:设置HDFS地址为hdfs://master:9000,并基于此URI创建输入目录(/wordcount/input)和输出目录(/wordcount/output)。

  5. 文件系统操作:连接到HDFS文件系统,删除已存在的输出目录以准备新的计算结果,然后向作业添加输入目录和设置输出目录。

  6. 提交并监控作业:调用job.waitForCompletion(true)方法提交作业并等待其完成。当作业完成后,会返回一个布尔值表示作业是否成功执行。

  7. 读取并显示结果:作业结束后,列出输出目录下的所有文件,遍历这些文件并打开每个文件进行读取。利用IOUtils.copyBytes方法将结果文件的内容复制到控制台输出,展示词频统计的结果。

  • 总之,WordCountDriver类负责整个词频统计任务的初始化、配置、执行以及结果展示工作,它将Hadoop MapReduce的各个组件如Mapper、Reducer与实际的输入输出路径关联起来,形成了一个完整的词频统计应用。

7、启动应用,查看结果

  • 运行WordCountDriver类,查看结果
    在这里插入图片描述

四、实战总结

  • 本实战通过Hadoop MapReduce框架,在虚拟环境中对words.txt文件进行了词频统计。首先,将数据上传至HDFS,并在IntelliJ IDEA中创建Maven项目配置相关依赖。实现的WordCountMapper负责按空格拆分单词并初始化词频为1,WordCountReducer则对相同单词的计数进行合并。最后,WordCountDriver类配置作业参数、指定输入输出路径并在集群上执行任务,完成后从HDFS读取并展示统计结果。整个过程演示了MapReduce模式处理文本数据进行词频统计的完整流程。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1359009.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

六、Spring 声明式事务

本章概要 声明式事务概念 编程式事务声明式事务Spring事务管理器 基于注解的声明式事务 准备工作基本事务控制事务属性&#xff1a;只读事务属性&#xff1a;超时时间事务属性&#xff1a;事务异常事务属性&#xff1a;事务隔离级别事务属性&#xff1a;事务传播行为 6.1 声…

phpstudy_pro 关于多版本php的问题

我在phpstudy中安装了多个PHP版本 我希望不同的网站可以对应不同的PHP版本&#xff0c;则在nginx配置文件中需要知道不同的PHP版本的监听端口是多少&#xff0c;如下图所示 然而找遍了php.ini配置&#xff0c;并未对listen进行设置&#xff0c;好奇是怎么实现不同的PHP监听不同…

AI交互提示工程指南技术

简述: 当今互联网行业对于AI提示工程的需求日益增长,而《AI提示工程指南》是一本旨在满足这种需求的宝贵指南。本指南由一位对AI提示工程充满热情并自学而来的互联网从业者撰写,旨在为行业人员提供一个全面、易懂的参考手册。 这本指南将引领您踏上AI提示工程的旅程,深入探…

【Linux】Linux Page Cache页面缓存的原理

Page cache&#xff08;页面缓存&#xff09;是计算机操作系统中的一种机制&#xff0c;用于将频繁访问的数据从磁盘存储到内存中&#xff0c;以便更快地访问。当程序从磁盘请求数据时&#xff0c;操作系统会检查该数据是否已经存在于页面缓存中。如果存在&#xff0c;数据可以…

猫咪主食冻干K9、希喂、SC生骨肉冻干哪款好?详细对比测评这三款产品

随着科学养猫的观念深入人心&#xff0c;越来越多的铲屎官开始关注猫咪主食的营养与健康。主食冻干&#xff0c;作为一种模拟猫咪原始猎食的食品&#xff0c;因其高营养保留而受到广大猫奴的喜爱。相比传统的膨化猫粮&#xff0c;主食冻干更符合猫咪的饮食天性&#xff0c;提供…

【Storm实战】1.1 图解Storm的抽象概念

文章目录 0. 前言1. Storm 中的抽象概念1.1 流 (Stream)1.2 拓扑 (Topology)1.3 Spout1.4 Bolt1.5 任务 (Task)1.6 工作者 (Worker) 2. 形象的理解Storm的抽象概念2.1 流 (Stream)2.2 拓扑 (Topology)2.3 Spout2.4 Bolt2.5 任务 (Task)2.6 工作者 (Worker)场景1场景2 3.参考文档…

如何打造家居产业数字化转型范式?林氏家居以数智供应链作答

近年来&#xff0c;我国房地产行业逐步进入深度调整期。作为下游产业&#xff0c;家居家装行业的发展也来到了新阶段。业内人士指出&#xff0c;新房市场成交规模收缩&#xff0c;家居家装企业们开始整合资源&#xff0c;向存量房市场、产品科技化以及数字化转型。 国家层面出…

教学/直播/会议触摸一体机定制_基于展锐T820安卓核心板方案

触控一体机是一种集先进的触摸屏、工控和计算机技术于一体的设备。它取代了传统的键盘鼠标输入功能&#xff0c;广泛应用于教学、培训、工业、会议、直播、高新科技展示等领域。触摸一体机的应用提升了教学、会议和展示的互动性和信息交流。 触摸一体机方案基于国产6nm旗舰芯片…

设置进程优先级

#include <windows.h>int main() {// 获取当前进程的句柄HANDLE hProcess GetCurrentProcess();// 设置当前进程的优先级为高SetPriorityClass(hProcess, HIGH_PRIORITY_CLASS);// 执行其他代码return 0; }进程优先级 标志 idle &#xff08;低&#xff09; IDL…

Python (十七) __name__ == ‘__main__‘ 作用

程序员的公众号&#xff1a;源1024&#xff0c;获取更多资料&#xff0c;无加密无套路&#xff01; 最近整理了一波电子书籍资料&#xff0c;包含《Effective Java中文版 第2版》《深入JAVA虚拟机》&#xff0c;《重构改善既有代码设计》&#xff0c;《MySQL高性能-第3版》&…

小学副科老师轻松吗

在小学里&#xff0c;除了语文、数学和英语这些主科&#xff0c;还有许多副科老师&#xff0c;他们的工作日常是什么样的呢&#xff1f;今天&#xff0c;让我们一起来揭秘小学副科老师的一天。 备课&#xff1a;在忙碌中寻找创意的火花 副科老师同样需要花费大量时间进行备课…

视频剪辑指南:如何将多个视频快速批量合并的方法

在日常生活和工作中&#xff0c;经常要将多个视频片段合并为一个完整的视频。但是手动剪辑每个视频不仅费时&#xff0c;而且效率低下。那么如何解决这个问题呢&#xff0c;可以采用一些快速批量合并视频的方法。现在一起来看看云炫AI智剪如何批量合并视频的具体步骤吧。 合并…

Windows 使用 nmap软件测试 UDP 端口

下载windows版nmap &#xff0c;下载后双机默认安装。 Download the Free Nmap Security Scanner for Linux/Mac/Windows 打开CMD &#xff0c; 输入 cd C:\Program Files (x86)\Nmap C:\Program Files (x86)\Nmap>ncat -z -v -u ntp.aliyun.com 123 Ncat: Version 7.80 ( …

《现代C++语言核心特性解析》笔记(三)

二十四、三向比较&#xff08;C20&#xff09; 1. “太空飞船”&#xff08;spaceship&#xff09;运算符 C20标准新引入了一个名为“太空飞船”&#xff08;spaceship&#xff09;的运算符 <>&#xff0c;它是一个三向比较运算符。<> 之所以被称为“太空飞船”运…

六、HTML 段落

HTML 可以将文档分割为若干段落。 一、HTML 段落 段落是通过 <p> 标签定义的。 <p>这是一个段落 </p> <p>这是另一个段落</p> 注意&#xff1a;浏览器会自动地在段落的前后添加空行。&#xff08;</p> 是块级元素&#xff09; 二、不…

篮球羽毛球乒乓球体育场馆预订小程序开发

开发一款专业的小程序&#xff0c;用于多场馆场地的预定和管理&#xff0c;包括体育馆、羽毛球馆、兵乒球馆、篮球馆等各类场馆。此小程序旨在为场馆提供全方位的运营解决方案&#xff0c;并满足会员的不同需求。 该小程序的核心功能特性包括&#xff1a; 场馆管理&#xff…

排除启动类故障----三大实验

目录 一、模拟破坏mbr和分区表然后修复 二、修复grub引导故障 三、遗忘root用户密码 一、模拟破坏mbr和分区表然后修复 1、mbr处于第一块磁盘的第一个物理扇区&#xff0c;总共512个字节&#xff0c;前446个字节是grub程序&#xff0c;后面64个字节是分区表 2、故障原因&a…

安卓平板电脑,5G通讯加持,帮你的通讯效率提提速

安卓平板电脑&#xff0c;作为一种集通讯、娱乐、工作于一体的便携设备&#xff0c;近年来随着5G通讯技术的发展&#xff0c;其在通讯效率方面迎来了新的提升。5G通讯加持&#xff0c;不仅为安卓平板电脑带来了更快速、更稳定的数据传输能力&#xff0c;也为用户的通讯效率提供…

ZigBee协议栈 -- 协议栈版本与IAR版本适配说明(Zstack2.5.1a + IAR10.30.1)

文章目录 协议栈安装工程适配 在讲到ZigBee协议栈的文章中所用的协议栈版本是Zstack2.5.1a&#xff0c;对于Zstack2.5.1a运行在IAR8.10中是可以完全适配进行编译开发的&#xff0c;现在较新版本的IAR都是10的版本以上了&#xff0c;有部分开发者习惯使用最新版本来获得更好的开…

freeRTOS的栈溢出检测机制

1、前言 后面的分析是以RISC-V架构为例&#xff0c;不同的架构在代码实现上有些许区别RISC-V架构使用的满减栈 2、任务控制块介绍&#xff08;TCB&#xff1a;task controller Block&#xff09; typedef struct tskTaskControlBlock {volatile StackType_t * pxTopOfSta…