MR实战:网址去重

文章目录

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

一、实战概述

  • 本实战项目主要利用Hadoop MapReduce框架对多个文本文件中的IP地址进行整合并去除重复项。首先,在虚拟机上创建了三个包含IP地址列表的文本文件(ips01.txt、ips02.txt、ips03.txt),并将这些文件上传至HDFS上的/deduplicate/input目录作为原始数据。

  • 接着,通过IntelliJ IDEA创建了一个Maven项目MRDeduplicateIPs,并添加了hadoop-client和junit相关依赖。在项目中定义了三个关键类:DeduplicateIPsMapper、DeduplicateIPsReducer和DeduplicateIPsDriver。

  • DeduplicateIPsMapper类作为Map阶段的处理单元,读取每行输入文本数据(表示一个IP地址),将IP地址作为新的键输出,并使用NullWritable类型的空值,以准备后续去重操作。

  • DeduplicateIPsReducer类则负责Reduce阶段的逻辑,它接收Mapper阶段输出的所有具有相同IP地址的键值对,并通过不遍历值迭代器的方式实现键(即IP地址)的去重,确保每个唯一IP地址仅被写入一次。

  • 最后,DeduplicateIPsDriver类作为整个任务的驱动程序,负责配置和启动MapReduce作业。它设置了作业的输入与输出路径、Mapper和Reducer类,以及它们的键值类型。作业完成后,该类会遍历输出目录下的文件,读取并打印去重后的IP地址列表到控制台。

  • 通过运行DeduplicateIPsDriver类启动应用,最终实现了从多个文本文件中提取并整合出一份仅包含唯一IP地址的结果集。

二、提出任务

  • 三个包含IP地址列表的文本文件(ips01.txt、ips02.txt、ips03.txt)
  • ips01.txt
192.168.1.1
172.16.0.1
10.0.0.1
192.168.1.2
192.168.1.3
172.16.0.2
10.0.0.2
192.168.1.1
172.16.0.1
10.0.0.3
  • ips02.txt
192.168.1.4
172.16.0.3
10.0.0.4
192.168.1.5
192.168.2.1
172.16.0.4
10.0.1.1
192.168.1.1
172.16.0.1 
10.0.0.1 
  • ips03.txt
192.168.1.6
172.16.1.1
10.0.2.1
192.168.1.7
192.168.3.1
172.16.0.5
10.0.0.5
192.168.1.1
172.16.0.1
10.0.0.3
  • 使用MR框架,实现网址去重
    在这里插入图片描述

三、完成任务

(一)准备数据

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

  • 在master虚拟机上使用文本编辑器创建三个文件:ips01.txt, ips02.txt, ips03.txt,并确保每个文件内存储的是纯文本格式的IP地址列表。
    在这里插入图片描述

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

  • 在master虚拟机上创建HDFS上的/deduplicate/input目录,用于存放待处理的原始数据文件。
  • 执行命令:hdfs dfs -mkdir -p /deduplicate/input
    在这里插入图片描述
  • 将本地创建的三个文本文件上传至HDFS的/deduplicate/input目录
    hdfs dfs -put ips01.txt /deduplicate/input/
    hdfs dfs -put ips02.txt /deduplicate/input/
    hdfs dfs -put ips03.txt /deduplicate/input/
    
  • 执行上述命令
    在这里插入图片描述

(二)实现步骤

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

1、创建Maven项目

  • Maven项目 - MRDeduplicateIPs,设置了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/deduplicateips.log
log4j.appender.logfile.layout=org.apache.log4j.PatternLayout
log4j.appender.logfile.layout.ConversionPattern=%d %p [%c] - %m%n

4、创建网址去重映射器类

  • 创建net.huawei.mr包,在包里创建DeduplicateIPsMapper
    在这里插入图片描述
package net.huawei.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;/*** 功能:网址去重映射器类* 作者:华卫* 日期:2024年01月05日*/
public class DeduplicateIPsMapper extends Mapper<LongWritable, Text, Text, NullWritable> {@Overrideprotected void map(LongWritable key, Text value, Context context) throws IOException, InterruptedException {// 获取行内容String ip = value.toString();// 将<ip,null>键值对写入中间结果context.write(new Text(ip), NullWritable.get());}
}
  • 这段代码是Hadoop MapReduce编程框架中的一个Mapper类实现,名为DeduplicateIPsMapper,用于处理URL去重问题。虽然注释中提到的是“网址去重”,但实际代码逻辑仅针对IP地址进行操作。

  • 在Map阶段,该类继承自org.apache.hadoop.mapreduce.Mapper<LongWritable, Text, Text, NullWritable>

  • 输入键类型为LongWritable,通常表示文本行号;

  • 输入值类型为Text,存储一行原始数据(在这里应是IP地址);

  • 输出键类型为Text,用于输出去重后的IP地址;

  • 输出值类型为NullWritable,由于此处仅需去重并不需要具体值,所以使用空值。

  • map()方法是Mapper的主体逻辑部分,在每次调用时接收一行输入数据(键和值)。它首先将输入值(即每行文本内容)转换成字符串类型的IP地址,然后将这个IP地址作为新的键输出,并与NullWritable类型的空值一起写入到中间结果中。通过这种方式,Map阶段结束后,相同的IP地址会被归并到一起,以便后续Reducer阶段进一步处理以达到去重的目的。

5、创建网址去重归并器类

  • net.huawei.mr包里创建DeduplicateIPsReducer
    在这里插入图片描述
package net.huawei.mr;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 DeduplicateIPsReducer extends Reducer<Text, NullWritable, Text, NullWritable> {@Overrideprotected void reduce(Text key, Iterable<NullWritable> values, Context context) throws IOException, InterruptedException {// 不遍历值迭代器,就可以实现键去重context.write(key, NullWritable.get());        }
}
  • 这段代码是Hadoop MapReduce编程框架中的一个Reducer类实现,名为DeduplicateIPsReducer,用于处理URL去重问题。尽管注释中提到的是“网址去重”,但实际代码逻辑只针对IP地址进行操作。

  • 在Reduce阶段,该类继承自org.apache.hadoop.mapreduce.Reducer<Text, NullWritable, Text, NullWritable>

  • 输入键类型为Text,存储Map阶段输出的去重后的IP地址;

  • 输入值类型为Iterable<NullWritable>,由于Mapper阶段输出的值为NullWritable,因此这里接收一组空值;

  • 输出键类型仍为Text,保持与Mapper阶段一致,输出去重后的唯一IP地址;

  • 输出值类型也仍为NullWritable,表示在这个任务中我们仅关注IP地址的去重,不需要额外信息。

  • reduce()方法是Reducer的核心逻辑部分,在此场景下,当多个相同的IP地址(键)被归并到一起时,无需遍历值迭代器(因为所有值都是NullWritable的空值),只需将接收到的每个唯一的IP地址作为键输出即可,从而达到去除重复IP的目的。通过这种方式,Reduce阶段结束后,输出结果中每个IP地址都只出现一次。

6、创建网址去重统计驱动器类

  • net.huawei.mr包里,创建DeduplicateIPsDriver
    在这里插入图片描述
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.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 DeduplicateIPsDriver {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(DeduplicateIPsDriver.class);// 设置Mapper类job.setMapperClass(DeduplicateIPsMapper.class);// 设置map任务输出键类型job.setMapOutputKeyClass(Text.class);// 设置map任务输出值类型job.setMapOutputValueClass(NullWritable.class);// 设置Reducer类job.setReducerClass(DeduplicateIPsReducer.class);// 设置reduce任务输出键类型job.setOutputKeyClass(Text.class);// 设置reduce任务输出值类型job.setOutputValueClass(NullWritable.class);// 定义uri字符串String uri = "hdfs://master:9000";// 创建输入目录Path inputPath = new Path(uri + "/deduplicate/input");// 创建输出目录Path outputPath = new Path(uri + "/deduplicate/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);}}
}
  • 这段代码是Hadoop MapReduce框架下的一个驱动器类(Driver)实现,名为DeduplicateIPsDriver,用于处理URL去重问题。它主要负责设置MapReduce作业的相关配置信息,并启动整个作业流程。
  1. 首先创建一个Hadoop Configuration对象并设置相关属性,如“dfs.client.use.datanode.hostname”,以便正确连接到HDFS数据节点。

  2. 初始化Job实例,并通过job.setJarByClass()方法指定作业的主类(即该驱动器类),使得Hadoop能够找到运行作业所需的JAR包。

  3. 设置作业的Mapper和Reducer类分别为DeduplicateIPsMapperDeduplicateIPsReducer,同时设定它们的输入输出键值类型。

  4. 定义HDFS上输入与输出目录的URI路径,并使用FileSystem API获取文件系统实例,删除预先存在的输出目录以确保每次运行时结果都是新的。

  5. 将输入目录添加到作业中,设置唯一的输出目录。

  6. 调用job.waitForCompletion(true)方法启动并等待作业完成。

  7. 作业完成后,遍历输出目录下的所有文件(除成功标志文件外),打开每个文件并将其内容读取并打印到控制台,从而展示去重后的结果。

  • 总之,此驱动器类将配置、初始化及执行一个完整的MapReduce作业,该作业的主要功能是对存储在HDFS上的IP地址进行去重处理。

7、启动应用,查看结果

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

四、实战总结

  • 本实战项目利用Hadoop MapReduce框架,通过自定义的DeduplicateIPsMapper和DeduplicateIPsReducer类处理三个文本文件中的IP地址数据。Mapper阶段读取每行IP并作为键输出,Reducer阶段对相同键(IP)进行归并去重。在DeduplicateIPsDriver驱动类中配置了作业属性、输入输出路径以及Map和Reduce阶段所使用的类,并成功执行了任务。最终,从原始文本数据中提取出一份不重复的IP地址集合。整个过程展示了MapReduce框架高效处理大规模数据集及实现特定业务逻辑的能力。

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

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

相关文章

第三部分使用脚手架:vue学习(61-65)

文章目录 61 创建vue脚手架![在这里插入图片描述](https://img-blog.csdnimg.cn/direct/f71d4324be0542209e690ab9e886d199.png)62 分析脚手架结构63 render函数64 修改默认配置65 ref 属性 61 创建vue脚手架 写完vue文件&#xff0c;没有脚手架做翻译&#xff0c;浏览器不认识…

[C#]winform部署PaddleDetection的yolo印章检测模型

【官方框架地址】 https://github.com/PaddlePaddle/PaddleDetection.git 【算法介绍】 PaddleDetection 是一个基于 PaddlePaddle&#xff08;飞桨&#xff09;深度学习框架的开源目标检测工具库。它提供了一系列先进的目标检测算法&#xff0c;包括但不限于 Faster R-CNN, …

单片机快速入门

参考连接&#xff1a; 安装MinGW-64&#xff08;在win10上搭建C/C开发环境&#xff09;https://zhuanlan.zhihu.com/p/85429160MinGW-64; 链接&#xff1a;https://pan.baidu.com/s/1oE1FmjyK7aJPnDC8vASmCg?pwdy1mz 提取码&#xff1a;y1mz --来自百度网盘超级会员V7的分享C…

centos7部署minio单机版

一、目标 在centos7上部署minio单机版 二、centos7部署minio 1、下载minio mkdir /usr/local/minio cd /usr/local/minio wget https://dl.minio.io/server/minio/release/linux-amd64/minio chmod x minio 2、新建minio存储数据的目录 mkdir -p /data/minio/data3、新建…

Kotlin/JS工程构建及编译运行到浏览器

概述 Kotlin/JS 提供了转换 Kotlin 代码、Kotlin 标准库的能力&#xff0c;并且兼容 JavaScript 的任何依赖项。Kotlin/JS 的当前实现以 ES5 为目标。 使用 Kotlin/JS 的推荐方法是通过 kotlin.multiplatform Gradle 插件。它提供了一种集中且便捷的方式来设置与控制以 JavaS…

pod 基础 2

pod 进阶 探针 poststart prestop pod的生命周期开始&#xff1a; 重启&#xff1a;k8s的pod重启策略 deployment的yaml文件只能是Always pod的yaml三种模式都可以。 OnFailure&#xff1a;只有状态码非0才会重启&#xff0c;正常退出是不重启的 Never&#xff1a;正常退…

【C语言刷题每日一题#牛客网BC107】矩阵转置

目录 问题描述 思路逐步分析 完整代码实现 结果测试 问题描述 思路逐步分析 首先&#xff0c;根据输入的描述&#xff0c;第一行输入的是两个整数n和m&#xff0c;分别表示一个矩阵&#xff08;二维数组&#xff09;的行和列&#xff0c;并且行和列不超过10 根据要求&…

【Java并发】深入浅出 synchronized关键词原理-下

上一篇文章&#xff0c;简要介绍了syn的基本用法和monter对象的结构&#xff0c;本篇主要深入理解&#xff0c;偏向锁、轻量级锁、重量级锁的本质。 对象内存布局 Hotspot虚拟机中&#xff0c;对象在内存中存储的布局可以分为三块区域:对象头(Header)、实例数据 (Instance Da…

两步带你解决IDEA 插件下载安装慢、超时、不成功问题

两步带你解决IDEA 插件下载安装慢、超时、不成功问题 1. 查找 国内插件的节点IP地址2. 修改本地hosts文件 > 今天在安装idea中的插件时&#xff0c;又双叒叕出现了这个问题&#xff0c;下载一个几MB的插件巨慢&#xff0c;所以写一下它的解决方案 1. 查找 国内插件的节点IP地…

深入理解Java中资源加载的方法及Spring的ResourceLoader应用

在Java开发中&#xff0c;资源加载是一个基础而重要的操作。本文将深入探讨Java中两种常见的资源加载方式&#xff1a;ClassLoader的getResource方法和Class的getResource方法&#xff0c;并介绍Spring框架中的ResourceLoader的应用。 1. 资源加载的两种方式 1.1 ClassLoader…

【代码随想录】刷题笔记Day45

前言 早上又赖了会床......早睡早起是奢望了现在&#xff0c;新一年不能这样&#xff01;支棱起来&#xff01; 377. 组合总和 Ⅳ - 力扣&#xff08;LeetCode&#xff09; 这一题用的就是完全背包排列数的遍历顺序&#xff1a;先背包再物品&#xff0c;从前往后求的也是有几…

kali-Linux安装ARL灯塔教程以及timeout of 20000ms exceeded 的解决方法

FLAG&#xff1a;别和妈妈诉苦&#xff0c;她帮不上&#xff0c;也睡不着。 专研方向: docker&#xff0c;ARL资产灯塔系统 每日emo&#xff1a;天冷了&#xff0c;你还在坚持吗&#xff1f; 欢迎各位与我这个菜鸟交流学习 kali安装ARL灯塔教程 1.安装docker环境&#xff0c;…