HDFS
这里在网上参考了一下文章的各种解释,以及林子雨老师的大数据处理技术应用我把它整理了一下,并且加了一些自己的理解。
简介:
HDFS是Hadoop Distribute File System 的简称,也就是 hadoop 分布式文件系统,可以储存超大容量文件(GB甚至TB,PB级别),其最主要的作用是作为 Hadoop 生态中各系统的存储服务。
分布式文件系统
- 分布式文件系统把文件分布存储到多个计算机节点上,成千上万的计算机节点构成计算机集群
- 与之前使用多个处理器和专用高级硬件的并行化处理装置不同的是,目前的分布式文件系统所采用的计算机集群,都是由普通硬件构成的,这就大大降低了硬件上的开销
分布式文件系统在物理结构上是由计算机集群中的多个节点构成的,这些节点分为两类,一类叫“主节点”(Master Node)或者也被称为“名称结点”(NameNode),另一类叫“从节点”(Slave Node)或者也被称为“数据节点”(DataNode).
HDFS特点
总体而言,HDFS要实现以下目标:
●兼容廉价的硬件设备
●流数据读写
●大数据集
●简单的文件模型
●强大的跨平台兼容性
HDFS特殊的设计,在实现上述优良特性的同时,也使得自身具有一些应用局限性,
主要包括以下几个方面:
●不适合低延迟数据访问
●无法高效存储大量小文件
●不支持多用户写入及任意修改文件
1.hdfs服务:
HDFS 使用单一的 NameNode 节点简化了整体的设计,同时使用 Master-Slave 模式,防止 NameNode 成为单点故障,Failover Controller(故障切换器)的工作便是负责监控 NameNode 的状态与切换主从服务器。与此同时,为了能够快速从故障中恢复,每一次的数据读写删操作都会记录在 NameNode 上的 EditLog 中并同步到每个 JournalNode 节点。(容灾)而 DataNode 节点则负责存储物理数据,为了应对不确定的故障,每一份数据默认被保存为 3 份,并分散在不同的 DataNode 中,而通过 Balancer 则可以平衡集群之间各节点的磁盘利用率,以防止某一个 DataNode 节点存储已满但是其它 DataNode 节点却可能为空的情况。
总的来说,HDFS 主要包含了 6 个服务,它们主要的功能如下:
• NameNode:负责管理文件系统的 namespace 以及客户端对文件的访问;
• DataNode:用于管理它所在节点上的存储;
• FailoverController:故障切换控制器,负责监控与切换 Namenode 服务;
• JournalNode:用于存储 EditLog;
• Balancer:用于平衡集群之间各节点的磁盘利用率;
• HttpFS:提供 HTTP 方式访问 HDFS 的功能。
通常而言,在关注 HDFS 架构时,总是关注 Namenode 和 Datanode 的架构,因为它们是 HDFS 的核心,也是客户端操作数据需要依赖的两个服务。
那么简单总结一下就是:
NameNode中记录了文件是如何被拆分成block以及这些block都存储到了那些DateNode节点.
NameNode同时保存了文件系统运行的状态信息.
DataNode中存储的是被拆分的blocks.
Secondary NameNode帮助NameNode收集文件系统运行的状态信息.
2. NameNode & DataNode
在 HDFS 中,Namenode 是 HDFS 中的主节点,用于维护和管理 Datanode 上存在的 block。它是一个高度可用的服务器,用于管理文件的 namespace 并控制客户端对文件的访问。HDFS 体系的构建方式是,用户数据永远不会驻留在 Namenode 上,数据只会驻留在 Datanode 上。
Namenode 的功能:
- • 它是维护和管理 Datanode 的主守护进程;
- • 它记录存储在集群中的所有文件的元数据,例如 block 的位置、文件大小、权限、层次结构等。有两个文件与元数据关联:
- FsImage:它包含自 Namenode 开始以来文件的 namespace 的完整状态;
- EditLogs:它包含最近对文件系统进行的与最新 FsImage 相关的所有修改。
- • 它记录了发生在文件系统元数据上的每个更改。例如,如果一个文件在 HDFS 中被删除,Namenode 会立即在 EditLog中记录这个操作。 • 它定期从集群中的所有 Datanode 接收心跳信息和 block 报告,以确保 Datanode 处于活动状态;
- • 它保留了 HDFS 中所有 block 的记录以及这些 block 所在的节点;
- • 它负责管理所有 block 的复制;
- • 在Datanode 失败的情况下,Namenode 会为副本选择新的 Datanode,平衡磁盘使用并管理到 Datanode 的通信流量。
Datanode 则是 HDFS 中的从节点,与 Namenode 不同的是,Datanode是一种商品硬件,它并不具有高质量或高可用性。Datanode 是一个将数据存储在本地文件 ext3 或 ext4 中的 block服务器。
FsImage文件
- FsImage文件包含文件系统中所有目录和文件inode的序列化形式。每个inode是一个文件或目录的元数据的内部表示,并包含此类信息:文件的复制等级、修改和访问时间、访问权限、块大小以及组成文件的块。对于目录,则存储修改时间、权限和配
额元数据 - FsImage文件没有记录块存储在哪个数据节点。而是由名称节点把这些映射保留在内存中,当数据节点加入HDFS集群时,数据节点会把自己所包含的块列表告知给名称节点,此后会定期执行这种告知操作,以确保名称节点的块映射是最新的。
名称节点运行期间EditLog不断变大的问题
- 在名称节点运行期间,HDFS的所有更新操作都是直接写到EditLog中,久而久之, EditLog文件将会变得很大
- 虽然这对名称节点运行时候是没有什么明显影响的,但是,当名称节点重启的时候,名称节点需要先将FsImage里面的所有内容映像到内存中,然后再一条一条地执行EditLog中的记录,当EditLog文件非常大的时候,会导致名称节点启动操作非常慢,而在这段时间内HDFS系统处于安全模式,一直无法对外提供写操作,影响了用户的使用.
如何解决?答案是:
SecondaryNameNode第二名称节点
第二名称节点是HDFS架构中的一个组成部分,它是用来保存名称节点中对HDFS 元数据信息的备份,并减少名称节点重启的时间。SecondaryNameNode一般是单独运行在一台机器上.
3. 数据块(Block)
-
HDFS的命名空间包含目录、文件和块
-
在HDFS1.0体系结构中,在整个HDFS集群中只有一个命名空间,并且只有唯一一个 名称节点,该节点负责对这个命名空间进行管理
-
HDFS使用的是传统的分级文件体系,因此,用户可以像使用普通文件系统一样,创 建、删除目录和文件,在目录间转移文件,重命名文件等
通常,在任何文件系统中,都将数据存储为 block 的集合。block 是硬盘上存储数据的最不连续的位置。在 hadoop 集群中,每个 block 的默认大小为 128M(此处指 hadoop 2.x 版本,hadoop 1.x 版本为 64M)。大文件会被分割成多个block进行存储。每一个block会在多个datanode上存储多份副本,默认是3份。
如果客户机想将文件写到 HDFS 上,首先需要将该文件缓存到本地的临时存储。如果缓存的数据大于所需的 HDFS 块大小,创建文件的请求将发送给 NameNode。NameNode 将以 DataNode 标识和目标块响应客户机。
同时也通知将要保存文件块副本的 DataNode。当客户机开始将临时文件发送给第一个 DataNode 时,将立即通过管道方式将块内容转发给副本 DataNode。客户机也负责创建保存在相同 HDFS名称空间中的校验和(checksum)文件。
在最后的文件块发送之后,NameNode 将文件创建提交到它的持久化元数据存储。
HDFS读写文件流程:
HDFS写文件:
HDFS读文件
数据存取策略
1.数据存放:
•第一个副本:放置在上传文件的数据节点;如果是集群外提交,则随机挑选一台磁盘
不太满、CPU不太忙的节点
•第二个副本:放置在与第一个副本不同的机架的节点上
•第三个副本:与第一个副本相同机架的其他节点上
•更多副本:随机节点
2.数据读取
•HDFS提供了一个API可以确定一个数据节点所属的机架ID,客户端也可以调用API
获取自己所属的机架ID
•当客户端读取数据时,从名称节点获得数据块不同副本的存放位置列表,列表中包
含了副本所在的数据节点,可以调用API来确定客户端和这些数据节点所属的机架ID,
当发现某个数据块副本对应的机架ID和客户端对应的机架ID相同时,就优先选择该副
本读取数据,如果没有发现,就随机选择一个副本读取数据
Hdfs文件的一些基本操作举例
(常用的有读取文件,新建文件,移动文件,删除文件,列表文件)
在安装完Hadoop后,你可以利用help获取帮助:
关于如何搭建Hadoop环境,请参考:Ubuntu18.04,Hadoop3.1.3伪分布式环境搭建