hadoop基础
一,海量信息如何处理
技术难点:稳定性,容错能力,数据一致性
核心思想:把数据分发到多个节点,移动计算逻辑到数据附近,计算节点进行本地数据处理,优先顺序读,次之随机读
二,Hadoop组成
hadoop:YARN,MapReduce,HDFS
三,HDFS(Hadoop Distributed File System) (一个大量文件存储的框架)
简介: 源自Google的GFS的论文,
易于扩张的分布式系统,只需要增加机器,就可以扩容
可以运行大量廉价的机器上,提供容错机制
优点:
-
高容错,流式文件访问, (分块存储,并有多份副本)(一次写入,多次读取,写入之后,不再更改,智能再末尾追加,若是修改数据,需要覆盖原来的副本)
-
适合大数据存储及批处理(HDFS会把文件的位置暴露给计算框架,如MapReduce,计算框架会根据数据的位置,采用移动计算,不移动数据的方式,快速启动任务,减少再网络的传输。)GB,TG,PB(百度,雅虎)
-
构建成本低,安全可靠
缺点:
-
不适合低延迟数据访问,如毫米级别的访问HDFS中的某一行数据无法实现,HDFS没有像数据库那样的索引可以快速定位数据,都是按照Block的形式存储,所以更适合高吞吐率的批处理使用
-
不适合大量小文件存储,HDFS在存储文件时,NameNode会存储文件的源数据信息,这些源数据信息包括有哪些Block组成,存储的节点位置,NameNode会将这些源数据加载到内存中,大量的小文件的源数据会占用NameNode大量 的内存空间,并且小文件在读取时需要耗费大量的磁盘通道。
-
不适合文件随机修改,HDFS不提供文件的随机修改,只支持最后的数据追加。
基本架构:
采用Master Slaver的结构,
Master:NameNode,负责管理HDFS文件系统的命名空间
1, NameNode会存储HDFS中文件的源数据信息,这些源数据信息包括有哪些Block列表,存储的节点位置,NameNode会将这些源数据加载到内存中
2, 管理副本数量,默认为3个副本,写入到HDFS的文件会被切分成128M的Block,为了提高容错性,每个Block及其副本,会被保存在3个不同的DataNode中,
为了实现高可用,通常会启动2个NameNode,一个时Active,一个时Standby,只有Active的NameNode才能处理客户端的读写请求,Standby的不会处理客户端的请求,但是会与Active状态NameNode同步数据节点,只有当Active的节点挂掉,才会接管整个集群,保证HDFS的容错性。
Slaver: DataNode
真正的存储数据的节点,执行客户端的读写请求,并且会周期性的与Name Node进行通信,汇报一些当前存储的所有的Block的信息,已经自身的运行状态,NameNode会根据这些汇报的信息,了解DataNode的运行状态,若是某个DataNode挂掉,或者网络的原因,与NameNode通信超时,NameNode会认为这个DataNode不可用,并标记该DataNode为死亡,也不会转发任何客户端的读写请求给该DataNode节点。这时NameNode会检测到存储在该节点上的Block的副本数会低于正常值,在必要时,会复制那些Block到其他可用的DataNode节点,来保证副本为3的状态。
对于客户端发起的请求,NameNode只是负责对Block源数据信息的操作,真正响应客户端读写请求的是DataNode。
客户端的请求只是从NameNode获取Block的源信息,如列表信息,位置信息,获取读写权限等,客户端获取到源信息或者权限之后,才去DataNode读写操作。若所有的访问都经过NameNode,则NameNode会成为瓶颈。
Hdfs中一个文件被切分成多个128M的好处,及使用Block存储的好处:
一个磁盘的大小是固定的,若一个文件的大小大于磁盘的大小,则该磁盘存储不了,但是把这个文件切分成多个Block,每个Block存储在多个DataNode的磁盘里面,那么这个大文件就会被分散到不同的Datanode上去存储。
4, HDFS的核心概念
类似与Linux操作系统,在NameSpace的任何写操作,都会对文件系统产生影响,并保存到磁盘中。
NameNode: 在HDFS的系统里一般会有2个NameNode,一个是Active,一个是Standby,但是主master只有一个,
1) 负责管理HDFS文件系统的命名空间(NameSpace)
NameNode维护文件目录树的层级关系。可以把所有文件以及目录可以看成一个Tree,跟Linux的文件系统rootfs类似。这个Tree的信息就是HDFS命名空间的信息,类似与Linux的NameSpace。
客户端对文件的写操作会首先产生edits日志。
NameNode会把这些命名空间信息以镜像文件fsimage形式,以及编辑日志edits文件永久性的存储在本地磁盘。
NameNode会定期将编辑日志edits与镜像文件fsimage合并并保存成新的fsimage到磁盘中。
但是在集群运行时,会将这些命名空间的信息都会加载到内存里。
2) 存储HDFS中文件的源数据信息,这些源数据信息包括有哪些Block列表,存储的节点位置,NameNode会将这些源数据加载到内存中
NameNode维护Datanode的源数据信息,如Block list,每个Block的副本数,生成时间,文件的权限,以及Block所在DataNode的位置映射信息,但是这些源数据信息并不会在NameNode磁盘中永久保存的,NameNode会通过与DataNode周期性的心跳信息通信,来获取DataNode的最新状态信息,如存储的Block所有的存储信息。
3) 管理副本策略(默认为3)
若是某个DataNode挂掉,或者网络的原因,与NameNode通信超时,NameNode会认为这个DataNode不可用,并标记该DataNode为死亡,也不会转发任何客户端的读写请求给该DataNode节点。这时NameNode会检测到存储在该节点上的Block的副本数会低于正常值,在必要时,会复制那些Block到其他可用的DataNode节点,来保证副本为3的状态。
4) 处理客户端的读写请求
NameNode里有DataNode的院数据的信息,所以在客户端请求时,客户端首先时要从NameNode中获取这些源数据信息和权限,然后客户端在于DataNode联系,进行正真的读写操作。
Standby NameNode:
是Active NameNode的热备节点。
周期性的同步Active NameNode的edits编译日志,定期合并命名空间的镜像文件fsimage与edits到本地磁盘
当Active NameNode故障时快速切换到Active状态。
5)NameNode源数据文件
edits:编译日志,客户端对目录和文件的写操作时,首先被记到edits日志中,如创建,删除文件等。(该操作是在内存中进行的,所以该edits日志里的内容是最新的,比如在Linux文件系统上编写一个日志,当编写的适合,内容是在内存上的, 只有保存之后,才会到磁盘中。)
fsimage: 文件系统元数据检查点镜像文件,保存了文件系统中所有的目录和文件信息,如一个目录下有拿些子目录,子文件,文件名,文件副本树,文件由哪些块组成等。
但是磁盘中fsimage里的内容不一定是最新的,需要在NameNode设置一个时间检查点,来定期将内存中最新的新增的edits与磁盘中fsimages合并并保存到磁盘中。
DataNode:
Slave工作节点,可以启动多个
存储数据块
执行客户端的读写请求操作
通过心跳机制定期向NameNode汇报运行状态和所有块列表信息
在集群启动时DataNode想NameNode提供存储Block快列表信息。
Block数据块:
文件写入到HDFS会被切分成若干个Block块
数据大小固定为128M,但也可自行修改。
HDFS的最小存储单元
若一个块的大小小于设置的数据块大小,则不会占用整个块的空间,也就是时保存的文件小于128M时,保存的大小不会占用128M
默认情况下每个Block有三个副本
Client
文件切分
与NameNode交互获取文件源数据信息
与DataNode交换,读取或写入数据
管理HDFS
HDFS高可用原理
四, YARN基本架构与原理(一个计算资源的调度框架)
产生背景:
多集群运维成本高,离线批处理->MapReduce;实时流计算->Spark;
跨集群移动数据成本高,资源浪费
离线计算,实时计算,算法模型训练等不同类型计算机需要优化计算资源
集群资源利用率低
YARN简介:
Yet Another Resource Negotiator的简称
另一个资源协调者,对HDFS的计算与内存资源进行调度。
Hadoop2.0以后引进YARN
主要功能:
集群资源管理系统
负责集群的统一管理和调度
与客户端交互,处理客户端的请求
YARN基本架构
解释: 跟HDFS的架构差不多,只是YARN处理客户端的时计算申资源请的任务。也是主从关系,ResourceManager是主,NodeManager是从。
只有一个ResourceManager,有多个NodeManager,并且每个NodeManager一般会有HDFS的每个DataNode一一对应。ResouceManager一般是放在单独的机器上,不与NodeManager在一个机器上。
Resourcemanager负责集群的所有资源的统一管理和调度,NodeManager负责节点资源的监控和管理。NodeMange也会通过心跳通信的机制,将DataNode的信息汇报给ResourceManager。
接收客户端计算任务的请求,真正执行任务的是DataNode里的Container。Container是CPU,内存等计算资源的容器。
ResouceManager接收到客户端的计算任务的请求,会与NodeManager进行通信,要求NodeManager启动一个Container,Container会根据运行的客户端程序封装所需要的CPU,内存的资源,启动Container之后,还会根据这个客户端程序启动一个ApplicationMaster,每个程序都只会有一个ApplicationMaster,也就是说客户端每次向ResouceManager提交的计算任务的请求时,都会在启动一个ApplicationMaster,该ApplicationsMaster负责具体任务的资源申请,任务调度,监控,它会向ResouceManager申请资源,申请完资源之后,会向NodeManager通信,要求NodeManager启动一个Container,执行具体的任务,该任务在执行的过程中,会不断与ApplicationMaster进行通信,汇报运行的情况。比如,执行一个MapReduce的任务,MapReduce会不断与ApplicationMaster,汇报一下当前任务执行的情况和状态。 客户端会通过ResourceMaster获取ApplicationMaster连接信息,并不断的与ApplicationMaster进行通信,获取最新的连接信息与运行状态,直到任务结束,释放占用的资源,关闭相应的Container。
注意:自ResourceManager的请求,NodeManager启动一个Container来启动一个ApplicationMaster,处理来自ResourceManager的授权,为作业的执行分配Container,前后这2个Cantainer可以是在一个节点上,也可以是在不同的节点上,容错机制保证了即使ApplicationMaster的节点失败,ResouceManager也在能使用的节点上,为该请求重启一个新的运行ApplicationMaster的容器。
对于YARN来说,其实没有节点的概念,对于它来说,所有的节点都可以看成一个庞大的计算资源来分配与调度,YARN会根据作业请求的资源的大小,来为该作业分配相应的资源以及启动Container。
YARN核心组件
-
ResourceManager
整个集群只有一个Master
功能:
处理客户端的请求
通过与NodeManager协调来启动/监控ApplicationMaster
监控NodeManager的健康状态
负责集群全局资源的分配和调度
-
NodeManager
每个节点只有一个,集群中会有多个,一般与DataNode一一对应,在相同的机器上部署。
功能:
单个节点上的资源监控和管理
定时向ResourceManager汇报本机的资源使用情况
处理来自ResourceManager的请求,为作业的执行分配Container
处理来自ApplicationMaster的请求,启动和停止Container
-
ApplicationMaster
每个应用程序只有一个。
只有在提交一个作业时,才会为这个作业启动一个ApplicationMaster。
在YARN上运行的每一个作业就是一个应用程序,每个应用只有一个ApplicationMaster,这个ApplicationMaster负责应用程序的管理,资源申请和任务调度,即每个作业的管理,资源申请和任务调度,申请资源时是与ResourceMaster来协调资源的。之前的ResourceMaster是负责集群全局的资源调度与管理。
功能:
与ResourceManager协商为应用程序申请资源
与NodeManager通信启动/停止作业任务
监控任务运行状态和失败处理
-
Container
任务运行环境的抽象,只有在分配任务的时候才会抽象出一个Container
功能:
任务运行资源(节点,内存,CPU)
任务启动命名
任务运行环境
YARN容错
-
ResourceManager
基于Zookeeper实现高可用
在集群中实现2个或多个ResourceMaster,但是只有一个是Active的状态,其他的都是热备节点的ResouceMaster,也是基于Zookeeper实现的高可用。当Active挂掉时,Zookeeper会选举出来新一个Active的ResouceMaster。
-
NodeManager
NodeManager故障将导致运行在该节点的任务失败,任务失败后,ResourceManager将失败的任务通知相应的ApplicationMaster
ApplicationMaster决定如何处理失败的任务,即是重新调度执行还是放弃任务。
-
ApplicationMaster
ApplicationMaster失败后,由ResourceManager负责重启