MapReduce 编程实例:词频统计

news2024/11/28 14:28:18

文章目录

  • MapReduce 编程实例:词频统计
    • 一,准备数据文件
      • (1)在虚拟机上创建文本文件
      • (2)上传文件到HDFS指定目录
    • 二,使用IDEA创建Maven项目
    • 三,添加相关依赖
    • 四,创建日志属性文件
      • (1)在resources目录里创建log4j.properties文件
      • (2)log4j.properties文件添加内容
    • 五,创建词频统计映射器类
      • (1)创建net.army.mr包
      • (2)在net.army.mr包下创建WordCountMapper类
      • (3)为了更好理解Mapper类的作用,在map()函数里暂时不进行每行文本分词处理,直接利用context输出key和value
    • 六,创建词频统计驱动器类
      • (1)在net.hw.mr包里创建WordCountDriver类
      • (2)注意导包
    • 七,运行词频统计驱动器类,查看结果


MapReduce 编程实例:词频统计

启动hadoop服务,输入命令:start-all.sh
在这里插入图片描述

一,准备数据文件

(1)在虚拟机上创建文本文件

在export目录下,创建wordcount目录,在里面创建words.txt文件,向words.txt输入下面内容。
在这里插入图片描述输入内容:

hello hadoop world
hello hive world
hello hbase world
hadoop hive hbase
I love hadoop and hive

(2)上传文件到HDFS指定目录

创建/wordcount/input目录,执行命令:hdfs dfs -mkdir -p /wordcount/input
在这里插入图片描述
在Hadoop WebUI界面上查看目录是否创建成功
在这里插入图片描述
将在本地/export/wordcount/目录下的words.txt文件,上传到HDFS的/wordcount/input目录,输入命令:hdfs dfs -put /export/wordcount/words.txt /wordcount/input
在这里插入图片描述
在Hadoop WebUI界面上查看words.txt文件是否上传成功
在这里插入图片描述

二,使用IDEA创建Maven项目

1.选择【Maven】,选择【jdk】版本,单击【Next】按钮
在这里插入图片描述

2.输入项目名称为:MRWordCount,单击【Finish】按钮
在这里插入图片描述3.创建成功,弹出如下界面
在这里插入图片描述

三,添加相关依赖

1.在pom.xml文件里添加hadoop和junit依赖,内容为:

<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>                                                  

在这里插入图片描述
2.单击【maven】,单击那个刷新按钮,它会自动下载相关依赖
在这里插入图片描述
3.下载完成后,那个红色的感叹号会变成勾
在这里插入图片描述

注:maven的下载和配置可以参考:《在IDEA中配置Maven》

四,创建日志属性文件

(1)在resources目录里创建log4j.properties文件

1.右击resources目录,单击【new】选择【resources bundle】,弹出下图界面输入log4j,单击【ok】按钮
在这里插入图片描述2.在弹出的【Create Resource Bundle】对话框中输入:log4j,单击【OK】按钮
在这里插入图片描述

(2)log4j.properties文件添加内容

1.添加如下内容

log4j.rootLogger=INFO, 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

2.添加完成实例图
在这里插入图片描述

五,创建词频统计映射器类

(1)创建net.army.mr包

1.右击【java】选择【new】单击【package】
在这里插入图片描述
2.在弹出的【new package】对话框中输入net.army.mr,按下回车键
在这里插入图片描述
3.成功创建
在这里插入图片描述

(2)在net.army.mr包下创建WordCountMapper类

1.右击【net.army.mr】包,选择【new】,单击【java class】
在这里插入图片描述2.在弹出的对话框输入WordCountMapper,按下回车键
在这里插入图片描述
3.成功创建示例图如下
在这里插入图片描述

(3)为了更好理解Mapper类的作用,在map()函数里暂时不进行每行文本分词处理,直接利用context输出key和value

源码

package net.army.mr;


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

import java.io.IOException;

/**
 * 功能:词频统计映射器类
 * 作者:梁辰兴
 * 日期:2022年12月12日
 */


public class WordCountMapper extends Mapper<LongWritable, Text, LongWritable, Text> {
    @Override
    protected void map(LongWritable key, Text value, Context context)
            throws IOException, InterruptedException {
        // 直接将键值对数据传到下一个阶段
        context.write(key, value);
    }
}

六,创建词频统计驱动器类

(1)在net.hw.mr包里创建WordCountDriver类

1.在弹出的对话框中输入WordCountDriver
在这里插入图片描述
2.向WordCountDriver类中添加以下代码:

package net.army.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.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;

import java.net.URI;

/**
 * 功能:词频统计驱动器类
 * 作者:梁辰兴
 * 日期:2022年12月12日
 */
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(LongWritable.class);
        // 设置map任务输出值类型
        job.setMapOutputValueClass(Text.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);
        }
    }
}

(2)注意导包

1.注意导包问题

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.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;

import java.net.URI;

2.不要导成org.apache.hadoop.mapred包下的FileInputFormatFileOutputFormat

七,运行词频统计驱动器类,查看结果

统计结果之前会显示大量信息,如果不想看到统计结果之前的大堆信息,可以修改log4j.properties文件,将INFO改为ERROR
在这里插入图片描述运行WordCountDriver程序,查看结果
在这里插入图片描述

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

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

相关文章

【AI with ML】第 3 章 :超越基础知识:检测图像中的特征

&#x1f50e;大家好&#xff0c;我是Sonhhxg_柒&#xff0c;希望你看完之后&#xff0c;能对你有所帮助&#xff0c;不足请指正&#xff01;共同学习交流&#x1f50e; &#x1f4dd;个人主页&#xff0d;Sonhhxg_柒的博客_CSDN博客 &#x1f4c3; &#x1f381;欢迎各位→点赞…

树上操作【点分治】 - 原理 中心分解 【POJ No. 1741】 树上两点之间的路径数 Tree

树上操作【点分治】 - 原理 中心分解 分治法指将规模较大的问题分解为规模较小的子问题&#xff0c;解决各个子问题后合并得到原问题的答案。树上的分治算法分为点分治和边分治。 点分治经常用于带权树上的路径统计&#xff0c;本质上是一种带优化的暴力算法&#xff0c;并融…

【内网安全-基础】基础知识、信息收集、工具

目录 一、基础知识 1、内网&#xff1a; 2、工作组&#xff1a; 3、域(Domain)&#xff1a; 二、基础信息收集 1、判断是否在域内 2、机器角色判断 3、出网协议判断 4、端口判断 三、常规信息收集 1、常用命令 2、常用命令 3、工具&插件 LadonGO CS插件 Adfi…

基于Java(Spring+Struts+Hibernate 框架)实现(Web)学生课程管理系统【100010038】

课程管理系统设计文档 二、引言 2.1 目的 ​ 本文档详细描述了课程管理系统的设计&#xff0c;达到引导开发的作用&#xff0c;同时实现测试人员以及用户的沟通。 ​ 本文档面向开发人员&#xff0c;测试人员以及最终用户编写&#xff0c;是了解系统的导航。 2.2 范围 ​…

Win10系统电脑连接打印机的操作方法教学

Win10系统电脑连接打印机的操作方法教学分享&#xff0c;很多用户在办公的时候都会需要使用到打印机。用用户自己购买了打印机之后&#xff0c;不懂怎么去连接自己的电脑来进行使用的方法&#xff0c;接下来我们一起来看看Win10系统电脑连接打印机的操作方法分享吧。 Win10连接…

2022职场人状态和顺风出行感受调研报告

2022年即将过去&#xff0c;作为职场人的你会如何总结&#xff1f;职场同路人又有哪些想对彼此说的话&#xff1f;近日&#xff0c;嘀嗒出行发布《2022职场人状态和顺风出行感受调研报告》&#xff0c;基于近8000名嘀嗒顺风车车主和乘客分享各自职场经历和顺风出行感受&#xf…

运维人必须掌握的 5 种常用运维监控工具

运维监控工具千千万&#xff0c;仅开源的解决方案就有流量监控&#xff08;MRTG、Cacti、SmokePing、Graphite 等&#xff09;和性能告警&#xff08;Nagios、Zabbix、Zenoss Core、Ganglia、OpenTSDB等&#xff09;可供选择。 并且每种软件都有自己的特点和功能&#xff0c;各…

WiFi热点加装短信认证怎么操作?

公共场所提供无线wifi上网服务&#xff0c;需对用户进行实名认证。手机短信实名认证以其用户体验、综合成本等优势&#xff0c;成为公共wifi上网认证的首选方案。 无线wifi上网实现信认证功能&#xff0c;需要借助上网行为管理设备搭配验证短信平台使用&#xff1b;根据无线wi…

基于Java(Jsp+Sevlet)+MySql 实现的(Web)成绩管理系统【100010041】

1 概述 1.1 开发背景 随着学生数量的日渐增多&#xff0c;学生教务系统的数据量也不断增加&#xff0c;这无疑大大增加了教务系统的负担。如果能把负责学生成绩管理的模块独立出来形成一个独立的系统&#xff0c;便可以有效降低教务系统的数据量&#xff0c;不仅可以方便管理…

阿里巴巴Java开发手册(黄山版)

阿里巴巴 Java 开发手册&#xff08;黄山版&#xff09; 链接&#xff1a;https://pan.baidu.com/s/1iKsXlq1DSbePLvuysYbA4A 提取码&#xff1a;yyds 阿里巴巴将 Java 开发手册 从 1.7.0 的嵩山版更新至 1.7.1 的黄山版&#xff0c;新增 11 条新规约&#xff0c;具体变动如下…

[ Linux ] 线程控制(线程创建,等待,终止)

在上一篇我们了解了Linux下线程的相关概念。而本篇的主要内容是线程控制。线程控制包括线程的创建&#xff0c;线程的终止&#xff0c;线程等待等问题&#xff0c;以及线程分离和Linux常见线程安全问题。 目录 1.线程控制 1.1POSIX线程库 1.2 创建线程 1.2.1 创建线程编码…

新库上线 | CnOpenData劳务外包企业工商注册基本信息数据

劳务外包企业工商注册基本信息数据 一、数据简介 随着我国社会主义市场经济的发展&#xff0c;劳务市场中的用工方式也朝着多样化方向演变&#xff0c;劳务外包正是现代化人力资源管理和企业生产实际结合的一种独特的新模式。 在劳务外包过程中&#xff0c;企业将人事管理的部…

Node 文件查找优先级及 Require 方法文件查找策略

Node 文件查找优先级及 Require 方法文件查找策略 一、模块规范 NodeJS对CommonJS进行了支持和实现&#xff0c;让我们在开发node的过程中可以方便的进行模块化开发&#xff1a; 在Node中每一个js文件都是一个单独的模块模块中包括CommonJS规范的核心变量&#xff1a;export…

图数据库知识点2:图思维方式

在上一个知识点中&#xff0c;我们剖析了关系型数据库、数仓湖与图数据库的差异。在本文&#xff0c;我们会着重介绍一个重要的概念——图思维方式&#xff08;Graph-thinking&#xff09;。 关于思维方式 每个人应该如何思考&#xff0c;他/她是如何思考的&#xff0c;这是一…

朝代更替中的上下五千年

《近代中国社会的新陈代谢》 关于作者 陈旭麓是著名历史学家、华东师范大学的 建校元老之一。生前是中国史学会理事、 中国现代史学会副理事长、上海地方史志 研究会副会长。著有《初中本国史》《司马迁的历史观》《近代中国社会的新陈代谢》 《浮想录》等。 关于本书 这本…

Qt / Qml 中捕获(中文)输入法事件(按下 提交)

【写在前面】 最近工作中遇到一个奇怪的问题&#xff1a; 本来想在 TextEdit ( QTextEdit ) 中捕获一下键盘按键按下的事件。 然而&#xff0c;当输入法为英文时( 正常输入字符 )&#xff0c;可以捕获到按键事件&#xff0c;但当我切换到中文时&#xff0c;弹出输入法选框后&am…

web前端网页设计期末课程大作业:企业网页主题网站设计——舞蹈培训11页HTML+CSS+JavaScript

&#x1f389;精彩专栏推荐 &#x1f4ad;文末获取联系 ✍️ 作者简介: 一个热爱把逻辑思维转变为代码的技术博主 &#x1f482; 作者主页: 【主页——&#x1f680;获取更多优质源码】 &#x1f393; web前端期末大作业&#xff1a; 【&#x1f4da;毕设项目精品实战案例 (10…

从零开始,教你写一个串口调试助手

摘要&#xff1a;相信很多小伙伴都没接触过QT&#xff0c;如果想用QT写一个调试助手&#xff0c;首先是要会一点C语法。只要能看得懂C的代码&#xff0c;就能很快的写一个串口调试助手。 下面先推荐两个视频教程&#xff0c;感兴趣的可以看一看&#xff01; 1、B站Jomse工 B站…

项目建议书怎么写?

Why 为什么需要项目建议书? 行政、国企、事业单位间的买卖需要按国家规定的“政府采购法”进行(个体户,私企间的买卖不需要按“政府采购法”进行),不是个人的消费,有一整套流程,《项目建议书》这套流程中的产物之一。 即国家规定,纳税人的钱不能乱花,买之前要想好买…

南卡和Snowkids电容笔哪款更值得入手?口碑最佳的国产电容笔

随着苹果推出了Apple Pencil之后后&#xff0c;平替电容笔的产品也随之出现了不少&#xff0c;其中大部分都是没很高知名度的牌子&#xff0c;价格也是五花八门&#xff0c;有便宜的也有昂贵的&#xff0c;让消费者有了更多的选择&#xff0c;对于第一次购买电容笔的小白来说但…