Hadoop架构原理 hadoop 架构

发布时间 2023-09-23 19:47:06作者: 小海哥哥de

Hadoop

1、Hadoop 2.0提供分布式存储(HDFS)和分布式操作系统(Yarn)两大功能软件包
2、Hadoop 1.0项目模块

  • Hadoop Common:支持其他模块的公用组件
  • Hadoop Distributed File System(HDFS):Hadoop的分布式文件系统
  • Hadoop MapReduce:分布式计算框架。
    Common是联系HDFS和MapReduce的纽带,它一方面为另外两组件提供一些公用jar包,另一方面也是程序员访问其他两个模块的接口。

HDFS主要提供分布式存储服务。MapReduce模块主要负责资源管理、任务调度和MapReduce算法实现。

一、Hadoop工作环境的构建模式

  • 单机模式:单机模式不需要与其他节点交互,因此不需要使用HDFS,直接读写本地的文件系统,该模式主要用于开发调试MapReduce程序的应用逻辑。
  • 伪分布模式:伪分布模式也在一台单机上运行,但是用不同的进程模仿分布式运行中的各类节点。
  • 分布式模式:在不同的机器上部署系统。
    实际上,完全模式部署Hadoop时,最低需要两台机器(一个主节点,一个从节点)即可实现完全分布式模式部署。分布式模式部署中需要使用的机器并非一定是物理实体机器,实 际上,用户可以提供两台或多台实体机器,也可以提供两台或多台虚拟机器,即用户可以 使用虚拟化技术,将一台机器虚拟成两台或多台机器,并且虚拟后的机器和实体机器使用 上无任何区别,用户可认为此虚拟机就是实体机器。

二、Hadoop 2.0体系结构

Hadoop 2.0虽包含Common、HDFS、Yarn和MapReduce这四个模块,但实际对外提供 服务时,只能看到HDFS和Yarn,Common主要为其他模块提供服务,MapReduce其实只 是Yarn模块里Yarn编程的一种方式

三、Common

Common的定位是其他模块的公共组件,定义了程序员取得集群服务的编程接口,为 其他模块提供公用API。它里面定义的一些功能一般对其他模块都有效,通过设计方式, 降低了Hadoop设计的复杂性,减少了其他模块之间的耦合性,大大增强了Hadoop的健壮性。
Common不仅包含了大量常用API,同时它提供了mini集群、本地库、超级用户、服 务器认证和HTTP认证等功能,除了mini集群用于测试或快速体验,其他都是Hadoop功能里的基本模块
下面是Common模块里最常用的几个包。
org.apache.hadoop.conf:定义了Hadoop全局配置文件类。
org.apache.hadoop.fs:HDFS文件系统接口。
org.apache.hadoop.io:提供大量文件系统操作流。
org.apache.hadoop.security:Hadoop安全机制接口类。
org.apache.hadoop.streaming:其他语言编写的代码转化为Hadoop语言的接口。
org.apache.hadoop.util:常用类包,提供大量常用API。
org.apache.hadoop.examples:Hadoop示例代码包。

以Configuration为例,它是conf包下定义的类,用于指定Hadoop的某些配置参数,但 HDFS里配置文件类却是HdfsConfiguration类,Yarn里则是YarnConfiguration, HdfsConfiguration与YarnConfiguration皆继承自Configuration,它们两者之间并没有关系。

四、分布式文件系统 HDFS

Hadoop分布式文件系统HDFS可以部署在廉价硬件之上,能够高容错、可靠地存储海 量数据(可以达到TB甚至PB级)。它还可以和Yarn中的MapReduce编程模型很好地结合,为应用程序提供高吞吐量的数据访问,适用于大数据集应用程序

HDFS的定位是提供高容错、高扩展、高可靠的分布式存储服务,并提供服务访问接 口(如API接口、管理员接口)。 为提高扩展性,HDFS采用了master/slave架构来构建分布式存储集群,这种架构很容 易向集群中任意添加或删除slave。HDFS里用一系列块来存储一个文件,并且每个块都可以设置多个副本,采用这种块复制机制,即使集群中某个slave机宕机,也不会丢失数据,这大大增强了HDFS的可靠性。由于存在单master节点故障,近年来围绕主节点master 衍生出许多可靠性组件。

4.1 HDFS体系架构

HDFS架构

HDFS采用master/slave体系来构建分布式存储服务,这种体系很容易向集群中添加或删除slave,既提高了HDFS的可扩展性又简化了架构设计。另外,为优化存储颗粒度, HDFS里将文件分块存储,即将一个文件按固定块长(默认128M)划分为一系列块,集群中,master机运行主进程namenode,其他所有slave都运行从属进程datanode。namenode统 一管理所有slave机器datanode存储空间,但它不做数据存储,它只存储集群的元数据信息 (如文件块位置、大小、拥有者信息),datanode以块为单位存储实际的数据。客户端联系namenode以获取文件的元数据,而真正的文件I/O操作时客户端直接和datanode交互。

  • NameNode就是主控制服务器,负责维护文件系统的命名空间(Namespace)并协调客户端对文件的访问,记录命名空间内的任何改动或命名空间本身的属性改动。
  • DataNode负责它们所在的物理节点上的存储管理,HDFS开放文件系统的命名空间以便让 用户以文件的形式存储数据。HDFS的数据都是“一次写入、多次读取”,典型的块大小是 128MB,通常按照128MB为一个分割单位,将HDFS的文件切分成不同的数据块 (Block),每个数据块尽可能地分散存储于不同的DataNode中。NameNode执行文件系统 的命名空间操作,比如打开、关闭、重命名文件或目录,还决定数据块到DataNode的映射。
  • DataNode负责处理客户的读/写请求,依照NameNode的命令,执行数据块的创建、复制、删除等工作。

例如,客户端要访问一个文件,首先,客户端从NameNode获得组成文件的数据块的位置列表,也就是知道数据块被存储在哪些 DataNode上;其次,客户端直接从DataNode上读取文件数据。NameNode不参与文件的传 输。

NameNode使用事务日志(EditLog)记录HDFS元数据的变化,使用映象文件 (FsImage)存储文件系统的命名空间,包含文件的映射、文件的属性信息等。事务日志 和映象文件都存储在NameNode的本地文件系统中。

NameNode启动时,从磁盘中读取映象文件和事务日志,把事务日志的事务都应用到 内存中的映象文件上,然后将新的元数据刷新到本地磁盘的新的映象文件中,这样可以截 去旧的事务日志,这个过程称为检查点(Checkpoint)。HDFS还有Secondary NameNode 节点,它辅助NameNode处理映象文件和事务日志。NameNode启动的时候合并映象文件 和事务日志,而Secondary NameNode会周期地从NameNode上复制映象文件和事务日志到 临时目录,合并生成新的映象文件后再重新上传到NameNode,NameNode更新映象文件 并清理事务日志,使得事务日志的大小始终控制在可配置的限度下。

HDFS典型拓扑

1、 一般拓扑。只有单个NameNode节点,使用SecondaryNameNode或 BackupNode节点实时获取NameNode元数据信息,备份元数据。
2、 商用拓扑。有两个NameNode节点,并使用ZooKeeper实现NameNode节点间的热切换。
ZooKeeper集群:至少三个ZooKeeper实体,用来选举ActiveNamenode。

JourNalNode集群:至少三个,用于与两NameNode交换数据,也可使用NFS。

HTTPFS:提供Web端读/写HDFS功能。

从架构上看HDFS存在单点故障,无论是一般拓扑还是商用拓扑,新增的实体几乎都 是增强NameNode可靠性的组件,当然这里的ZooKeeper集群还可以用于Hbase。

4.2 HDFS内部特性

1、冗余备份
HDFS将每个文件存储成一系列数据块(Block),默认块大小为128MB(可配置)。 为了容错,文件的所有数据块都会有副本(副本数量即复制因子,可配置)。HDFS的文 件都是一次性写入的,并且严格限制为任何时候都只有一个写用户。DataNode使用本地 文件系统存储HDFS的数据,但是它对HDFS的文件一无所知,只是用一个个文件存储 HDFS的每个数据块。当DataNode启动时,它会遍历本地文件系统,产生一份HDFS数据 块和本地文件对应关系的列表,并把这个报告发给NameNode,这就是块报告 (BlockReport)。块报告包括了DataNode上所有块的列表。

2、副本存放
HDFS集群一般运行在多个机架上,不同机架上机器的通信需要通过交换机。通常情况下,副本的存放策略很关键,机架内节点之间的带宽比跨机架节点之间的带宽要大,它 能影响HDFS的可靠性和性能。HDFS采用机架感知(Rack-aware)的策略来改进数据的可靠性、可用性和网络带宽的利用率。通过机架感知,NameNode可以确定每个DataNode所属的机架ID。一般情况下,当复制因子是3时,HDFS的部署策略是将一个副本存放在本地机架上的节点,一个副本放在同一机架上的另一个节点,最后一个副本放在不同机架上 的节点。机架的错误远比节点的错误少,这个策略可以防止整个机架失效时数据丢失,提高数据的可靠性和可用性,又能保证性能。下图体现了复制因子为3的情况下,各数据块的分布情况。

3、副本选择
HDFS会尽量使用离程序最近的副本来满足用户请求,这样可以减少总带宽消耗和读 延时。如果在读取程序的同一个机架上有一个副本,那么就使用这个副本;如果HDFS机 群跨了多个数据中心,那么读取程序将优先考虑本地数据中心的副本。 HDFS的架构支持数据均衡策略。如果某个DataNode的剩余磁盘空间下降到一定程度,按照均衡策略,系统会自动把数据从这个DataNode移动到其他节点。当对某个文件 有很高的需求时,系统可能会启动一个计划创建该文件的新副本,并重新平衡集群中的其他数据。

4、心跳检测
NameNode周期性地从集群中的每个DataNode接受心跳包和块报告,收到心跳包说明该DataNode工作正常。NameNode会标记最近没有心跳的DataNode为宕机,不会发给它们任何新的I/O请求。任何存储在宕机的DataNode的数据将不再有效,DataNode的宕机会造成一些数据块的副本数下降并低于指定值。NameNode会不断检测这些需要复制的数据块,并在需要的时候重新复制。重新复制的引发可能有多种原因,比如DataNode不可 用、数据副本的损坏、DataNode上的磁盘错误或复制因子增大等。

5、数据完整性检测
多种原因可能造成从DataNode获取的数据块有损坏。HDFS客户端软件实现了对HDFS文件内容的校验和检查(Checksum),在创建HDFS文件时,计算每个数据块的校验和,并将校验和作为一个单独的隐藏文件保存在命名空间下。当客户端获取文件后,它会检查从DataNode获得的数据块对应的校验和是否和隐藏文件中的相同,如果不同,客户端就会判定数据块有损坏,将从其他DataNode获取该数据块的副本。

6、元数据磁盘失效
映象文件和事务日志是HDFS的核心数据结构。如果这些文件损坏,会导致HDFS不可用。NameNode可以配置为支持维护映象文件和事务日志的多个副本,任何对映象文件或事务日志的修改,都将同步到它们的副本上。这样会降低NameNode处理命名空间事务的速度,然而这个代价是可以接受的,因为HDFS是数据密集的,而非元数据密集的。当NameNode重新启动时,总是选择最新的一致的映象文件和事务日志。

7、简单一致性模型、流式数据访问
HDFS的应用程序一般对文件实行一次写、多次读的访问模式。文件一旦创建、写入和关闭之后就不需要再更改了。这样就简化了数据一致性问题,高吞吐量的数据访问才成为可能;运行在HDFS上的应用主要以流式读为主,做批量处理;更注重数据访问的高吞吐量。

8、客户端缓存
客户端创建文件的请求不是立即到达NameNode,HDFS客户端先把数据缓存到本地的一个临时文件,程序的写操作透明地重定向到这个临时文件。当这个临时文件累积的数据超过一个块的大小(128MB)时,客户端才会联系NameNode。NameNode在文件系统中插入文件名,给它分配一个数据块,告诉客户端DataNode的ID和目标数据块ID,这样客户端就把数据从本地的缓存刷新到指定的数据块中。当文件关闭后,临时文件中剩余的未刷新数据也会被传输到DataNode中,然后客户端告诉NameNode文件已关闭,此时NameNode才将文件创建操作写入日志进行存储。如果NameNode在文件关闭之前死机, 那么文件将会丢失。如果不采用客户端缓存,网络速度和拥塞都会对输出产生很大的影响。

9、流水线复制
当客户端准备写数据到HDFS的文件中时,就像前面介绍的那样,数据一开始会写入本地临时文件。假设该文件的复制因子是3,当本地临时文件累积到一个数据块的大小时,客户端会从NameNode获取一个副本存放的DataNode列表,列表中的DataNode都将保存那个数据块的一个副本。客户端首先向第一个DataNode传输数据,第一个DataNode一小块一小块(4KB)地接收数据,写入本地库的同时,把接受到的数据传输给列表中的第 二个DataNode;第二个DataNode以同样的方式边收边传,把数据传输给第三个DataNode;第三个DataNode把数据写入本地库。DataNode从前一个节点接收数据的同时,即时把数据传给后面的节点,这就是流水线复制。

10、架构特征
硬件错误是常态而不是异常。HDFS被设计为运行在普通硬件上,所以硬件故障是很正常的。HDFS可能由成百上千的服务器构成,每个服务器上都存储着文件系统的部分数据,而HDFS的每个组件随时都有可能出现故障。因此,错误检测并快速自动恢复是HDFS的最核心设计目标。

12、超大规模数据集
一般企业级的文件大小可能都在TB级甚至PB级,HDFS支持大文件存储,而且提供整体上高的数据传输带宽,一个单一的HDFS实例应该能支撑数以千万计的文件,并且能 在一个集群里扩展到数百个节点。

4.3 HDFS对外功能

NameNode高可靠性

由于master/slave架构天生存在单master缺陷,因此,HDFS里可以配置两个甚至更多NameNode。一般部署时,常用的SecondaryNameNode或BackupNode只是确保存储于NameNode的元数据多处存储,不提供NameNode其他功能;双NameNode时,一旦正在服务的NameNode失效,备份的NameNode会瞬间替换失效的NameNode,提供存储主服务。

HDFS快照

快照支持存储某个时间点的数据复制,当HDFS数据损坏时,可以回滚到过去一个已知正确的时间点。

元数据管理与恢复工具

这是Hadoop 2.0新增加的功能,用户可以使用“hdfs oiv”和“hdfs oev”命令,管理修复 fsimage与edits,fsimage存储了HDFS元数据信息,而edits存储了最近用户对集群的更改信息。

HDFS安全性

新的HDFS相对于以前HDFS的最大改进就是提供了强大的安全措施,HDFS安全措施包括两个方面:用户与文件级别安全认证,机器与服务级别安全认证。

用户与文件级别安全认证几乎类似于Linux,HDFS里超级用户为HDFS用户,也有添加用户更改文件属性等概念。

机器与服务级别安全认证则是Hadoop特有的概念,分布式环境下,启动NameNode或DataNode的这台机器是否合法,访问NameNode的这个用户是否取得凭证,凭证允许时间多长,这些都是应当关注的问题,Kerberos即是完成这类跨网络认证的最好的第三方工 具,HDFS本身没有实现Kerberos认证的任何功能,而是在需要认证时询问是否有Kerberos凭证罢了,比如运行DataNode的cSlave0服务欲向cMaster运行的NameNode服务发送心跳 包,在使用Kerberos认证时,cSlave0有凭证则cMaster接收发过来的心跳包,否则cMaster不接收。

HDFS配额功能

此功能类似于Linux配额管理,主要管理目录或文件配额大小。

HDFS C语言接口

其提供了C语言操作HDFS接口。

HDFS Short-Circuit功能

在HDFS服务里,对于数据的读操作都需要通过DataNode,也就是当客户端想要读取 某个文件时,DataNode首先从磁盘读取数据,接着通过TCP端口将这些数据发送到客户 端。而所谓的Short-Circuit指的是读时绕开DataNode,即客户端直接读取硬盘上的数据。 显然,只有当客户端和DataNode是同一台机器时,才可以实现Short-Circuit,但由于 MapReduce里的Map阶段一般都是处理本机数据,这一点改进也将大大提高数据处理效 率。

WebHdfs
此功能提供了Web方式操作HDFS。在以前版本中,若需要在HDFS里新建目录,写入 数据,一般都通过命令行接口或编程接口突现,现在,使用WebHdfs可直接在Web里对 HDFS进行插、删、改、查操作,提高了效率。

五、分布式操作系统 Yarn

和其他操作系统一样,分布式操作系统的基本功能是:管理计算机资源,提供用户 (包括程序)接口。Yarn一方面管理整个集群的计算资源(CPU、内存等),另一方面提 供用户程序访问系统资源的API。

5.1 体系架构

Yarn架构
Yarn的主要思想是将MRv1版JobTracker的两大功能——资源管理和任务调度,拆分成两个独立的进程,即将原JobTracker里资源管理模块独立成一个全局资源管理进程 ResourceManager,将任务管理模块独立成任务管理进程ApplicationMaster。而MRv1里的 TaskTracker则发展成为NodeManager。

Yarn依旧是master/slave架构,主进程ResourceManager是整个集群资源仲裁中心,从进程NodeManager管理本机资源,ResourceManager和从属节点的进程NodeManager组成了 Hadoop 2.0的分布式数据计算框架

5.2 Yarn执行过程

Yarn在执行时包含以下独立实体。

① Client:客户端,负责向集群提交作业。

② ResourceManager:集群主进程,仲裁中心,负责集群资源管理和任务调度。

③ Scheduler:资源仲裁模块。

④ ApplicationManager:选定,启动和监管ApplicationMaster。

⑤ NodeManager:集群从进程,管理监视Containers,执行具体任务。

⑥ Container:本机资源集合体,如某Container为4个CPU,8GB内存。

⑦ ApplicationMaster:任务执行和监管中心。

任务调度。

③ Scheduler:资源仲裁模块。

④ ApplicationManager:选定,启动和监管ApplicationMaster。

⑤ NodeManager:集群从进程,管理监视Containers,执行具体任务。

⑥ Container:本机资源集合体,如某Container为4个CPU,8GB内存。

⑦ ApplicationMaster:任务执行和监管中心。

转载:https://blog.51cto.com/u_13479/6482294