Hadoop核心之MapReduce框架总结Ⅱ

3.1 InputFormat数据输入

3.1.1 切片与MapTask并行度决定机制

   MapTask的并行度决定Map阶段的任务处理并发度,进而影响到整个Job的处理速度。

MapTask并行度决定机制

   数据块:Block是HDFS物理上把数据分成一块一块。数据块是HDFS存储数据单位。

   数据切片:数据切片只是在逻辑上对输入进行分片,并不会在磁盘上将其切分成片进行存储。数据切片是MapReduce程序计算输入数据的单位,🔔一个切片会对应启动一个MapTask

在这里插入图片描述

3.1.2 FileInputFormat切片机制

在这里插入图片描述

Job提交流程源码如下:

   job的提交是在Driver里面,调用 waitForCompletion()进行提交的,具体的提交流程如下:
在这里插入图片描述

	waitForCompletion()

	submit();

	// 1建立连接
	connect();	
		// 1)创建提交Job的代理
		new Cluster(getConfiguration());
			// (1)判断是本地运行环境还是yarn集群运行环境
			initialize(jobTrackAddr, conf); 

	// 2 提交job
	submitter.submitJobInternal(Job.this, cluster)

	// 1)创建给集群提交数据的Stag路径
	Path jobStagingArea = JobSubmissionFiles.getStagingDir(cluster, conf);

	// 2)获取jobid ,并创建Job路径
	JobID jobId = submitClient.getNewJobID();

	// 3)拷贝jar包到集群
	copyAndConfigureFiles(job, submitJobDir);	
	rUploader.uploadFiles(job, jobSubmitDir);

	// 4)计算切片,生成切片规划文件
	writeSplits(job, submitJobDir);
		maps = writeNewSplits(job, jobSubmitDir);
		input.getSplits(job);

	// 5)向Stag路径写XML配置文件
	writeConf(conf, submitJobFile);
	conf.writeXml(out);

	// 6)提交Job,返回提交状态
	status = submitClient.submitJob(jobId, submitJobDir.toString(), 		job.getCredentials());

切片参数的配置如下:

在这里插入图片描述

FileInputFormat常见的接口实现类包括:

TextInputFormat、KeyValueTextInputFormat、NLineInputFormat、CombineTextInputFormat和自定义InputFormat等。

TextInputFormat

    TextInputFormat是默认的FileInputFormat实现类。按行读取每条记录。键是存储该行在整个文件中的起始字节偏移量, LongWritable类型。值是这行的内容,不包括任何行终止符(换行符和回车符),Text类型,以WordCount为例,实现如下:

在这里插入图片描述

3.1.3 CombineTextInputFormat切片机制

应用场景:
    CombineTextInputFormat用于小文件过多的场景,它可以将多个小文件从逻辑上规划到一个切片中,这样,多个小文件就可以交给一个MapTask处理。

虚拟存储切片最大值设置:
    CombineTextInputFormat.setMaxInputSplitSize(job, 4194304);// 4m
注意:虚拟存储切片最大值设置最好根据实际的小文件大小情况来设置具体的值。

切片机制
生成切片过程包括:虚拟存储过程和切片过程二部分。

++++++++++++|细读以下图片体会切片过程|++++++++++++
在这里插入图片描述

具体实现:
此处使用的还是入门案例:计算单词数量(我将实现程序放到文末)
在这里插入图片描述

3.2 MapReduce工作流程

Map阶段:
在这里插入图片描述

对以上实现的步骤解释如下:
(1)首先就是待处理的文本文件(data)包括文件的所在路径和名称,文件大小等信息
(2)客户端进行job.submit前,获取待处理数据的信息,根据配置参数形成任务分配规划(进行逻辑上的切片…)
(3)将切片信息,xml文件,程序提交给Yarn
(4)Yarn根据提交的信息启动MrAppmaster,并且根据切片个数创建对应的MapTask,
(5)之后就是数据输入阶段,InputFormat去读取到数据信息,然后返回给我们自己编写的map方法(业务逻辑),执行完毕之后,作用域就将处理的结果进进行写出
(6)接下来就来到了一个环形缓冲区,也就是Shuffle过程:

①MapTask收集我们的map()方法输出的kv对,放到内存缓冲区中
②从内存缓冲区不断溢出本地磁盘文件,可能会溢出多个文件
③多个溢出文件会被合并成大的溢出文件
④在溢出过程及合并的过程中,都要调用Partitioner进行分区和针对key进行排序
⑤ReduceTask根据自己的分区号,去各个MapTask机器上取相应的结果分区数据
⑥ReduceTask会抓取到同一个分区的来自不同MapTask的结果文件,ReduceTask会将这些文件再进行合并(归并排序)
⑦合并成大文件后,Shuffle的过程也就结束了,后面进入ReduceTask的逻辑运算过程(从文件中取出一个一个的键值对Group,调用用户自定义的reduce()方法)

在这里插入图片描述

Reduce阶段:
在这里插入图片描述

Rducer阶段:
(1)首先将处理好的数据下载到本地磁盘(临时存储)
(2)将下载的文件进行合并,按照归并排序方法合并
(3)进入到我们编写的Reduce方法,执行操作后写出

3.3 Shuffle机制

Map方法之后,Reduce方法之前的数据处理过程称之为Shuffle。

3.3.1Shuffle机制流程

Shuffle机制具体流程:

在这里插入图片描述

3.3.2Partition分区

    分区的原因:我们需要按照不同的条件将数据【data】分到不同的文件中(分区),例如:将手机号按照归属地进行分区

默认分区:是根据key的hash值对reduceTask个数求余来进行分区

在这里插入图片描述
还可以自定义类继承Partitioner来实现分区;

在这里插入图片描述
在Driver里面设置ReduceTask个数:
在这里插入图片描述
分区运行后的结果:

在这里插入图片描述

+++++++++由于字数限制,我将案例放在另外一篇博客中++++++++

分区总结:
(1)如果ReduceTask的数 量> getPartition(分区)的结果数,则会多产生几个空的输出文-par-00zx;
(2)如果1 <ReduceTask的数量<getPatition的结果数,则有一部分 分区数据无处安放,会Exception;
(3)如果ReduceTask的数量=1,则不管M apTask端输出多少个分区文件,最终结果都交给这一个ReduceTask,最终也就只会产生一个结果文件pat-r-0000;
(4)分区号必须从零开始,逐一累加。

3.3.3 WritableComparable排序

    MapTask和Reduce Task均会对数据按照key进行排序。该操作属于Hadoop的默认行为。任何应用程序中的数据均会被排序,而不管逻辑上是否需要。

默认的排序方法是按照字典顺序进行排序,且实现该排序方法最快的是使用快速排序

    对于MapTask,它会将处理的结果暂时放到环形缓冲区中,当环形缓冲区使用率达到一定阈值后,再对缓冲区中的数据进行一次快速排序,并将这些有序数据溢写到磁盘上,而当数据处理完毕后,它会对磁盘上所有文件进行归并排序

    对于ReduceTask,它从每个MapTask上远程拷贝相应的数据文件,如果文件大小超过一定阈值,则溢写磁盘上,否则存储在内存中。如果磁盘上文件数目达到-定阈值,则进行一次归并排序以生成一 个更大文件;如果内存中文件大小或者数目超过一定阈值,则进行次合并后将数据溢写到磁盘上。当所有数据拷贝完数目超过一定阈值,则进行次合并后将数据溢写到磁盘上。当所有数据拷贝结束后,ReduceTask统一对内存和磁盘.上的所有数据进行一-次归并排序

自定义排序WritableComparable原理分析
    bean对象做为key传输,需要实现WritableComparable接口重写compareTo方法,就可以实现排序

在这里插入图片描述

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

皮皮皮皮皮皮皮卡乒

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值