mapreduce基础: 手写wordcount案例

news2024/9/20 8:47:40

文章目录

    • 一、源代码
    • 二、运行截图

一、源代码

  1. WordCountMapper类
package org.example.wordcount;

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

import java.io.IOException;

public class WordCountMapper extends Mapper<LongWritable, Text,Text, IntWritable> {

    //新建输出文本对象(输出的key类型)
    private Text text = new Text();
    //新建输出IntWritable对象(输出的value类型)
    private IntWritable intWritable = new IntWritable( 1);


    /**
     * 重写map方法
     * @param key 文本的索引
     * @param value 文本值
     * @param context 上下文对象
     * @throws IOException
     * @throws InterruptedException
     */
    @Override
    protected void map(LongWritable key, Text value, Context context) throws IOException, InterruptedException {

        //获取拆分后的一行文本

        //mysql mysql value value value
        String line = value.toString();

        //根据分隔符进行单词拆分
        String[] words = line.split( " ");

        //循环创建键值对
        for (String word : words){

            //输出key值设置
            text.set (word) ;

            //进行map输出
            //igeek igeek -> <igeek ,1> <igeek,1>
            context.write(text,intWritable);
        }

    }
}

  1. WordCountReducer类
package org.example.wordcount;

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

import java.io.IOException;

public class WordCountReducer extends Reducer<Text, IntWritable,Text, IntWritable> {

    //输出value对象
    private IntWritable valueOut = new IntWritable();


    /**
     * 重写reduce方法
     * @param key 单词值
     * @param values 单词出现的次数集合
     * @param context   上下文对象
     * @throws IOException
     * @throws InterruptedException
     */
    @Override
    protected void reduce(Text key, Iterable<IntWritable> values, Context context) throws IOException, InterruptedException {

        //每个单词出现的次数
        int sum= 0;

        //<igeek,(1,1)>
        for (IntWritable value : values){

        //累计单词出现的数量
            sum += value.get();
        }

        //进行封装
        valueOut.set(sum);

        // reduce输出
        context.write(key, valueOut);


    }
}

  1. WordCountDriver类
package org.example.wordcount;

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 org.example.wordcounttemplate.WordCountMapper;
import org.example.wordcounttemplate.WordCountReducer;

import java.io.IOException;

/**
 * 充当mapreduce任务的客户端,用于提交任务
 */

public class WordCountDriver {
    public static void main(String[] args) throws IOException, ClassNotFoundException, InterruptedException {
//        1.获取配置信息,获取job对象实例
        Configuration conf=new Configuration();
        Job job=Job.getInstance(conf);

//        2.关联本Driver得jar路径
        job.setJarByClass(WordCountDriver.class);

//        3.关联map和reduce
        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.设置输入和输出路径
//        setInputPaths:可传多个输入文件
//         FileInputFormat.setInputPaths(job,new Path(args[0]));
//         FileOutputFormat.setOutputPath(job,new Path(args[1]));
        
        Path inputPath = new Path("D:\\Documentation\\Hello.txt");
        FileInputFormat.setInputPaths(job,inputPath);

        Path outputPath = new Path("D:\\Documentation\\outHello");
        FileOutputFormat.setOutputPath(job,outputPath);

//        7.提交job任务
        boolean result=job.waitForCompletion(true);
        System.out.println(result?"任务提交成功":"任务提交失败");

    }

}

  1. pom.xml
<?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>org.example</groupId>
  <artifactId>mapreduce_demo</artifactId>
  <version>1.0-SNAPSHOT</version>

  <name>mapreduce_demo</name>
  <!-- FIXME change it to the project's website -->
  <url>http://www.example.com</url>

  <properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    <maven.compiler.source>1.8</maven.compiler.source>
    <maven.compiler.target>1.8</maven.compiler.target>
  </properties>

  <dependencies>
    <!-- https://mvnrepository.com/artifact/org.apache.hadoop/hadoop-client -->
    <dependency>
      <groupId>org.apache.hadoop</groupId>
      <artifactId>hadoop-client</artifactId>
      <version>3.1.3</version>
    </dependency>

  </dependencies>

  <build>
    <pluginManagement><!-- lock down plugins versions to avoid using Maven defaults (may be moved to parent pom) -->
      <plugins>
        <!-- clean lifecycle, see https://maven.apache.org/ref/current/maven-core/lifecycles.html#clean_Lifecycle -->
        <plugin>
          <artifactId>maven-clean-plugin</artifactId>
          <version>3.1.0</version>
        </plugin>
        <!-- default lifecycle, jar packaging: see https://maven.apache.org/ref/current/maven-core/default-bindings.html#Plugin_bindings_for_jar_packaging -->
        <plugin>
          <artifactId>maven-resources-plugin</artifactId>
          <version>3.0.2</version>
        </plugin>
        <plugin>
          <artifactId>maven-compiler-plugin</artifactId>
          <version>3.8.0</version>
        </plugin>
        <plugin>
          <artifactId>maven-surefire-plugin</artifactId>
          <version>2.22.1</version>
        </plugin>
        <plugin>
          <artifactId>maven-jar-plugin</artifactId>
          <version>3.0.2</version>
        </plugin>
        <plugin>
          <artifactId>maven-install-plugin</artifactId>
          <version>2.5.2</version>
        </plugin>
        <plugin>
          <artifactId>maven-deploy-plugin</artifactId>
          <version>2.8.2</version>
        </plugin>
        <!-- site lifecycle, see https://maven.apache.org/ref/current/maven-core/lifecycles.html#site_Lifecycle -->
        <plugin>
          <artifactId>maven-site-plugin</artifactId>
          <version>3.7.1</version>
        </plugin>
        <plugin>
          <artifactId>maven-project-info-reports-plugin</artifactId>
          <version>3.0.0</version>
        </plugin>
      </plugins>
    </pluginManagement>
  </build>
</project>

  1. Hello.txt 测试文档

mysql mysql value value value
igeek igeek
mysql hive port property
mysql value value value property
mysql value port property
mysql hive port property
mysql value hive hive hive property
mysql hive port property
mysql port property
mysql value hive hive port property
value property
value hive

在这里插入图片描述

二、运行截图

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

对照文章:
大数据作业4(含大数据hdfs上实现wordcount案例)
https://blog.csdn.net/m0_48170265/article/details/130029532?spm=1001.2014.3001.5501

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

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

相关文章

[架构之路-169]-《软考-系统分析师》-4-据通信与计算机网络-0-Ad hoc网络(分组无线网络)

目录 什么是Ad hoc网络 adhoc无线网络的历史 ad hoc特点 独立性 结构 通信带宽 主机能源 分布式特性 生存周期 物理安全 adhoc无线网络的结构 adhoc无线网络的应用 什么是Ad hoc网络 Ad hoc是一种多跳的、无中心的、自组织无线网络&#xff0c;又称为多跳网&#xff08;M…

天龙八部手游服务端架设搭建教程

天龙八部手游服务端架设搭建教程 大家好&#xff0c;我是艾西。最近更新游戏搭建教程比较少也被不少小伙伴催更&#xff0c;今天我和大家聊聊天龙八部手游服务端架设搭建。 游戏讲述元佑元年&#xff0c;大宋遭受辽国入侵的故事&#xff0c;玩家可扮演峨眉、丐帮、天山、逍遥、…

SQL Server基础 第一章 (新建,分离,附加)

目录 前言 一&#xff0c;新建数据库 二&#xff0c;分离数据库 1&#xff0c;右键数据库&#xff0c;任务&#xff0c;分离 2&#xff0c;右键数据库&#xff0c;任务&#xff0c;分离 三&#xff0c;附加数据库 前言 本文主要详细介绍SQL server2019的简单使用&#xf…

ESP8266 +I2C SH1106 OLED仿数码管时钟

ESP8266 +I2C SH1106 OLED仿数码管时钟 📌相关篇《ESP8266 +I2C SSD1306 OLED仿数码管时钟》🎞🎬显示效果: 🔖本工程基于Arduino IDE框架下开发。🌿采用esp8266:Nodemcu📑配置参数信息: ✨在上面一篇的基础上做了改版,去除掉了原来在SSD1306那版中获取时间的NTP…

微信小程序制作

小程序是一种在移动设备上使用的轻量级应用程序&#xff0c;不需要下载安装&#xff0c;具有体积小、加载快和用户粘性高的优点。对于创业者和企业来说&#xff0c;开发一个小程序可以帮助他们拓宽商业渠道、增强品牌影响力和提升用户体验。那么&#xff0c;要开发一个小程序&a…

【Spring6】| 简述Spring中的八大模式

一&#xff1a;Spring中的八大模式 Spring中的八大模式&#xff0c;有很多我们前面已经讲过了&#xff0c;这里只需要大概有个印象&#xff0c;后期会出一个专门对23种设计模式的详解&#xff01; 1. 简单工厂模式 BeanFactory的getBean()方法&#xff0c;通过唯一标识来获取…

51单片机(8051系列)最小系统图--内部时钟

最小系统电路图&#xff08;无源晶振&#xff09; 电容的作用 C1,C2&#xff1a;协助晶振起振&#xff08;一般称为负载电容&#xff09; 解释&#xff1a; 负载电容的计算公式CL C1*C2 / &#xff08;C1C2&#xff09; CS 其中CS为电路板的寄生电容一般取3~5pF 一般情况下&…

对表中数据进行删改,基础查询

目录 一.DML&#xff1a;对表中的数据进行增删改 二.DQL 一.DML&#xff1a;对表中的数据进行增删改 1.添加:insert 2.修改&#xff1a;update 3.删除&#xff1a;delete 二.DQL 1.基础查询&#xff1a; 2. 排序查询 3.聚合函数 概念&#xff1a;将一列数据作为一个整体&am…

带你彻底理解栈和队列

文章目录 前言一、栈是什么&#xff1f;二、栈的使用1.方法2.代码实现 三.栈的模拟四.队列1.方法2.代码实现3.循环队列4.双端队列 总结&#xff1a; 前言 今天&#xff0c;带你彻底理解栈和队列。 一、栈是什么&#xff1f; 栈英文叫做stack&#xff0c;是一种特殊的线性表。…

ARM busybox 的移植实战1

前言 先逐步构建 “文件夹形式”的根文件系统&#xff0c;然后制作烧录镜像。 (1) rootfs 有 2 种格式&#xff1a;nfs 方式启动的 “文件夹形式” 的 rootfs&#xff0c;和用来烧录的镜像形式的 rootfs。 (2) 我们先从空文件夹开始&#xff0c;逐步向其中添加一些 rootfs 中…

消息队列总结

消息队列 KafkaRocketMQRabbitMQActiveMQZeroMQMQ对比选型结论 消息队列的优点&#xff1a; 实现系统解耦实现异步调用流量削峰 消息队列的缺点&#xff1a; 系统可用性降低提升系统的复杂度数据一致性问题 Kafka Apache Kafka 是一个分布式消息发布订阅系统。它最初是由Li…

通过ObjectMapper和JsonNode 把JSON字符串转换成树结构数据和获取树节点数据

一.简介 今天同事有个需求&#xff0c;要把一个JSON字符串转换成一个树结构的数据并获取节点数据&#xff0c;鉴于自己不想写递归去转换&#xff0c;于是使用ObjectMapper和JsonNode类去实现。 二.依赖 pom文件引入依赖&#xff1a; <dependency><groupId>com.…

leetcode每日一题——美团笔试题【1】

今天分享两道算法题&#xff0c;自己刚开始练习&#xff0c;可能在解法上不是最佳的&#xff0c;但是只提供一些自己的思路&#xff0c;欢迎大家多多指教~ 第一题 实现一个算法&#xff0c;确定一个字符串 s 的所有字符是否全都不同。 示例 1&#xff1a;输入: s "lee…

NUC980驱动595与165扩展输入输出接口

一、电路图 3个165串联组成扩展24路光耦输入检测&#xff0c;一个595扩展8路继电器输出 二、驱动源码 #include <linux/module.h> #include <linux/fs.h> #include <linux/uaccess.h> #include <linux/device.h>#include <linux/kernel.h> #in…

【C++ 学习 ①】- C++ 入门知识(上万字详解)

目录 一、历史 1.1 - C 语言的发展历程 1.2 - C 发展历程 二、C 关键字&#xff08;C98&#xff09; 三、命名空间 3.1 - 命名空间的定义 3.2 - 命名空间的使用 四、C 输入&输出 五、缺省参数 5.1 - 缺省参数的概念 5.2 - 缺省参数的分类 六、函数重载 6.1 - …

JavaSE学习进阶day05_03 泛型(进阶)

第五章 泛型&#xff0c;之前基础班学习过泛型&#xff0c;但是学的不深入 需要我们掌握的内容&#xff1a;&#xff08;掌握&#xff09; 1&#xff0c;如何使用一个带有泛型的类 2&#xff0c;如何使用一个带有泛型的方法 代码示例&#xff1a; ArrayList<String> lis…

浏览器插件官方demo学习(五):键盘快捷键、数据缓存、网络请求监听

键盘快捷键 这个demo主要是介绍了&#xff0c;通过自定义键盘快捷键的方式来触发扩展。 必须要在manifest.json文件中添加commands属性组合键&#xff1a;使用组合键时必须包含 Ctrl 或 Alt 细节不介绍&#xff0c;可以自行查看官方文档。这里只看一下常用的东西。 定义组合…

MYSQL第一讲:一个查询语句需要经过多少步?

1.连接器 负责客户端和MYSQL连接时的校验和权限验证 短连接&#xff1a;一段时间就断开然后重连&#xff0c;身份校验和权限验证不是一个轻松的活。所以不推荐 长连接&#xff1a;一般的情况都是长连接&#xff0c;但是长连接如果长时间不断开&#xff0c;会出问题&#xff…

Vulnhub项目:MrRobot

靶机地址&#xff1a;Mr-Robot: 1 ~ VulnHub 渗透过程&#xff1a; 先看描述&#xff0c;有3跟keys在这个靶机中 首先确定靶机ip&#xff0c;对靶机开放的端口进行探测 访问靶机地址&#xff0c;出现了很酷炫的web界面&#xff0c;这个mr.robot,是一个美剧&#xff0c;还是挺…

Python语言请求示例,电商商品详情接口,代码封装

Python提供了高效的高级数据结构&#xff0c;还能简单有效地面向对象编程。Python语和动态类型&#xff0c;以及解释型语言的本质&#xff0c;使它成为多数平台上写脚本和快速开发应用的编程语言&#xff0c; [2] 随着版本的不断更新和语言新功能的添加&#xff0c;逐渐被用于…