HDFS系统架构
HDFS以流式数据访问(一次写入,多次读取)模式来存储超大文件,运行于商用硬件集群上。超大文件是指GB,TB,PB的文件。目前已经有存储到PB级别的Hadoop集群了。
计算机字节关系
Hadoop1.x HDFS官方架构图
HDFS中的概念
针对上图来分析HDFS中的各个概念。
数据块
每个磁盘都有数据块的概念,在HDFS中也有数据块的概念,HDFS中的所有文件都是分割成块存储在Datanode上的,每个块默认64M。。每个块都有多个副本存储在不同的机器上:默认有3个副本(存放在3台机器上),3个副本不可能存放在同一个机器上。
HDFS副本存放策略
以下是HDFS文件存储架构图
黄色:表示每台机器
绿色:文件被分割出的块
例如:
上图中part-0文件,有2个块。块1和块3只在2个机器上分别出现过2次。
上图中part-1文件,有3个块。块2,4,5分别在不同的机器上各出现3次
HDFS中也可以显示块信息,使用fsck命令
例如:下面的命令将列出文件系统中各个文件由哪些块构成
$ hadoop fsck / -files -blocks
Namenode 和 Datanode
HDFS的设计是主(Master)从(Slave)结构的。也就是,一个管理者(Namenode)和多个工作者(Datanode)组成。
一个HDFS集群包含了一个单独的Namenode和多个Datanode。
管理者(Namenode):Namenode是主节点,它是一个中心服务器,负责管理整个文件系统的命名空间和控制着客户端对文件的访问。它不保存文件的内容,而是保存着文件的元数据(文件名称,所在目录,文件权限,文件拥有者,文件有多少块,每个块有多少副本,块都存在哪些节点上)。元数据保存在内存中。
Namenode维护着整个文件系统树以及树内的所有文件。这些信息以两个文件的形式永久保存在磁盘上。命名空间镜像文件和编辑日志文件
Namenode负责文件的元数据操作,Datanode处理文件内容的读写请求。
跟文件相关的流不经过Namenode,只会询问该文件跟哪个Datanode有关系。
副本存放在哪些Datanode上是由Namenode来控制。读取文件时,Namenode尽量让用户先读取最近的副本。
Namenode全权管理数据块的复制,周期性的从集群中的每个Datanode接收心跳信号和块状态报告。
Namenode和Datanode通信就是通过这两种方式:
心跳信号:意味着该Datanode节点工作正常
块状态报告:包含了一个该Datanode上所有数据块的列表
工作者(Datanode):Datanode的作用很简单,就是存储文件的块数据。以及块数据的校验和。
一个数据块在Ddtanode以文件存储在磁盘上,包括两个文件:数据本身和元数据(数据块的长度,块数据的校验和,时间戳)
Datanode启动后向Namenode注册,通过后,周期性(1小时)的向Namenode上报所有块信息。
心跳是3秒一次,如果超过10分钟没有收到某个Datanode的心跳。则认为该节点不可用。
HDFS架构分析
HDFS架构图
- 客户端(HDFS Client):如果想对文件进行读写的话,首先需要通过Namenode来获取一些信息。Namenode存储着命名空间(namespace)和元数据(metadata)
- 辅助节点(Secondary):用于辅助Namenode工作,主要工作是nameSpace的备份工作。将Namenode的镜像文件和操作日志进行合并的。
- 数据节点(Datanode):Namenode和Datanode通信是通过心跳和块报告。每个文件被分割成不同的块,存在不同的机器的本地磁盘上。