Hadoop学习:深入解析MapReduce的大数据魔力(三)

news2025/1/22 20:58:31

Hadoop学习:深入解析MapReduce的大数据魔力(三)

  • 3.5 MapReduce 内核源码解析
    • 3.5.1 MapTask 工作机制
    • 3.5.2 ReduceTask 工作机制
    • 3.5.3 ReduceTask 并行度决定机制
  • 3.6 数据清洗(ETL)
    • 1)需求
    • 2)需求分析
    • 3)实现代码
  • 3.7 MapReduce 开发总结
    • 1)输入数据接口:InputFormat
    • 2)逻辑处理接口:Mapper
    • 3)Partitioner 分区
    • 4)Comparable 排序
    • 5)Combiner 合并
    • 6)逻辑处理接口:Reducer
    • 7)输出数据接口:OutputFormat

3.5 MapReduce 内核源码解析

3.5.1 MapTask 工作机制

在这里插入图片描述
(1)Read阶段:MapTask通过InputFormat获得的RecordReader,从输入InputSplit中解析出一个个key/value。

(2)Map阶段:该节点主要是将解析出的key/value交给用户编写map()函数处理,并产生一系列新的key/value。

(3)Collect 收集阶段:在用户编写 map()函数中,当数据处理完成后,一般会调用OutputCollector.collect()输出结果。在该函数内部,它会将生成的 key/value 分区(调用Partitioner),并写入一个环形内存缓冲区中。

(4)Spill 阶段:即“溢写”,当环形缓冲区满后,MapReduce会将数据写到本地磁盘上,生成一个临时文件。需要注意的是,将数据写入本地磁盘之前,先要对数据进行一次本地排序,并在必要时对数据进行合并、压缩等操作。

溢写阶段详情:
步骤1:利用快速排序算法对缓存区内的数据进行排序,排序方式是,先按照分区编号Partition 进行排序,然后按照key进行排序。这样,经过排序后,数据以分区为单位聚集在一起,且同一分区内所有数据按照key有序。

步骤2:按照分区编号由小到大依次将每个分区中的数据写入任务工作目录下的临时文件output/spillN.out(N 表示当前溢写次数)中。如果用户设置了 Combiner,则写入文件之前,对每个分区中的数据进行一次聚集操作。

步骤3:将分区数据的元信息写到内存索引数据结构SpillRecord中,其中每个分区的元信息包括在临时文件中的偏移量、压缩前数据大小和压缩后数据大小。如果当前内存索引大小超过1MB,则将内存索引写到文件output/spillN.out.index中。

(5)Merge 阶段:当所有数据处理完成后,MapTask 对所有临时文件进行一次合并,以确保最终只会生成一个数据文件。 当所有数据处理完后,MapTask 会将所有临时文件合并成一个大文件,并保存到文件output/file.out 中,同时生成相应的索引文件output/file.out.index。 在进行文件合并过程中,MapTask以分区为单位进行合并。对于某个分区,它将采用多轮递归合并的方式。每轮合并mapreduce.task.io.sort.factor(默认 10)个文件,并将产生的文件重新加入待合并列表中,对文件排序后,重复以上过程,直到最终得到一个大文件。
让每个 MapTask 最终只生成一个数据文件,可避免同时打开大量文件和同时读取大量小文件产生的随机读取带来的开销。

3.5.2 ReduceTask 工作机制

在这里插入图片描述
(1)Copy 阶段:ReduceTask 从各个 MapTask 上远程拷贝一片数据,并针对某一片数据,如果其大小超过一定阈值,则写到磁盘上,否则直接放到内存中。

(2)Sort 阶段:在远程拷贝数据的同时,ReduceTask启动了两个后台线程对内存和磁盘上的文件进行合并,以防止内存使用过多或磁盘上文件过多。按照MapReduce语义,用户编写reduce()函数输入数据是按key进行聚集的一组数据。为了将key相同的数据聚在一
起,Hadoop采用了基于排序的策略。由于各个MapTask已经实现对自己的处理结果进行了局部排序,因此,ReduceTask只需对所有数据进行一次归并排序即可。

(3)Reduce 阶段:reduce()函数将计算结果写到HDFS上。

3.5.3 ReduceTask 并行度决定机制

回顾:MapTask并行度由切片个数决定,切片个数由输入文件和切片规则决定。

思考:ReduceTask并行度由谁决定?

1)设置ReduceTask并行度(个数)
ReduceTask 的并行度同样影响整个 Job 的执行并发度和执行效率,但与MapTask的并发数由切片数决定不同,ReduceTask数量的决定是可以直接手动设置:

// 默认值是1,手动设置为4
job.setNumReduceTasks(4);

2)实验:测试ReduceTask多少合适
(1)实验环境:1个Master节点,16个Slave节点:CPU:8GHZ,内存: 2G
(2)实验结论:
在这里插入图片描述
3)注意事项
(1)ReduceTask=0,表示没有Reduce阶段,输出文件个数和Map个数一致。
(2)ReduceTask默认值就是1,所以输出文件个数为一个。
(3)如果数据分布不均匀,就有可能在Reduce阶段产生数据倾斜
(4)ReduceTask数量并不是任意设置,还要考虑业务逻辑需求,有些情况下,需要计算全局汇总结果,就只能有1个ReduceTask。
(5)具体多少个ReduceTask,需要根据集群性能而定。
(6)如果分区数不是1,但是ReduceTask为1,是否执行分区过程。答案是:不执行分区过程。因为在MapTask的源码中,执行分区的前提是先判断ReduceNum个数是否大于1。不大于1肯定不执行。

3.6 数据清洗(ETL)

“ETL,是英文 Extract-Transform-Load 的缩写,用来描述将数据从来源端经过抽取
(Extract)、转换(Transform)、加载(Load)至目的端的过程。ETL一词较常用在数据仓库,但其对象并不限于数据仓库

在运行核心业务MapReduce 程序之前,往往要先对数据进行清洗,清理掉不符合用户要求的数据。==清理的过程往往只需要运行Mapper程序,不需要运行Reduce程序。 ==

1)需求

去除日志中字段个数小于等于11的日志。
(1)输入数据
在这里插入图片描述
(2)期望输出数据
每行字段长度都大于11。

2)需求分析

需要在Map阶段对输入的数据根据规则进行过滤清洗。

3)实现代码

(1)编写WebLogMapper类

package com.atguigu.mapreduce.weblog; 
import java.io.IOException; 
import org.apache.hadoop.io.LongWritable; 
import org.apache.hadoop.io.NullWritable; 
import org.apache.hadoop.io.Text; 
import org.apache.hadoop.mapreduce.Mapper; 
 
public class WebLogMapper extends Mapper<LongWritable, Text, Text, 
NullWritable>{ 
  
 @Override 
 protected void map(LongWritable key, Text value, Context context) 
throws IOException, InterruptedException { 
   
  // 1 获取1行数据 
  String line = value.toString(); 
   
  // 2 解析日志 
  boolean result = parseLog(line,context); 
   
  // 3 日志不合法退出 
  if (!result) { 
   return; 
  } 
   
  // 4 日志合法就直接写出 
  context.write(value, NullWritable.get()); 
 } 
 
 // 2 封装解析日志的方法 
 private boolean parseLog(String line, Context context) { 
 
  // 1 截取 
  String[] fields = line.split(" "); 
   
  // 2 日志长度大于11的为合法 
  if (fields.length > 11) { 
   return true; 
  }else { 
   return false; 
  } 
 } 
} 

(2)编写WebLogDriver类

package com.atguigu.mapreduce.weblog; 
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; 
public class WebLogDriver { 
public static void main(String[] args) throws Exception { 
// 输入输出路径需要根据自己电脑上实际的输入输出路径设置 
args = new String[] { "D:/input/inputlog", "D:/output1" }; 
// 1 获取job信息 
Configuration conf = new Configuration(); 
Job job = Job.getInstance(conf); 
// 2 加载jar包 
job.setJarByClass(LogDriver.class); 
// 3 关联map 
job.setMapperClass(WebLogMapper.class); 
// 4 设置最终输出类型 
job.setOutputKeyClass(Text.class); 
job.setOutputValueClass(NullWritable.class); 
// 设置reducetask个数为0 
job.setNumReduceTasks(0); 
// 5 设置输入和输出路径 
FileInputFormat.setInputPaths(job, new Path(args[0])); 
FileOutputFormat.setOutputPath(job, new Path(args[1])); 
// 6 提交 
boolean b = job.waitForCompletion(true); 
System.exit(b ? 0 : 1); 
} 
} 

3.7 MapReduce 开发总结

1)输入数据接口:InputFormat

(1)默认使用的实现类是:TextInputFormat
(2)TextInputFormat 的功能逻辑是:一次读一行文本,然后将该行的起始偏移量作为key,行内容作为value返回。
(3)CombineTextInputFormat 可以把多个小文件合并成一个切片处理,提高处理效率。

2)逻辑处理接口:Mapper

用户根据业务需求实现其中三个方法:map() setup() cleanup ()

3)Partitioner 分区

(1)有默认实现 HashPartitioner,逻辑是根据key的哈希值和numReduces来返回一个分区号;key.hashCode()&Integer.MAXVALUE % numReduces
(2)如果业务上有特别的需求,可以自定义分区。

4)Comparable 排序

(1)当我们用自定义的对象作为key来输出时,就必须要实现WritableComparable 接口,重写其中的compareTo()方法。

(2)部分排序:对最终输出的每一个文件进行内部排序。

(3)全排序:对所有数据进行排序,通常只有一个Reduce。

(4)二次排序:排序的条件有两个。

5)Combiner 合并

Combiner 合并可以提高程序执行效率,减少IO传输。但是使用时必须不能影响原有的
业务处理结果。

6)逻辑处理接口:Reducer

用户根据业务需求实现其中三个方法:reduce() setup() cleanup ()

7)输出数据接口:OutputFormat

(1)默认实现类是TextOutputFormat,功能逻辑是:将每一个KV对,向目标文本文件
输出一行。
(2)用户还可以自定义OutputFormat。

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

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

相关文章

一起创建Vue脚手架吧

目录 一、安装Vue CLI1.1 配置 npm 淘宝镜像1.2 全局安装1.3 验证是否成功 二、创建vue_test项目2.1 cmd进入桌面2.2 创建项目2.3 运行项目2.4 查看效果 三、脚手架结构分析3.1 文件目录结构分析3.2 vscode终端打开项目 一、安装Vue CLI CLI&#xff1a;command-line interface…

(搜索) 剑指 Offer 13. 机器人的运动范围 ——【Leetcode每日一题】

❓剑指 Offer 13. 机器人的运动范围 难度&#xff1a;中等 地上有一个 m 行 n 列的方格&#xff0c;从坐标 [0,0] 到坐标 [m-1,n-1] 。一个机器人从坐标 [0, 0] 的格子开始移动&#xff0c;它每次可以向左、右、上、下移动一格&#xff08;不能移动到方格外&#xff09;&…

基于 SpringBoot+Vue 的家政服务管理平台(附源码,数据库,教程)

文章目录 1. 背景2.主要技术3. 可行性分析4.系统设计5系统的详细设计与实现5.1前台模块设计5.2后台功能模块 源码下载地址 1. 背景 本系统主要是设计出家政服务管理平台&#xff0c;基于B/S构架&#xff0c;后台数据库采用了Mysql&#xff0c;可以使数据的查询和存储变得更加有…

宏工科技十五周年,“归零心态”竞逐全球

长久以来&#xff0c;物料处理领域一直处于被大型跨国企业垄断&#xff0c;或是国内厂商野蛮生长的状态&#xff0c;宏工科技在15年发展中&#xff0c;通过培育自身的技术创新与自主研发能力&#xff0c;在物料处理领域突围&#xff0c;实现跨行业发展、规模化扩张和持续增长。…

HCIP VLAN实验

VLAN实验 拓扑图配置和分析分析配置LSW1LSW2R1 测试dhcp获取ipICMP测试 拓扑图 配置和分析 分析 从题目来看&#xff0c;因为 pc 1 3都是vlan2而且还是不同网段&#xff0c;pc 2 4 5 6在同一网段&#xff0c;所以可以将pc 1 2 5 4 6分在一个网段 pc4不通5 6 &#xff0c;那就…

【LVS】2、部署LVS-DR群集

LVS-DR数据包的流向分析 1.客户端发送请求到负载均衡器&#xff0c;请求的数据报文到达内核空间&#xff1b; 2.负载均衡服务器和正式服务器在同一个网络中&#xff0c;数据通过二层数据链路层来传输&#xff1b; 3.内核空间判断数据包的目标IP是本机VIP&#xff0c;此时IP虚…

嵌入式Linux开发实操(九):CAN接口开发

前言: CAN网络在汽车中的使用可以说相当广泛。而CAN网络需要的收发器最常用的就是NXP 的TJA1042: CAN网络:

【Docker】docker搭建Ftp服务器,真香

Docker搭建Ftp服务器&#xff0c;真香 1.搜索镜像2.进行下载3.启动docker4.访问5.兼容问题 方便公司正常内网传递大文件&#xff0c;FTP服务就派上用场了&#xff0c;ftp分为主动模式&#xff08;PORT&#xff09;和被动模式(PASV)。主动模式使用20和21端口&#xff0c;其中20为…

CL3闭环步进驱动器CL3-EC808AC

雷赛_交流伺服_步进_闭环步进_混合伺服_电机 安装图&#xff1a; 电流&#xff1a; 0.1A 0x2000-0030; // 单位 0.1A 一般用3A调试【30】 一圈脉冲&#xff1a; 0x2001-00 // 导程5mm 用50000 开环模式&#xff1a;0x2024-00 // 0开环 2闭环…

搞懂大模型的智能基因,RLHF系统设计关键问答

搞懂大模型的智能基因&#xff0c;RLHF系统设计关键问答 搞懂大模型的智能基因&#xff0c;RLHF系统设计关键问答1.RLHF是什么&#xff1f;2.RLHF适用于哪些任务&#xff1f;3 .RLHF和其他构建奖励模型的方法相比有何优劣&#xff1f;4 .什么样的人类反馈才是好的反馈5.RLHF算法…

算法通关村——位运算

1. 常见的位运算 1.1 与 & &&#xff1a;两个数对应的位都是1&#xff0c;那么结果才是1 1 & 1 1 1 & 0 0; 0 & 0 0; 1.2 或 | |: 只要两个数对应的位有一个1&#xff0c;结果就是1 1 | 1 1; 1 | 0 1; 0 | 0 0; 1.3 异或^ ^: 只有两个数的位都…

基于Python的微博大数据舆情分析,舆论情感分析可视化系统,可作为Python毕业设计

运行效果图 基于Python的微博大数据舆情分析&#xff0c;舆论情感分析可视化系统 系统介绍 微博舆情分析系统&#xff0c;项目后端分爬虫模块、数据分析模块、数据存储模块、业务逻辑模块组成。 先后进行了数据获取和筛选存储&#xff0c;对存储后的数据库数据进行提取分析处…

如何用轻叶H5制作一份调查问卷

在营销落地页中&#xff0c;问卷类H5是一种制作简单&#xff0c;易于传播的落地页&#xff0c;通过精巧的设计和严密的逻辑设置&#xff0c;问卷类H5的投放效果也是不容小觑的。 问卷类H5在制作中有以下不可缺少的要素&#xff1a; 清晰的标题和简要的说明 标题应该简明扼要地…

Web3 游戏七月洞察:迈向主流采用的临界点?

作者: lesleyfootprint.network 2023 年 7 月&#xff0c;Web3 游戏领域出现了小幅增长&#xff0c;但对于许多项目来说&#xff0c;用户采用仍然是一个持续的挑战。根据 Footprint Analytics 的数据&#xff0c;活跃的区块链游戏数量略有增加&#xff0c;达到 2,471 个。然而…

第三方支付

1、请求学习中心服务创建选课记录 2、请求订单服务创建商品订单、生成支付二维码。 3、用户扫码请求订单支付服务&#xff0c;订单支付服务请求第三方支付平台生成支付订单。 4、前端唤起支付客户端&#xff0c;用户输入密码完成支付。 5、第三方支付平台支付完成发起支付通…

基于国产安路FPGA的数据采集传输子系统设计

分 布 式 数 据 采 集 系 统 的 结 构 如 图 &#xff12; &#xff0e; &#xff11; 所示 &#xff0c; 主 要 有 传 感 器 网 络 、 数 据 采 集 传 输 子 系 统 、 数 据 汇 聚 平 台 、 数 据 采 集 系 统 控 制 终 端 等 部 分 。 &am…

【JavaEE进阶】MyBatis的创建及使用

文章目录 一. MyBatis简介二. MyBatis 使用1. 数据库和数据表的创建2. 创建Mybatis项目2.1 添加MyBatis框架支持2.2 设置MyBatis配置信息 3. MyBatis开发流程4. MyBatis查询数据库测试 三. MyBatis 流程1. MyBatis 查询数据库流程2. MyBatis 框架交互流程图 一. MyBatis简介 M…

最新k8s集群搭建教程

本次安装在vmware虚拟机下开启3台2核2g的Ubuntu20.04系统 master&#xff1a;192.168.192.137 node1&#xff1a;192.168.192.136 node2&#xff1a;192.168.192.138 关闭防火墙 先查看防火墙状态&#xff0c;如果是关闭就不用管 ufw status关闭selinux&#xff0c;如果没有安…

【sgDragSize】自定义拖拽修改DIV尺寸组件,适用于窗体大小调整

核心原理就是在四条边、四个顶点加上透明的div&#xff0c;给不同方向提供按下移动鼠标监听 &#xff0c;对应计算宽度高度、坐标变化 特性&#xff1a; 支持设置拖拽的最小宽度、最小高度、最大宽度、最大高度可以双击某一条边&#xff0c;最大化对应方向的尺寸&#xff1b;再…

Atlas 元数据管理

Atlas 元数据管理 1.Atlas入门 1.1概述 元数据原理和治理功能&#xff0c;用以构建数据资产的目录。对这个资产进行分类和管理&#xff0c;形成数据字典。 提供围绕数据资产的协作功能。 表和表之间的血缘依赖 字段和字段之间的血缘依赖 1.2架构图 导入和导出&#xff1…