Hadoop-11-MapReduce JOIN 操作的Java实现 Driver Mapper Reducer具体实现逻辑 模拟SQL进行联表操作

章节内容

上一节我们完成了:

  • MapReduce的介绍
  • Hadoop序列化介绍
  • Mapper编写规范
  • Reducer编写规范
  • Driver编写规范
  • WordCount功能开发
  • WordCount本地测试

背景介绍

这里是三台公网云服务器,每台 2C4G,搭建一个Hadoop的学习环境,供我学习。
之前已经在 VM 虚拟机上搭建过一次,但是没留下笔记,这次趁着前几天薅羊毛的3台机器,赶紧尝试在公网上搭建体验一下。

注意,如果你和我一样,打算用公网部署,那一定要做好防火墙策略,避免不必要的麻烦!!!
请大家都以学习为目的,也请不要对我的服务进行嗅探或者攻击!!!

但是有一台公网服务器我还运行着别的服务,比如前几天发的:autodl-keeper 自己写的小工具,防止AutoDL机器过期的。还跑着别的Web服务,所以只能挤出一台 2C2G 的机器。那我的配置如下了:

  • 2C4G 编号 h121
  • 2C4G 编号 h122
  • 2C2G 编号 h123

在这里插入图片描述

业务需求

平常我们在业务上,有很多时候表都是分开的,通过一些 id 或者 code 来进行关联。
在大数据的情况下,也有很多这种情况,我们需要进行联表操作。

表1

项目编码projectCode 项目名projectName

表2

项目编码projectCode 项目类型projectType 项目分类projectFrom

SQL 中,可以通过 LEFT JOIN 来实现字段补齐。大数据下,也需要进行这样的操作,我们需要借助 MapReduce

表1测试

"8aea9ba2-435c-48bd-9751-1cbd4c344d4e"	"社区项目1"
"02d9c090-e467-42b6-9c14-52cacd72a4a8"	"社区项目2"
"244dcaca-0778-4eec-b3a2-403f8fac1dfb"	"智慧社区"
"94befb97-d1af-43f2-b5d5-6df9ce5b9393"	"公交站点"
"f44c8d10-bc92-4398-ad9b-8c11dd48ad7c"	"街道布建"
"2e556d83-bb56-45b1-8d6e-00510902c464"	"街道公交站点"
"3ba00542-eac9-4399-9c2b-3b06e671f4c9"	"未命名项目1"
"5a5982d7-7257-422f-822a-a0c2f31c28d1"	"未命名项目2"

表2测试

"8aea9ba2-435c-48bd-9751-1cbd4c344d4e"	"重要类型"	"种类1"
"02d9c090-e467-42b6-9c14-52cacd72a4a8"	"重要类型"	"种类1"
"244dcaca-0778-4eec-b3a2-403f8fac1dfb"	"重要类型"	"种类1"
"94befb97-d1af-43f2-b5d5-6df9ce5b9393"	"普通类型"	"种类1"
"f44c8d10-bc92-4398-ad9b-8c11dd48ad7c"	"普通类型"	"种类2"
"2e556d83-bb56-45b1-8d6e-00510902c464"	"普通类型"	"种类2"
"3ba00542-eac9-4399-9c2b-3b06e671f4c9"	"一般类型"	"种类2"
"5a5982d7-7257-422f-822a-a0c2f31c28d1"	"一般类型"	"种类2"

SQL连表

假设我们使用SQL的方式联表:

SELECT*
FROMt_project
LEFT JOINt_project_info
ONt_project.projectCode=t_project_info.projectCode

Reduce JOIN

有时候,表可能过大,无法支持我们使用 SQL 进行连表查询。
这里我们编写一个程序来完成操作。

ProjectBean

这里是最终的Bean类,里边是两个表把字段补齐的结果,一会儿我们将使用这个类进行表的连接。

package icu.wzk.demo03;import org.apache.hadoop.io.Writable;import java.io.DataInput;
import java.io.DataOutput;
import java.io.IOException;public class ProjectBean implements Writable {private String projectCode;private String projectName;private String projectType;private String projectFrom;private String flag;@Overridepublic void write(DataOutput dataOutput) throws IOException {dataOutput.writeUTF(projectCode);dataOutput.writeUTF(projectName);dataOutput.writeUTF(projectType);dataOutput.writeUTF(projectFrom);dataOutput.writeUTF(flag);}@Overridepublic void readFields(DataInput dataInput) throws IOException {this.projectCode = dataInput.readUTF();this.projectName = dataInput.readUTF();this.projectType = dataInput.readUTF();this.projectFrom = dataInput.readUTF();this.flag = dataInput.readUTF();}public ProjectBean(String projectCode, String projectName, String projectType, String projectFrom, String flag) {this.projectCode = projectCode;this.projectName = projectName;this.projectType = projectType;this.projectFrom = projectFrom;this.flag = flag;}public ProjectBean() {}@Overridepublic String toString() {return "ProjectBean{" +"projectCode='" + projectCode + '\'' +", projectName='" + projectName + '\'' +", projectType='" + projectType + '\'' +", projectFrom='" + projectFrom + '\'' +", flag=" + flag + '\'' +'}';}public String getProjectCode() {return projectCode;}public void setProjectCode(String projectCode) {this.projectCode = projectCode;}public String getProjectName() {return projectName;}public void setProjectName(String projectName) {this.projectName = projectName;}public String getProjectType() {return projectType;}public void setProjectType(String projectType) {this.projectType = projectType;}public String getProjectFrom() {return projectFrom;}public void setProjectFrom(String projectFrom) {this.projectFrom = projectFrom;}public String getFlag() {return flag;}public void setFlag(String flag) {this.flag = flag;}
}

Reduce Driver

package icu.wzk.demo03;import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.Path;
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.io.IOException;public class ReducerJoinDriver {public static void main(String[] args) throws IOException, InterruptedException, ClassNotFoundException {// String inputPath = args[0];// String outputPath = args[1];// === 测试环境 ===String inputPath = "project_test";String outputPath = "project_test_output";// === ===Configuration configuration = new Configuration();Job job = Job.getInstance(configuration, "ReducerJoinDriver");job.setJarByClass(ReducerJoinDriver.class);job.setMapperClass(ReducerJoinMapper.class);job.setReducerClass(ReducerJoinReducer.class);job.setMapOutputKeyClass(Text.class);job.setMapOutputValueClass(ProjectBean.class);job.setOutputKeyClass(ProjectBean.class);job.setOutputValueClass(NullWritable.class);FileInputFormat.setInputPaths(job, new Path(inputPath));FileOutputFormat.setOutputPath(job, new Path(outputPath));boolean result = job.waitForCompletion(true);System.exit(result ? 0 : 1);}}

ReduceMapper

package icu.wzk.demo03;import org.apache.hadoop.io.LongWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Mapper;import java.io.IOException;public class ReducerJoinMapper extends Mapper<LongWritable, Text, Text, ProjectBean> {String name;ProjectBean projectBean = new ProjectBean();Text k = new Text();@Overrideprotected void setup(Mapper<LongWritable, Text, Text, ProjectBean>.Context context) throws IOException, InterruptedException {// 获取路径信息name = context.getInputSplit().toString();}@Overrideprotected void map(LongWritable key, Text value, Mapper<LongWritable, Text, Text, ProjectBean>.Context context) throws IOException, InterruptedException {String line = value.toString();if (name.contains("layout_project")) {// layout_projectString[] fields = line.split("\t");projectBean.setProjectCode(fields[0]);projectBean.setProjectName(fields[1]);projectBean.setProjectType("");projectBean.setProjectFrom("");projectBean.setFlag("layout_project");// projectCode 关联k.set(fields[0]);} else {// project_infoString[] fields = line.split("\t");projectBean.setProjectCode(fields[0]);projectBean.setProjectName("");projectBean.setProjectType(fields[1]);projectBean.setProjectFrom(fields[2]);projectBean.setFlag("project_info");// projectCode 关联k.set(fields[0]);}context.write(k, projectBean);}
}

ReduceReducer

package icu.wzk.demo03;import org.apache.hadoop.io.NullWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Reducer;import java.io.IOException;
import java.util.ArrayList;
import java.util.List;public class ReducerJoinReducer extends Reducer<Text, ProjectBean, ProjectBean, NullWritable> {@Overrideprotected void reduce(Text key, Iterable<ProjectBean> values, Reducer<Text, ProjectBean, ProjectBean, NullWritable>.Context context) throws IOException, InterruptedException {List<ProjectBean> dataList = new ArrayList<>();ProjectBean deviceProjectBean = new ProjectBean();for (ProjectBean pb : values) {if ("layout_project".equals(pb.getFlag())) {// layout_projectProjectBean projectProjectBean = new ProjectBean(pb.getProjectCode(),pb.getProjectName(),pb.getProjectType(),pb.getProjectFrom(),pb.getFlag());dataList.add(projectProjectBean);} else {// project_infodeviceProjectBean = new ProjectBean(pb.getProjectCode(),pb.getProjectName(),pb.getProjectType(),pb.getProjectFrom(),pb.getFlag());}}for (ProjectBean pb : dataList) {pb.setProjectType(deviceProjectBean.getProjectType());pb.setProjectFrom(deviceProjectBean.getProjectFrom());context.write(pb, NullWritable.get());}}
}

运行结果

ProjectBean{projectCode='"02d9c090-e467-42b6-9c14-52cacd72a4a8"', projectName='"社区项目2"', projectType='"重要类型"', projectFrom='"种类1"', flag=layout_project'}
ProjectBean{projectCode='"244dcaca-0778-4eec-b3a2-403f8fac1dfb"', projectName='"智慧社区"', projectType='"重要类型"', projectFrom='"种类1"', flag=layout_project'}
ProjectBean{projectCode='"2e556d83-bb56-45b1-8d6e-00510902c464"', projectName='"街道公交站点"', projectType='"普通类型"', projectFrom='"种类2"', flag=layout_project'}
ProjectBean{projectCode='"3ba00542-eac9-4399-9c2b-3b06e671f4c9"', projectName='"未命名项目1"', projectType='"一般类型"', projectFrom='"种类2"', flag=layout_project'}
ProjectBean{projectCode='"5a5982d7-7257-422f-822a-a0c2f31c28d1"', projectName='"未命名项目2"', projectType='"一般类型"', projectFrom='"种类2"', flag=layout_project'}
ProjectBean{projectCode='"8aea9ba2-435c-48bd-9751-1cbd4c344d4e"', projectName='"社区项目1"', projectType='"重要类型"', projectFrom='"种类1"', flag=layout_project'}
ProjectBean{projectCode='"94befb97-d1af-43f2-b5d5-6df9ce5b9393"', projectName='"公交站点"', projectType='"普通类型"', projectFrom='"种类1"', flag=layout_project'}
ProjectBean{projectCode='"f44c8d10-bc92-4398-ad9b-8c11dd48ad7c"', projectName='"街道布建"', projectType='"普通类型"', projectFrom='"种类2"', flag=layout_project'}

在这里插入图片描述

方案缺点

JOIN 操作是在 reduce 阶段完成的,reduce端处理压力过大map节点的运算负载很低,资源利用不高

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

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

相关文章

文件扫描pdf怎么弄?5个简易高效的文件扫描方法

在繁忙的工作中&#xff0c;我们常常需要将纸质文件快速转换为电子文档&#xff0c;以便于编辑、存储或分享。 无论是合同、报告还是笔记&#xff0c;将这些纸质文件转换为Word格式&#xff0c;不仅能提高工作效率&#xff0c;还能确保信息的安全备份。然而&#xff0c;面对市…

前端领域创作者纪念日:回顾与展望

引言 在2048天前&#xff0c;我加入了CSDN。本文将带您回顾前端技术的发展历程&#xff0c;探索前端创作者的贡献&#xff0c;并展望未来的发展方向。 前端技术的发展历程 前端技术的发展可以追溯到互联网的早期时代。最初的网页主要是静态的HTML文档&#xff0c;内容简单&…

57、Flink 的项目配置概述

1&#xff09;概览 1.开始 要开始使用 Flink 应用程序&#xff0c;请使用以下命令、脚本和模板来创建 Flink 项目。 可以使用如下的 Maven 命令或快速启动脚本&#xff0c;基于原型创建一个项目。 a&#xff09;Maven 命令 mvn archetype:generate \-Darch…

开源大模型的中流砥柱——LLaMA

元宇宙平台公司在近年来大力发展人工智能技术,尤其在大规模语言模型(LLM)领域取得了显著进展。其代表性作品LLaMA(Large Language Model)及其后续版本LLaMA 2和LLaMA 3,成为了业界关注的焦点。 LLaMA模型的发布与许可 LLaMA模型的发布标志着在自然语言处理(NLP)领域的…

使用 Spring Security 配置 HTTPS

引言 为了保护敏感数据免受网络攻击&#xff0c;在 Web 应用中使用 HTTPS 是必不可少的。HTTPS 提供了数据传输的加密&#xff0c;确保数据在客户端和服务器之间传输时的安全性。Spring Security 提供了简单的配置方式来实现 HTTPS。本文将详细介绍如何在 Spring Boot 项目中配…

wordpress建站用付费模板还是免费模板

在WordPress建站时&#xff0c;选择模板是一个重要的决策。我们可以看到免费和付费模板各有优缺点。 免费模板的主要优点是成本效益。对于预算有限的个人或小企业来说&#xff0c;免费模板是一个理想的选择&#xff0c;因为它们不需要任何费用。此外&#xff0c;免费模板通常与…

Redis 7.x 系列【16】持久化机制之 AOF

有道无术&#xff0c;术尚可求&#xff0c;有术无道&#xff0c;止于术。 本系列Redis 版本 7.2.5 源码地址&#xff1a;https://gitee.com/pearl-organization/study-redis-demo 文章目录 1. 概述2. 执行原理2.1 Redis 6.x2.1.1 直接写2.1.2 重写 2.2 Redis 7.x2.2.1 Redis 6…

Spring Ioc学习

第二章 Spring IOC 章节内容 Spring IOC技术实现Spring IOC设值注入Spring IOC构造注入 章节目标 掌握Spring IOC技术实现掌握Spring IOC设置注入掌握Spring IOC构造注入 第一节 Spring简介 1. Spring 简介 Spring 是目前主流的 Java 开发框架&#xff0c;是 Java 世界最…

基于Springboot+Vue+mysql仓库管理系统仓库进销存管理系统

博主介绍&#xff1a; 大家好&#xff0c;本人精通Java、Python、C#、C、C编程语言&#xff0c;同时也熟练掌握微信小程序、Php和Android等技术&#xff0c;能够为大家提供全方位的技术支持和交流。 我有丰富的成品Java、Python、C#毕设项目经验&#xff0c;能够为学生提供各类…

Vue 父子页面使用指南

Vue3父子页面使用指南 Vue3作为一种现代化的前端框架&#xff0c;提供了强大的组件化功能&#xff0c;使得页面开发更加模块化和可维护。本文将深入探讨Vue3中父子页面的使用方法&#xff0c;包括如何传递参数、父组件如何调用子组件的方法&#xff0c;以及父子页面的加载原理…

为什么面向对象的设计方法逐渐减少

在软件开发领域&#xff0c;面向对象设计&#xff08;Object-Oriented Design, OOD&#xff09;曾经是主导的编程范式。它的主要特征是通过类和对象来组织代码&#xff0c;并利用继承、封装和多态性等特性来实现代码复用和模块化。然而&#xff0c;近年来&#xff0c;随着前端开…

【Python】Python中的数据类型

数据类型 导读一、数据类型的分类1.1 Number&#xff08;数字&#xff09;1.1.1 静态数据类型1.1.2 动态数据类型 1.2 String&#xff08;字符串&#xff09;1.3 bool&#xff08;布尔类型&#xff09; 二、数据类型的转换2.1 隐式类型转换2.2 显式类型转换2.2.1 int(x[,base])…

系统运维面试总结(shell编程)

SYNDDOS攻击&#xff0c;需要判断这个访问是正常访问还是信包攻击&#xff0c;当前这个信包发起的访问数量是多少&#xff0c;例如看到30个信包同时再访问时设置监控报警。 一般选用/dev/urandom生成&#xff0c;但其生成的随机数带有二进制乱码&#xff0c;所以需要tr命令…

光源基础知识及选型原则

光的基础知识 1.光谱(专业理解):光能量在不同频率上的分布。 2.可见光的波段在380mm—700mm之间。红光波长最长,为700mm左右,紫光波长最短,在380mm左右。 3.色温(以白色为界):光源的颜色与黑体在某一温度下辐射光的颜色相同(或最相近)时,黑体的温度就称为该光源…

CASS中按指定距离和方向移动图形

1、绘制一个图形 打开软件&#xff0c;随意绘制一个矩形&#xff0c;并量取左下角点的坐标值&#xff0c;具体如下&#xff1a; 2、按距离移动原理讲解 例1&#xff1a;将图形沿着y轴负方向移动100米&#xff0c;如何实现&#xff1f; 如上图所示&#xff0c;测绘中的坐标系…

多载波调制与OFDM原理讲解以及MATLAB实现GUI设计

前言 基于MATLAB设计并实现了一个OFDM调制的图形用户界面&#xff08;GUI&#xff09;系统。该系统旨在简化OFDM调制过程的仿真&#xff0c;提供友好的用户交互界面。设计目标是通过GUI实现参数化的OFDM仿真&#xff0c;包括子载波数、符号数、IFFT长度、循环前缀长度、循环后…

模拟退火算法2—优缺点

模拟退火算法优点 1、以一定的概率接受恶化解 模拟退火算法(SA)在搜索策略上与传统的随机搜索方法不同,它不仅引入了适当的随机因素,而且还引入了物理系统退火过程的自然机理。这种自然机理的引入使模拟退火算法在迭代过程中不仅接受使目标函数变“好”的试探点,而且还能以一…

【单片机毕业设计选题24034】-基于STM32的手机智能充电系统

系统功能: 系统可以设置充电时长&#xff0c;启动充电后按设置的充电时长充电&#xff0c;充电时间到后自动 停止充电&#xff0c;中途检测到温度过高也会结束充电并开启风扇和蜂鸣器报警。 系统上电后&#xff0c;OLED显示“欢迎使用智能充电系统请稍后”&#xff0c;两秒钟…

Python错误处理 -- 异常捕获

本套课在线学习视频&#xff08;网盘地址&#xff0c;保存到网盘即可免费观看&#xff09;&#xff1a; ​​https://pan.quark.cn/s/ebe046289eb0​​ 本文详细介绍了Python编程中try-except-else-finally语句的用法&#xff0c;重点讲解了如何通过这些语句对程序中可能出现…

哨兵1SAR空间数据包协议数据单元文档(五)

《哨兵1SAR空间数据包协议数据单元》文档对数据包的结构进行了详细描述&#xff0c;并提供了用户数据的格式和解码算法。 原文链接: 哨兵1SAR空间数据包协议数据单元文档英文版 同系列中的其他文章篇链接: 哨兵1SAR空间数据包协议数据单元文档&#xff08;一&#xff09; 哨兵1…