MapReduce案列-数据去重

news2024/12/26 10:51:26

文章目录

  • 一,案例分析
    • (一)数据去重介绍
    • (二)案例需求
  • 二,案例实施
    • (一)准备数据文件
      • (1)启动hadoop服务
      • (2)在虚拟机上创建文本文件
      • (3)上传文件到HDFS指定目录
    • (二)Map阶段实现
      • (1)创建Maven项目:Deduplicate
      • (2)添加相关依赖
      • (3)创建日志属性文件
      • (4)创建去重映射器类:DeduplicateMapper
    • (三)Reduce阶段实现
      • (1)创建去重归并器类:DeduplicateReducer
    • (四)Driver程序主类实现
      • (1)创建去重驱动器类:DeduplicateDriver
    • (五)运行去重驱动器类,查看结果
      • (1)运行DeduplicateDriver类
      • (2)下载并查看文件

一,案例分析

(一)数据去重介绍

数据去重主要是为了掌握利用并行化思想来对数据进行有意义的筛选,数据去重指去除重复数据的操作。在大数据开发中,统计大数据集上的多种数据指标,这些复杂的任务数据都会涉及数据去重。

(二)案例需求

文件file1.txt本身包含重复数据,并且与file2.txt同样出现重复数据,现要求使用Hadoop大数据相关技术对以上两个文件进行去重操作,并最终将结果汇总到一个文件中。

编写MapReduce程序,在Map阶段采用Hadoop默认作业输入方式后,将key设置为需要去重的数据,而输出的value可以任意设置为空。

在Reduce阶段,不需要考虑每一个key有多少个value,可以直接将输入的key复制为输出的key,而输出的value可以任意设置为空,这样就会使用MapReduce默认机制对key(也就是文件中的每行内容)自动去重。

二,案例实施

(一)准备数据文件

(1)启动hadoop服务

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

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

1.在/opt/mrtxt目录下创建两个文本文件 - file4.txt、file5.txt
在这里插入图片描述
2.输入命令:vi /export/mrtxt/file4.txt,向file4添加如下内容:

2022-12-1 a
2022-12-2 b
2022-12-3 c
2022-12-4 d
2022-12-5 a
2022-12-6 b
2022-12-7 c
2022-12-3 c

3.输入命令:vi /export/mrtxt/file5.txt,向file5添加如下内容:

2022-12-1 b
2022-12-2 a
2022-12-3 b
2022-12-4 d
2022-12-5 a
2022-12-6 c
2022-12-7 d
2022-12-3 c

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

1.创建/dedup/input目录,执行命令:hdfs dfs -mkdir -p /dedup/input
在这里插入图片描述
2.将两个文本文件 file4.txt与file5.txt,上传到HDFS的/dedup/input目录
在这里插入图片描述

(二)Map阶段实现

使用IntelliJ开发工具创建Maven项目Deduplicate,并且新创建net.army.mr包,在该路径下编写自定义Mapper类DeduplicateMapper,主要用于读取数据集文件将TextInputFormat默认组件解析的类似<0,2022-11-1 a >键值对修改为<2022-11-1 a,null>。

(1)创建Maven项目:Deduplicate

1.配置好如下图所示,然后单击【Create】按钮
在这里插入图片描述2.成功创建界面
在这里插入图片描述3.删除Main类,右击【Main】类,单击【Delete】
在这里插入图片描述

(2)添加相关依赖

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)创建日志属性文件

1.在resources目录里创建log4j.properties文件,右击【resources】,选择【New】,单击【Resource Bundle】
在这里插入图片描述2.在弹出的对话框中输入:log4j,单击【OK】按钮
在这里插入图片描述

3.向log4j.properties文件添加如下内容:

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/deduplicate.log
log4j.appender.logfile.layout=org.apache.log4j.PatternLayout
log4j.appender.logfile.layout.ConversionPattern=%d %p [%c] - %m%n

在这里插入图片描述

(4)创建去重映射器类:DeduplicateMapper

1.右击【net.army.mr】包,选择【New】,单击【Java Class】
在这里插入图片描述
2.在弹出的对话框中输入:DeduplicateMapper,按下回车键,创建成功
在这里插入图片描述
3.编写代码

package net.army.mr;

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

import java.io.IOException;

/**
 * 作者:梁辰兴
 * 日期:2022/12/14
 * 功能:去重映射器类
 */

public class DeduplicateMapper extends Mapper<LongWritable, Text, Text, NullWritable> {
    private static Text field = new Text();
    // <0,2022-12-3 c> --> <2022-12-3 c,null>
    @Override
    protected void map(LongWritable key, Text value, Context context)
            throws IOException, InterruptedException {
        field = value;
        context.write(field, NullWritable.get());
    }
}

(三)Reduce阶段实现

根据Map阶段的输出结果形式,同样在net.army.mr包下,自定义Reducer类DeduplicateReducer,主要用于接受Map阶段传递来的数据,根据Shuffle工作原理,键值key相同的数据就会被合并,因此输出数据就不会出现重复数据了。

(1)创建去重归并器类:DeduplicateReducer

1.右击【net.army.mr】包,选择【New】,单击【Java Class】
在这里插入图片描述
2.在弹出的对话框中输入:DeduplicateReducer,按下回车键,创建成功
在这里插入图片描述
3.编写代码

package net.army.mr;

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

import java.io.IOException;

/**
 * 作者:梁辰兴
 * 日期:2022/12/14
 * 功能:去重归并器类
 */

public class DeduplicateReducer extends Reducer<Text, NullWritable, Text, NullWritable> {
    // <2022-12-3 c,null> <2022-12-4 d,null><2022-12-4 d,null>
    @Override
    protected void reduce(Text key, Iterable<NullWritable> values, Context context)
            throws IOException, InterruptedException {
        context.write(key, NullWritable.get());
    }
}

(四)Driver程序主类实现

编写MapReduce程序运行主类DeduplicateDriver,主要用于设置MapReduce工作任务的相关参数,对HDFS上/dedup/input目录下的源文件实现去重,并将结果输入到HDFS的/dedup/output目录下。

(1)创建去重驱动器类:DeduplicateDriver

1.右击【net.army.mr】包,选择【New】,单击【Java Class】
在这里插入图片描述
2.在弹出的对话框中输入:DeduplicateDriver,按下回车键,创建成功
在这里插入图片描述
3.编写代码

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

/**
 * 作者:梁辰兴
 * 日期:2022/12/14
 * 功能:去重驱动器类
 */

public class DeduplicateDriver {
    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(DeduplicateDriver.class);

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

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

        // 定义uri字符串
        String uri = "hdfs://master:9000";
        // 创建输入目录
        Path inputPath = new Path(uri + "/dedup/input");
        // 创建输出目录
        Path outputPath = new Path(uri + "/dedup/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);
        }
    }
}

(五)运行去重驱动器类,查看结果

(1)运行DeduplicateDriver类

在这里插入图片描述

(2)下载并查看文件

1.下载文件
进入mrtxt目录,输入命令:cd /export/mrtxt
下载文件,再输入命令:hdfs dfs -get /dedup/output/part-r-00000
在这里插入图片描述
2.查看文件,输入命令:cat part-r-00000
在这里插入图片描述

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

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

相关文章

最新前端面试总结

介绍 plugin 插件系统是 Webpack 成功的一个关键性因素。在编译的整个生命周期中&#xff0c;Webpack 会触发许多事件钩子&#xff0c;Plugin 可以监听这些事件&#xff0c;根据需求在相应的时间点对打包内容进行定向的修改。 一个最简单的 plugin 是这样的: class Plugin{// …

自动驾驶CarSim和Simulink联合仿真的完美攻略!

作者 | 车路慢慢 仿真秀科普作者 导读&#xff1a;大家好&#xff0c;我叫李慢慢&#xff0c;仿真秀专栏作者&#xff0c;某汽车主机厂汽车仿真工程师&#xff0c;正在筹备转岗。自2020年起&#xff0c;我就在仿真秀App分享ANSA教程和攻略,并学习自动驾驶仿真。 中汽院智能网…

如何通过手机APP在线监控西门子PLC的运行状态

随着工业生产、制造环节的不断神话&#xff0c;工业设备越来越精细复杂&#xff0c;借助PLC实现的自动化控制技术被广泛的应用于工业领域中&#xff0c;具备丰富的应用场景。在物联网和无线通信技术的发展下&#xff0c;越来越多的工业企业系统通过手机APP监控现场PLC的运行状态…

《计算机视觉技术与应用》重点复盘

系列文章目录 《计算机视觉技术与应用》-----第二章 图像处理基础 《计算机视觉技术与应用》-----第三章 图形用户界面 《计算机视觉技术与应用》-----第四章 图像变换 《计算机视觉技术与应用》-----第五章 边缘和轮廓 《计算机视觉技术与应用》-----第六章 边缘和轮廓 …

使用Win32 API 渲染一个标准界面元素

有这么一个Win32 API&#xff0c;名叫 DrawFrameControl&#xff0c;它可以用来在你的自定义控件上渲染一些标准的窗口元素。 下面我们举一个简单的例子来说明。 在下面的例子中&#xff0c;我们会使用这个 API 函数来绘制一个已选择的单选按钮。具体方法是&#xff0c;在我们…

常见面试题(随机)

常问的几个方面 1.MySQL 存储引擎、事务、锁、索引 2.Redis 数据类型、过期策略、淘汰策略、缓存穿透、缓存击穿、缓存雪崩、分布式锁 3. Spring Spring Ioc、Spring AOP、Spring MVC MYSQL 存储引擎 事务 事务的特性 原子性、一致性、隔离性、持久性事务的隔离性并发异常:…

Stm32标准库函数2——多通道ADC DMA

#include "stm32f10x.h" //在该头文件中默认定义系统时钟为72M #include "delay.h" #include "sys.h" #include "usart.h" #include "adc.h" #include "DMA.h" //串口&#xff1a;A9 A10&#xff0c;波特率11…

linux-12月第四周-磁盘存储和文件系统

文章目录管理存储使用磁盘空间过程为什么要磁盘分区划分分区的方式MBR管理存储 使用磁盘空间过程 买来一块新硬盘后&#xff0c;有以下三个使用步骤 第一步&#xff1a;划分分区&#xff08;将硬盘划分为若干个分区&#xff0c;windows上的C盘&#xff0c;D盘&#xff0c;E盘…

SCUT01在线协作白板技术解决方案

在七牛云校园黑客马拉松中&#xff0c;来自华南理工大学的SCUT01团队&#xff0c;为我们带来了UI精美、体验优秀的白板作品&#xff0c;在大赛中获得二等奖的好成绩。以下是这款在线协作白板的技术解决方案。 背景 疫情背景下&#xff0c;线上课堂、线上会议等业务背景下都有着…

PCL 点云配准衡量指标

0. 简介 PCL作为目前最为强大的点云库&#xff0c;内部存在有大量集成好的算法。而对于数据量大、非同源、含大量噪声且部分重叠的激光点云与影像重建点云&#xff0c;其稀疏程度、噪声程度等不同&#xff0c;非重叠区域的面积很大。真实场景的点云尤其是影像重建点云噪声较多…

用javascript分类刷leetcode23.并查集(图文视频讲解)

并查集&#xff08;union & find&#xff09;&#xff1a;用于处理一些元素的合并和查询问题 Find&#xff1a;确定元素属于哪一个子集&#xff0c;他可以被用来确定两个元素是否属于同一个子集&#xff0c;加入路径压缩&#xff0c;复杂度近乎O(1) Union&#xff1a;将两…

如何在 ESXi 7.x 上安装 Windows Server 2019

安装 Windows Server 2019 连接 ESXi 7.0上传 Windows Server 2019 镜像创建虚拟机安装 Windows Server 2019在本文中,我们将逐步在 ESXi 7.x 上安装 Windows Server 2019。 连接 ESXi 7.0 使用 VMware 主机或 vSphere Web 客户端连接到 VMware vSphere Hypervisor 7.0(ESX…

Unity-ROS与话题与服务(二)

0. 简介 对于ROS而言&#xff0c;其最常用的就是Topic话题以及Service两个了。之前我们在了解Unity Robotics Hub时候就了解到基本的Unity和ROS的通讯&#xff0c;下面我们来详细介绍一下Unity与ROS的话题与服务。 ROS和Unity之间的通信是通过Unity的“ROS-TCP-Connector”软…

Linux学习07-vim程序编辑器

1 vi与vim vi 是老式的文书处理器&#xff0c;不过功能已经很齐全了&#xff0c;但是还是有可以进步的地方。 vim 则可以说是程序开发者的一项很好用的工具&#xff0c;就连 vim 的官方网站 &#xff08;http://www.vim.org&#xff09; 自己也说 vim 是一个“程序开发工具”而…

服务器内存CPU负载监控

1&#xff0c;系统平均负载(Load average)&#xff1a; 系统平均负载被定义为在特定时间间隔内运行队列中的平均进程树&#xff0c;一般来说只要每个CPU的当前活动进程数不大于3那么系统的性能就是良好的&#xff0c;如果每个CPU的任务数大于5&#xff0c;那么就表示这台机器的…

SpringBoot+MDC实现链路调用日志

1.首先介绍什么是MDC MDC&#xff08;Mapped Diagnostic Context&#xff0c;映射调试上下文&#xff09;是 log4j 、logback及log4j2 提供的一种方便在多线程条件下记录日志的功能。MDC 可以看成是一个与当前线程绑定的哈希表&#xff0c;可以往其中添加键值对。MDC 中包含的…

毕业设计 STM32自行车智能无线防盗报警器 -物联网 单片机 嵌入式

0 前言 &#x1f525; 这两年开始毕业设计和毕业答辩的要求和难度不断提升&#xff0c;传统的毕设题目缺少创新和亮点&#xff0c;往往达不到毕业答辩的要求&#xff0c;这两年不断有学弟学妹告诉学长自己做的项目系统达不到老师的要求。 为了大家能够顺利以及最少的精力通过…

【C++进阶】C++11新特性下篇(万字详解)

&#x1f387;C学习历程&#xff1a;入门 博客主页&#xff1a;一起去看日落吗持续分享博主的C学习历程博主的能力有限&#xff0c;出现错误希望大家不吝赐教分享给大家一句我很喜欢的话&#xff1a; 也许你现在做的事情&#xff0c;暂时看不到成果&#xff0c;但不要忘记&…

京东前端高频vue面试题(边面边更)

Redux 和 Vuex 有什么区别&#xff0c;它们的共同思想 &#xff08;1&#xff09;Redux 和 Vuex区别 Vuex改进了Redux中的Action和Reducer函数&#xff0c;以mutations变化函数取代Reducer&#xff0c;无需switch&#xff0c;只需在对应的mutation函数里改变state值即可Vuex由…