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

这篇具有很好参考价值的文章主要介绍了Hadoop学习:深入解析MapReduce的大数据魔力(三)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

3.5 MapReduce 内核源码解析

3.5.1 MapTask 工作机制

Hadoop学习:深入解析MapReduce的大数据魔力(三),Hadoop学习指南,大数据,hadoop,学习
(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 工作机制

Hadoop学习:深入解析MapReduce的大数据魔力(三),Hadoop学习指南,大数据,hadoop,学习
(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)实验结论:
Hadoop学习:深入解析MapReduce的大数据魔力(三),Hadoop学习指南,大数据,hadoop,学习
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)输入数据
Hadoop学习:深入解析MapReduce的大数据魔力(三),Hadoop学习指南,大数据,hadoop,学习
(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。文章来源地址https://www.toymoban.com/news/detail-656739.html

到了这里,关于Hadoop学习:深入解析MapReduce的大数据魔力(三)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Hadoop MapReduce解析

    Hadoop MapReduce是一个用于处理大量数据的编程模型和一个相应的实现框架。MapReduce作业通常分为两个阶段:Map阶段和Reduce阶段。 Map阶段 在Map阶段,你编写的Map函数会对输入数据进行处理。每个输入数据片段(例如一行文本)都会被Map函数处理,并产生中间键值对。 以单词计数

    2024年04月14日
    浏览(31)
  • 云计算中的大数据处理:尝试HDFS和MapReduce的应用

    在实验开始之前我们需要在虚拟机里面启动HDFS,进入到Hadoop安装目录里面的sbin目录里面执行 start-all.sh 命令即可启动成功,然后使用 jps 查看全部节点是否已经启动了,在昨天的做题的时候我在最开始上传文件到hdfs 的时候报错: could only be written to 0 of the 1 minReplication nodes,

    2024年02月09日
    浏览(62)
  • 大数据面试高频题目 - 深入解析 Hadoop:探索强大的HDFS存储系统

    在大数据面试中,深刻理解 Hadoop 是取得成功的关键之一。以下是一些关于 Hadoop 的HDFS存储系统的高频面试题目以及解答思路和经验分享: 发起下载请求: 客户端创建分布式文件系统,向 NameNode 请求下载  user/warehouse/ss.avi  文件; 获取文件元数据:NameNode 返回目标文件的元

    2024年03月18日
    浏览(48)
  • Hadoop3.0大数据处理学习3(MapReduce原理分析、日志归集、序列化机制、Yarn资源调度器)

    前言:如果想知道一堆牌中有多少张红桃,直接的方式是一张张的检查,并数出有多少张红桃。 而MapReduce的方法是,给所有的节点分配这堆牌,让每个节点计算自己手中有几张是红桃,然后将这个数汇总,得到结果。 官方介绍:MapReduce是一种分布式计算模型,由Google提出,

    2024年02月08日
    浏览(55)
  • hadoop学习:mapreduce的wordcount时候,继承mapper没有对应的mapreduce的包

    踩坑描述:在学习 hadoop 的时候使用hadoop 下的 mapreduce,却发现没有 mapreduce。 第一反应就是去看看 maven 的路径对不对 settings——》搜索框搜索 maven  检查一下 Maven 路径对不对 OK 这里是对的 那么是不是依赖下载失败导致 mapreduce 没下下来 去本地仓库里去看看(上图最后一行就

    2024年02月11日
    浏览(43)
  • 深入探索Apache ZooKeeper:关键技术学习与实践指南

    Apache ZooKeeper,作为一款广受认可的分布式协调服务,为大型分布式系统提供了强大的数据一致性、服务注册与发现、分布式锁、配置管理等基础服务。本文将深入剖析ZooKeeper的技术内核,梳理其关键学习点,并结合实践场景给出学习与应用建议,帮助读者全方位掌握这一重要

    2024年04月28日
    浏览(42)
  • hadoop学习:mapreduce入门案例二:统计学生成绩

    这里相较于 wordcount,新的知识点在于学生实体类的编写以及使用 数据信息: 1. Student 实体类 2.  mapper 阶段,StudentMapper 类 3. reduce 阶段,StudentReduce 类 4. 驱动类,studentDriver 类

    2024年02月11日
    浏览(44)
  • 大数据开发之Hadoop(MapReduce)

    MapReduce是一个分布式运算程序的编程框架,是用户开发“基于Hadoop的数据分析应用”的核心框架。 MapReduce核心功能是将用户编写的业务逻辑代码和自带默认组件整合成一个完整的分布式运算程序,并发运行在一个Hadoop集群上。 1.2.1 优点 1、MapReduce易于编程 它简单的实现一些

    2024年01月22日
    浏览(48)
  • 第三节 Hadoop学习案例——MapReduce课程设计 好友推荐功能

    提示:文章内容主要以案例为主 目录 前言 项目说明 一,程序需求 1.需求 2.数据 二,编码操作 1.项目建包目录 2.FriendsRecommend.java  3.FriendsRecommendMapper.java 4.FriendsRecommendReduce.java 三,Xshell运行的步骤 1.创建目录 2.上传程序  3.分布式文件系统上传测试数据  4.执行程序 5. 查看结

    2024年02月07日
    浏览(52)
  • hadoop学习:mapreduce入门案例四:partitioner 和 combiner

    先简单介绍一下partitioner 和 combiner  Partitioner类 用于在Map端对key进行分区 默认使用的是HashPartitioner 获取key的哈希值 使用key的哈希值对Reduce任务数求模 决定每条记录应该送到哪个Reducer处理 自定义Partitioner 继承抽象类Partitioner,重写getPartition方法 job.setPartitionerClass(MyPartitione

    2024年02月10日
    浏览(51)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包