1.hadoop架构及作用

(1)Common

hadoop核心组件,基本jar包依赖,公共工具程序

(2)HDFS(Hadoop Distributed File System)

分布式文件系统,解决分布式存储

(3)MapReduce

分布式计算框架

(4)Yarn

分布式资源管理系统

2.HDFS架构及功能

hadoop生态圈数据库 hadoop生态圈应用_HDFS

(1)client 客户端

linux window/sheel COMMAND-LINE
java/scala/python PROJECT
向namenode发送请求,和datanode发生交互

(2)NameNode

元数据节点,储存元数据信息,负责处理客户端的请求
(文件block的位置信息不保存在namenode上,namenode只提供文件名,文件大小,块名,块数量,读取文件时client先找到最近的一个datanode节点,通过nodemanager访问resourcemanager,获取块存储的位置信息)

(3)DataNode

数据节点:保存和block检索
执行数据读写操作

(4)Secondary NameNode

合并edit.log到fsimage中
赋值NameNode完成内存中元数据存储的持久化

3.HDFS架构优缺点

优点:

(1)高扩展性

可以根据业务需求增加集群机器的数量,可以是普通机器

(2)高容错性

数据层面:hadoop底层维护多个数据副本 yarn->datanode
管理层面:hadoop框架能自动将失败的任务重新分配
yarn->appmaster->container
zookeeper->namenode

(3)数据量大

依靠hdfs可以操作PB级的数据

(4)流式访问

序列化,流传输,支持任意数据类型

缺点:

(1)不适合低延时

I/O操作频繁

(2)不可以并发

没有锁机制,不支持事务

(3)不使用数据量小的文件

占空间(1个block块占128M),小文件过多,nn内存有限,寻址慢

4.HDFS写数据流程

hadoop生态圈数据库 hadoop生态圈应用_数据_02

1.client 请求
	client创建DFS
	DFS dfs = FileSystem.open()
	向NN请求 (源文件已存在)
2.NN 确认
	目录存在、用户无操作权限 return false
	否则 return true
3.client 切分并请求第一个Block DN
	client将文件切成n个128M的Block
	client向NN请求第1个Block的存储DN列表
4.NN 返回DN列表
	假如返回:dn1 dn2 dn3
5.client 写入
	a. FSDOS向dn1请求写入
	b. dn1请求dn2,dn2请求dn3,分别建立pipeline管道
	c. dn3响应dn2,dn2响应dn1,dn1响应client
	d. Block传输
		d.1: client读取第一个Block并以Packet(64k)为单位传输,dn1每收到一个Packet会建立等待应答队列,并逐级传输给dn2,dn3
		d.2: dn3,dn2,dn1逐级应答,并将结果反馈给client
		d.3: 重复d.1~2直至Block传输完成
	f. 关闭FSDOS
6.client发送complete给NN
7.重复3~6直至所有Block传输完成

5.HDFS读数据流程

hadoop生态圈数据库 hadoop生态圈应用_数据_03

1.client创建DFS
		DFS dfs = FileSystem.open()
	2.DFS向NN请求RPC获取【文件开始部分或全部】Block有序列表
		列表按距离client的距离升序排序
		每个Block包含DN地址,如果client就是DN,则本地读取
	3.DFS向client返回支持文件定位的输入流对象FSDIS
		【了解】
		FSDIS中包含一个(DFSIS)DFSInputStream,用来管理DN和NN之间的IO
			如:
			DN中数据缺失或者下载一部分之后任务失败,则可以通过DFSInputStream联系NN求助
			NN借助YARN找到距离最近的另一个备份节点
			将未完成的下载任务迁移到该节点,并通过【支持文件定位】的输入流对象FSDIS进行【续传】
	4.client调用FSDIS的read()找到离client最近的DN,并连接DN
	5.DFSIS依次读取一个批次的Block
		a. 读取包含文件第一个Block的最近DN地址
		b. 重复调用read()方法,直至第一个Block读取完成
		c. 关闭DN连接
		d. 重复a~c直至第一个批次的Block全部读取完成
	6.重复2~5,直至所有批次的Block读取完成
	7.关闭DFSIS,FSDIS,DFS

5.MapReduce过程详解

hadoop生态圈数据库 hadoop生态圈应用_HDFS_04

1.确定MapTask数和设置分区

TextInputFormat extends FileInputFormat implement InputFormat

InputFormat
InputFormat 的主要功能就是确定每一个 map 任务需要读取哪些数据以及如
何读取数据的问题,每一个 map 读取哪些数据由 InputSplit(数据切片)决定,
如何读取数据由 RecordReader 来决定。InputFormat 中就有获取 InputSplit 和RecordReader 的方法

FileInputFormat实现了InputFormat,实现了 getSplit方法,可设置切片大小,通过切片大小可设置MapTask任务个数
computeSliteSize=Math.max(minSize, Math.min(maxSize, blockSize))
默认为blockSize大小
NumMapTask=ceil(FileSize/computeSliteSize)

TextInputFormat继承了FileInputFormat,重写了getRecordReader方法,设定了读取数据的方式为逐行读取,每条记录是一行输入。键是LongWritable 类型,存储该行在整个文件中的字节偏移量。值是这行的内容,不包括任何行终止符(换行符和回车符)

2.MapTask过程

(1)Read阶段:通过TextInputFormat->RecordReader按inputSplit记录的文件位置逐行读取,以行字节偏移量作为k,一行内容为vaue,通过context封装,作为参数传入mapper方法中
(2)Map阶段:通过mapper方法中设置的逻辑方法对上一步产生的(k,v)做处理,生成新的(k,v)
(3)Collect阶段:在用户编写 map()函数中,当数据处理完成后,一般会调用 OutputCollector.collect()输出结果。在该函数内部,它会将生成的 key/value分区(调用 Partitioner),并写入一个环形内存缓冲区中。
4.Spill 阶段:即“溢写”,当环形缓冲区满后,MapReduce 会将数据写到本地磁盘上,生成一个临时文件。需要注意的是,将数据写入本地磁盘之前,先要对数据进行分区,再按键值进行排序。如果设置了combiner,则还需进行合并压缩。溢写会产生多个小文件
5.Combiner阶段:当所有数据处理完,溢出结束,对所有小文件进行合并。合并以分区为单位,并且保证分区内按key有序。这一步的结果保证了MapTask结束后生成了一个分区有序的大文件

3.Shuffle阶段

6.reducetask根据自己的分区号去各个maptask节点上拷贝相同分区的数据到本地磁盘工作目录上,如果不超过阈值,直接放到内存中,再进行合并为大文件,大文件按照key值有序排列

4.ReduceTask阶段

7.调用GroupingComparator方法对大文件里的数据进行按key分组,从文件中每次取出一组(k,values),调用自定义reduce方法进行逻辑处理

8.通过OutputFormat方法将结果数据写入part-r-0000文件中

5.YARN基本框架及主要功能

hadoop生态圈数据库 hadoop生态圈应用_HDFS_05

(1)ResourceManage

ResourceManager 是 YARN 中的全局资源管理器,相当于将集群中各个机器可用的资源看做一个整体,然后进行统一管理和分配,它会接收来自各个节点(NodeManager)的资源回报信息,并将这些信息按照一定的策略分配给应用程序。
ResourceManager 主要作用

  1. 处理客户端请求,Clinet 提交 Job,首先是由ResourceManager 来反馈。
  2. 监控 NodeManager,监控 NodeManager 心跳,发送指令给 NodeManager。
  1. 启动或监控 ApplicationMaster。

4.资源的分配和调度。
ResourceManager 核心组成:
1.Resource Scheduler(资源调度器),主要负责协调集群中各个应用的资源分配,保证整个集群的运行效率。Resouce Scheduler 只是一个纯调度器,只负责给用户提交的应用分配 Container(资源),它不会关注应用程序监控及其运行状态等信息,它不做监控以及应用程序的状态跟踪,并且不负责应用程序的容错,也就是说,当应用程序失败时,它不负责重启应用程序。
2.ApplicationManager(应用管理器),主要负责接收用户应用的提交请求,为应用程序分配第一Container 来运行ApplicationMaster还有就是负责监控ApplicationMaster,并在遇到失败时重启ApplicationMaster 运行的Container。ApplicationMaster 每一个程序都会有一个,运行在 Container 中,可以看做是每一个应用的管理者。

(2) NodeManager

NodeManager 运行在集群的节点上,这一点从前面安装分布式环境中可以看
出,一般 NodeManager 会与 DataNode 在同一个节点。NodeManager 在集群中会
有多个,负责管理每个节点上的资源。它主要负责接收来自 ResouceManager 的
资源分配请求,分配具体的 Container 给具体的任务,同时,它还负责监控并报
告 Container 使用信息给 ResouceManager。NodeManager 只负责管理自身节点上
的 Container,并不关心运行在 Container 上的任务的运行信息,任务的运行信息
由 ApplicationMaster 来管理。
NodeManager 主要作用:
➢ 管理单个节点上的资源
➢ 监控 Container 生命周期和使用的资源
➢ 处理来自 ResourceManager 的指令
➢ 处理来自 ApplicationMaster 的指令
在 NodeManager 注册到 ResourceManager 之后,它就会不间断的向
ResourceManager 发送心跳(heartbeat),如果 ResourceManager 有需要它执行
的指令,就作为响应发送给它。在 NodeManager 加载一个 Container 之前,它需
要本地化需要的资源,包括数据文件,可执行文件,shell script 等。这些 Resource
可能有能够在不同用户之间共享的资源,有能够在相同用户不同应用之间共享的
资源,以及只能够被这一个 Container 使用的资源。NodeManager 也可以在
ResourceManager 的指示下,杀掉 Container。当处于下面的几种场景中时,
NodeManager 就可能 Kill 掉一个 Container。 ➢ ResourceManager 告诉它,Application 已经完成了。
➢ Scheduler 决定抢占这个 Container,并将它分配给另一个 Application 或者
用户。
➢ NodeManager 检测到,这个 Container 使用的资源已经超过指定的资源限
制。
当一个 Container 完成时,NodeManager 会清除它在本地存储的数据。当一
个应用完成时,NodeManager 会删除全部跟它相关的 Container 的数据

(3) ApplicationMaster

ApplicationMaster 运行在 Container 中,它主要功能是向 ResourceManager
申请资源和 NodeManager 协同工作,运行应用的各个任务(比如 MapTask、
ReduceTask),然后跟踪它们状态及监控各个任务的执行,遇到失败的任务还负
责重启它。YARN 中运行的每个应用程序都有一个自己独立的 ApplicationMaster。
ApplicationMaster(AM)的主要作用:
➢ 负责数据的切分。比如 MapReduce 任务会根据 InputSplit 信息来进行数
据切分。
➢ 为应用程序申请资源,并进一步分配给内部任务。比如 MapReduce 任务,
主要是为 MapTask 和 ReduceTask 申请运行资源来运行 Task
➢ 内部任务的监控和容错。
➢ 负责协调来自 ResourceManager 的资源,并通过 NodeManager 监视任务
的执行和资源使用情况。
ApplicationMaster 启动后会和 ResourceManager 保 持 连 接 , 定 期 向
ResourceManager 发送心跳(heartbeat),回报自己的健康信息。然后计算应用
(Application)需要的资源,然后跟 ResourceManager 沟通,让 ResourceManager
给它分配 Container,分配了 Container 后,ApplicationMaster 和 NodeManager 沟
通来加载 Container 运行任务

(4) Container

Container 是 YARN 中的资源抽象,它封装了某个节点上的多维度资源,如内
存、CPU、磁盘、网络等。Container 是 YARN 框架的计算单元,是具体运行 Task
(如 MapTask、ReduceTask)的基本单位。Container 是一个动态资源分配单位,
将内存、CPU、磁盘、网络等资源封装在一起,限定了每个任务使用的资源量。
从上面的描述可以看出,Container 很像我们使用的虚拟机系统,就是在
NodeManager 节点机器上分配一块独立的空间来运行任务。
Container 与集群节点的关系:一个节点可以运行多个 Container,但是需要
明确的是 Container 不能跨多个机器。任何一个用户提交的应用拆分后的任务都
必须运行在一个或多个 Container 中。

6.yarn-job执行全过程

hadoop生态圈数据库 hadoop生态圈应用_数据_06


1.client向ApplicationManager发出提交job的请求

2.ApplicationManager返回一个JobID及job资源的提交路径

3.client将运行job所需要的jar包,配置信息,切片信息等资源上传到返回的HDFS路径中

4.上传成功后,client向ApplicationManager发出执行job的请求

5.ApplicationManager将请求提交给ResourceSchedule

6.ResourceSchedule将job放到调度队列,当执行到该job时,通ApplicationManager

7.ApplicationManage在一个相对空闲的namenode上开辟container,创建ApplicationMaster

8.ApplicationMaster下载client提交的资源到本地,根据inputsplit信息生成MapTask和ReduceTask并确定各自任务数

9.ApplicationMaster向ResourceSchedule申请运行多个MapTask任务的资源

10. ResourceSchedule 将运行 MapTask 任 务 分 配 给 空 闲 的 多 个NodeManager,NodeManager 分别领取任务并创建容器(Container)

11. ApplicationMaster向接收到任务的nodemanager发送开启MapTask任务指令,每个接收到任务的 NodeManager 启动 MapTask,MapTask 对数据进行处理,并分区排序。

12.MrAppMaster 等待所有 MapTask 运行完毕后,向 ResourceManager申请容器(Container),运行 ReduceTask。

13.程序运行完毕后,MrAppMaster 会向 ResourceManager 申请注销自己