MR实战:实现数据去重

文章目录

  • 一、实战概述
  • 二、提出任务
  • 三、完成任务
    • (一)准备数据文件
      • 1、在虚拟机上创建文本文件
      • 2、上传文件到HDFS指定目录
    • (二)实现步骤
      • 1、Map阶段实现
        • (1)创建Maven项目
        • (2)添加相关依赖
        • (3)创建日志属性文件
        • (4)创建去重映射器类
      • 2、Reduce阶段实现
        • 创建去重归并器类
      • 3、Driver程序主类实现
        • 创建去重驱动器类
      • 4、运行去重驱动器类,查看结果
  • 四、拓展练习
    • (一)原始问题
    • (二)简单化处理

一、实战概述

  • 本次实战任务目标是使用Hadoop MapReduce技术对两个包含重复数据的文本文件file1.txtfile2.txt进行去重操作,并将结果汇总到一个文件。首先启动Hadoop服务,然后在虚拟机上创建这两个文本文件并上传到HDFS的/dedup/input目录。

  • 在Map阶段,我们创建自定义Mapper类DeduplicateMapper,将TextInputFormat默认组件解析的键值对修改为需要去重的数据作为key,value设为空。在Reduce阶段,我们创建自定义Reducer类DeduplicateReducer,直接复制输入的key作为输出的key,利用MapReduce默认机制对key(即文件中的每行内容)进行自动去重。

  • 我们还编写MapReduce程序运行主类DeduplicateDriver,设置工作任务的相关参数,对HDFS上/dedup/input目录下的源文件进行去重处理,并将结果输出到HDFS的/dedup/output目录。最后,运行DeduplicateDriver类,查看并下载结果文件,确认去重操作成功完成。此实战任务展示如何运用Hadoop MapReduce进行大数据处理和去重操作,提升我们对分布式计算的理解和应用能力。

二、提出任务

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

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

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

三、完成任务

(一)准备数据文件

  • 启动hadoop服务
    在这里插入图片描述

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

  • 创建两个文本文件 - file1.txtfile2.txt
    在这里插入图片描述

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

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

  • 将两个文本文件 file1.txtfile2.txt,上传到HDFS的/dedup/input目录
    在这里插入图片描述

(二)实现步骤

1、Map阶段实现

  • 使用IntelliJ开发工具创建Maven项目Deduplicate,并且新创建net.hw.mr包,在该路径下编写自定义Mapper类DeduplicateMapper,主要用于读取数据集文件将TextInputFormat默认组件解析的类似<0,2022-11-1 a >键值对修改为<2022-11-1 a,null>
(1)创建Maven项目
  • Maven项目 - Deduplicate
    在这里插入图片描述
  • 单击【Finish】按钮
    在这里插入图片描述
(2)添加相关依赖
  • pom.xml文件里添加hadoopjunit依赖
    在这里插入图片描述
<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=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)创建去重映射器类
  • 创建net.hw.mr包,在包里创建DeduplicateMapper
    在这里插入图片描述
package net.hw.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年11月30日*/
public class DeduplicateMapper extends Mapper<LongWritable, Text, Text, NullWritable> {private static Text field = new Text();// <0,2022-11-3 c> --> <2022-11-3 c,null>@Overrideprotected void map(LongWritable key, Text value, Context context) throws IOException, InterruptedException {field = value;context.write(field, NullWritable.get());}
}

2、Reduce阶段实现

  • 根据Map阶段的输出结果形式,同样在net.hw.mr包下,自定义Reducer类DeduplicateReducer,主要用于接受Map阶段传递来的数据,根据Shuffle工作原理,键值key相同的数据就会被合并,因此输出数据就不会出现重复数据了。
创建去重归并器类
  • net.hw.mr包里创建DeduplicateReducer
    在这里插入图片描述
package net.hw.mr;import org.apache.hadoop.io.NullWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Reducer;import java.io.IOException;/*** 功能:去重归并器类* 作者:华卫* 日期:2022年11月30日*/
public class DeduplicateReducer extends Reducer<Text, NullWritable, Text, NullWritable> {// <2022-11-3 c,null> <2022-11-4 d,null><2022-11-4 d,null>@Overrideprotected void reduce(Text key, Iterable<NullWritable> values, Context context)throws IOException, InterruptedException {context.write(key, NullWritable.get());}
}

3、Driver程序主类实现

  • 编写MapReduce程序运行主类DeduplicateDriver,主要用于设置MapReduce工作任务的相关参数,对HDFS上/dedup/input目录下的源文件实现去重,并将结果输入到HDFS的/dedup/output目录下。
创建去重驱动器类
  • net.hw.mr包里创建DeduplicateDriver
    在这里插入图片描述
package net.hw.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年11月30日*/
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);}}
}

4、运行去重驱动器类,查看结果

  • 运行DeduplicateDriver
    在这里插入图片描述
    在这里插入图片描述
  • 下载结果文件 - part-r-00000
    在这里插入图片描述
  • 查看结果文件 - part-r-00000
    在这里插入图片描述

四、拓展练习

  • 形式:单独完成
  • 题目:实现数据去重
  • 要求:让学生自己按照步骤实现数据去重的功能,以此来巩固本节的学习内容。写一篇CSDN博客,记录操作过程。

(一)原始问题

  • 某人今天访问很多不同的网站,移动或电信日志都会记录在案,有些网站访问次数多,有些网站访问次数少,此人,今天访问了多少个不同的网站?

(二)简单化处理

  • 假如有如下一些IP地址,分别保存在三个文件里,如何去掉重复地址?
  • ips01.txt
192.168.234.21
192.168.234.22
192.168.234.21
192.168.234.21
192.168.234.23
192.168.234.21
192.168.234.21
192.168.234.21
  • ips02.txt
192.168.234.25
192.168.234.21
192.168.234.21
192.168.234.26
192.168.234.21
192.168.234.27
192.168.234.21
192.168.234.27
192.168.234.21
  • ips03.txt
192.168.234.29
192.168.234.21
192.168.234.26
192.168.234.21
192.168.234.25
192.168.234.25
192.168.234.21
192.168.234.22
192.168.234.21

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

java使用JSON工具解析字符串、数组详解

一&#xff1a;问题 1.最近自己在前后端数据交互时需要进行JSON格式字符串、数组数据进行转换&#xff0c;进行问题整理 2.遇到需要JSON字符串转换的朋友可以阅读 二&#xff1a;解析步骤 1.第一点首先确定需求&#xff0c;明确需要转的字符串是一个对象还是一个数组&#…

边缘计算网关:重新定义物联网数据处理

随着物联网&#xff08;IoT&#xff09;设备的爆炸式增长&#xff0c;数据处理和分析的需求也在迅速增加。传统的数据处理方式&#xff0c;将所有数据传输到中心服务器进行处理&#xff0c;不仅增加了网络负担&#xff0c;还可能导致数据延迟和安全问题。因此&#xff0c;边缘计…

电气产品外壳常用材质PA、PC、PBT、ABS究竟是什么?

在如今工业制造领域&#xff0c;各种改性塑料、复合材料以及轻质合金材料的运用日趋成熟。在电气领域&#xff0c;不同电气产品的外壳、组件材质采用不同材料&#xff0c;以同为科技&#xff08;TOWE&#xff09;电气产品为例&#xff0c;工业连接器系列产品采用PA6外壳材质、机…

小米电脑管家 - 手机平板电脑家居互联

系列文章目录 前言 联想电脑安装小米电脑管家实现设备互联 如图&#xff0c;将 小米平板 5 Pro 作为联想笔记本 GeekPro 5000 &#xff08;这垃圾电脑&#xff09;的副屏。 可以在小米平板控制笔记本&#xff0c;如图所示 一、官方使用手册 参考&#xff1a;小米电脑管家帮助 …

浅谈高并发以及三大利器:缓存、限流和降级

引言 高并发背景 互联网行业迅速发展&#xff0c;用户量剧增&#xff0c;系统面临巨大的并发请求压力。 软件系统有三个追求&#xff1a;高性能、高并发、高可用&#xff0c;俗称三高。三者既有区别也有联系&#xff0c;门门道道很多&#xff0c;全面讨论需要三天三夜&#…

交叉编译aarch64架构支持openssl的curl、libcurl

本文档旨在指导读者在x86_64平台上交叉编译curl和openssl库以支持aarch64架构。在开始之前&#xff0c;请确保您的系统环境已正确配置。 1. 系统环境准备 系统是基于Ubuntu 20.04 LTS&#xff0c;高版本可能会有问题。首页&#xff0c;安装必要的开发工具和库文件。打开终端并…

楼宇对讲门铃选型分析

目前很多的高层住宅都使用了对讲门铃了&#xff0c;在频繁使用中&#xff0c;门铃会出现的越来越多种类&#xff0c;下面我就简单的介绍会有用到的几款芯片. 语音通话芯片&#xff1a;D34018,D34118,D5020,D31101; D34018 单片电话机通话电路&#xff0c;合并了必 需的放大器…

【CSS3】第5章 盒子模型

学习目标 熟悉盒子模型的概念&#xff0c;能够说出盒子模型的基本结构。 掌握<div>标签的用法&#xff0c;能够使用<div>标签制作页面模块。 掌握边框属性的用法&#xff0c;能够为盒子设置不同的边框效果。 掌握边距属性的用法&#xff0c;能够使用内边距和外边…

thingsboard前端缓存--nginx

thingsboardnginx thingsboard部署到阿里云服务器之后&#xff0c;由于登录界面要发送的文件很大&#xff0c;并且服务器的带宽目前有限&#xff0c;因此配置一个nginx&#xff0c;进行前端页面的一些缓存&#xff0c;参考了https://qianchenzhumeng.github.io/posts/Nginx%E5…

Junit在多线程测试时的坑

Junit单元测试主线程退出&#xff0c;子线程也会退出 Testpublic void test() throws InterruptedException {Thread t1 new Thread(() -> {try {TimeUnit.SECONDS.sleep(5);} catch (InterruptedException e) {throw new RuntimeException(e);}System.out.println(Thread.…

网站提示“不安全”怎么解决

在互联网中&#xff0c;安全问题至关重要。访问某些网站时&#xff0c;可能会遇到“不安全”警告&#xff0c;通常是由于缺乏SSL证书。SSL证书是数字证书&#xff0c;用于确保互联网通信的安全和保密。 “不安全”问题通常源于缺少SSL证书。SSL通过加密通信&#xff0c;防止第三…

软件测试/测试开发丨Selenium环境安装配置

一、selenium 环境配置 1、下载浏览器 目前比较常用的浏览器是 Google Chrome 浏览器&#xff0c;所以本教程以 chrome 为主&#xff0c;后面简介一下其他浏览器的环境配置。 chrome 下载: www.google.cn/chrome/ 2、chromedriver 环境配置 chromedriver 是chromedriver提…