IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 大数据 -> 【Hadoop】——MapReduce:InputFormat -> 正文阅读

[大数据]【Hadoop】——MapReduce:InputFormat

一、切片与MapTask并行度决定机制

1. 数据块

Blocak是HDFS物理上把数据分为一块一块的,数据块是HDFS存储数据的单位

2. 数据切片

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

3. 说明

<1>一个Job的Map阶段并行度由客户端在提交Job时的切片数决定
<2>每一个Split切片分配一个MapTask并行实例处理
<3>默认情况下,切片大小=BlockSize
<4>切片时不考虑数据集整体,而是逐个针对每一个文件单独切片

二、Job提交流程源码和切片源码

1. Job提交流程源码详解

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());

在这里插入图片描述

2. 切片源码详解

<1>先找到数据存储目录

在这里插入图片描述

<2>遍历目录下的每一个文件

在这里插入图片描述

<3>切片

  1. 获取文件大小fs.size(ss.txt)
    在这里插入图片描述
  2. 计算切片
    默认情况下,切片大小等于BlockSize
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
  3. 开始切片,每次切片时,都要判断切完剩下的部分是否大于块的1.1倍,不大于1.1倍就划分为一个块切片。
    在这里插入图片描述
  4. 将切片信息写道一个切片规划文件中
    在这里插入图片描述
  5. 整个切片的核心过程在getSplit()方法中完成
  6. InputSplit只记录了切片的元数据信息,比如起始位置,长度以及所在节点列表等

<4>提交切片规划文件到YARN

YARN上的MrAppMaster就根据切片规划文件计算开启MapTask个数

三、FileInputFormat切片大小参数配置

1. 源码切片大小计算

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

2. 切片大小设置

在这里插入图片描述

3. 获取切片信息API

在这里插入图片描述

四、TextInputFormat

  1. 是FileInputFormat的默认实现类
  2. 按照行读取每条记录
  3. key是整个文件的起始字节偏移量,LongWritable类型,value是这行的内容,不包括任何终止符(换行符,回车符),Text类型
    在这里插入图片描述

五、CombineTextInputFormat

1. 继承关系

在这里插入图片描述

2. 应用场景

默认TextInputFormat切片机制是对任务按文件规划切片,不管文件多小,都会是一个单独切片,都会交给一个MapTask,这样如果有大量小文件,就会产生大量MapTask,效率变低
因此,CombineTextFormat适合用于小文件过多的场景,它可以将多个小文件从逻辑上规划到一个切片中,这样,多个小文件就可以交给一个MapTask处理

3. 虚拟存储切片最大值设置

在这里插入图片描述

4. 虚拟存储过程

在这里插入图片描述

5. 切片机制

<1>判单虚拟存储的文件大小是否大于setMaxInputSplitSize值,大于等于则单独形成一个切片
<2>如果不大于则更下一个虚拟存储文件进行合并,共同形成一个切片。
在这里插入图片描述

六、 CombineTextInputFormat案例

1. 准备四个文件,并修改输入路径

采用之前的wordCount案例,可查看之前的博客
在这里插入图片描述

2. 在不修改的情况下,运行结果

采用TextInputFormat分片方式,分为了四个切片,调用了四个MapTask
在这里插入图片描述

3. 在WordCountDriver中添加以下代码

添加代码

//设置InputFormat 实现类为CombineTextInputFormat ,如果不设置则默认是TextInputFormat.calss
job.setInputFormatClass(CombineTextInputFormat.class);
//设置虚拟存储切片的最大值,4194304 = 4M  20971520=20M
CombineTextInputFormat.setMaxInputSplitSize(job, 4194304);

在这里插入图片描述

运行结果

分为了三个切片,调用了三个MapTask
在这里插入图片描述

4. 修改虚拟存储切片的最大值

修改代码

在这里插入图片描述

运行结果

分为了一个切片,调用了一个MapTask
在这里插入图片描述

  大数据 最新文章
实现Kafka至少消费一次
亚马逊云科技:还在苦于ETL?Zero ETL的时代
初探MapReduce
【SpringBoot框架篇】32.基于注解+redis实现
Elasticsearch:如何减少 Elasticsearch 集
Go redis操作
Redis面试题
专题五 Redis高并发场景
基于GBase8s和Calcite的多数据源查询
Redis——底层数据结构原理
上一篇文章      下一篇文章      查看所有文章
加:2022-01-25 10:39:53  更:2022-01-25 10:40:06 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年9日历 -2024/9/8 8:50:35-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码