HDFS 是一个支持海量数据存储的分布式文件系统,是存储大数据文件的重要载体。本章主要介绍了 HDFS 的体系结构、运行机制、工作流程和基本操作。
一、HFDS 概述
1. HDFS 的设计目标和不足
设计目标:
- 支持超大文件存储
- 采用一次写入多次读取(write-once-read-many)访问模型
- 具有故障检测和快速自动恢复功能
- 采用流式数据访问
- 支持移动计算
不足:
- 不适合处理低延迟数据访问
- 无法高效存储大量小文件
- 不支持多用户写入和任意修改文件
2. HDFS 的体系结构
HDFS 是一个主/从(master/slave)架构的系统,即一个 HDFS 集群由一个 NameNode 和若干 DataNode 组成。它俩也是 HDFS 的核心组件,其中,NameNode 被称为“元数据节点”、另一个被称为“数据节点”。
3. 数据块(block)
磁盘数据块是磁盘读写的最小单位,也只能读写块整倍大小的数据。HDFS 的默认数据块大小为 128MB。
通常为512B,那为什么设置这么大?数据块越大,寻址开销越小。当然,盲目过大也不行,MapReduce 中的 Map 一次只处理一个块的内容,过大会导致整体任务量变少,进而影响数据的并行处理速度。
优点:
可以存储任意大小的数据文件,只要物理切片就可以。
简化了存储系统的管理:元数据信息和文件数据信息分开管理。
有利于实现分布式文件系统的容错性:一个节点出故障,其他块读取副本。
有利于实现负载军和并提高集群可靠性:某个数据节点的剩余空间低于临界点,就将这个数据节点移动到其他的数据节点上;此外,数据块的副本被安排在不同的机架上,即使丢失某台机架,读取副本即可,大大提高了集群的可靠性。与此同时,Hadoop 的故障检测和快速自动回复功能就可以及时将这些块副本数量恢复到正常水平。
4. NameNode 和 SecondaryNameNode
1) 元数据节点(NameNode)
管理 HDFS 文件系统的命名空间(namespace)。其实就是 HDFS 的目录结构,用户可以进行增删改重命名等 HDFS 文件。
所存储的元数据信息:
- 文件名、目录名与层次关系
- 文件目录的属主和权限
- 每个文件由哪些数据块组成
- 数据块到数据节点的映射信息
元数据信息被持久化的存到本地磁盘的两个文件中:fsimage(元数据镜像文件)和 edits(事务日志文件)。
元数据节点正常运行时,所有更新操作被写入 edits 文件中,如果直接写入元数据镜像文件,逐渐一段时间后,过大会导致系统运行速度变慢。即 edits 文件越来越大,不会对系统有明显影响,但是元数据节点的重启过程会越来越慢。
2) SecondaryNameNode(辅助者 · 元数据节点)
解决掉 edits 文件过大的问题。是对 元数据镜像文件和事务日志文件进行定期合并。由于合并时需要消耗内存,因此通常这俩没在一个节点上面。
优点:
- 提升了集群性能,保存了元数据节点的元数据信息,一定程度上提高了元数据的安全性和可靠性。
3) 数据节点(DataNode)
一个数据节点有多个数据块,每个数据块会在多个数据节点上存储副本,但一个数据节点只能有一个副本。
作用:
负责向客户端或元数据节点提供数据的检索和读写服务,并通过心跳机制定期向元数据节点发送自己的块列表信息。
一般情况下,数据节点会从磁盘中读取数据块,但如果某个块被频繁访问,系统会将其存放在数据节点的内存中。
从现有集群里面动态增加一个数据节点,怎么破?
—索引眼:增加数据节点增加一个数据节点增加一个DataNode增加DataNodehadoop04**Hadoop04—
二、数据错误与恢复
HDFS 的主要目标有一条是“具有故障检测和快速自动恢复功能”,这就要求即使再出错的情况下也要保证数据存储的可靠性。常见的出错情况包括block 损坏、NameNode 和 DataNode 的错误。
1. block 损坏处理
网络传输错误和机器硬件故障等因素会造成数据损坏。
客户端在读取文件时会对每个读取的块进行校验,如果出错,就会读取其他数据节点上的数据块,并将错误块报告给元数据节点,元数据节点随后会重新复制。
此外,每一个数据节点都会开启一个块扫描进程,来定期验证块的正确性,不正确会报告给元数据节点进行处理。
2. NameNode 和 DataNode 错误处理
1) NameNode 错误处理
NameNode 上保存了元数据信息,仅此一份独一无二,因此必须确保该安全。
容错方式有以下三种:
- 元数据信息持久化到本地磁盘并同步到 NFS 中,但会因网络带宽等原因造成元数据丢失。
- 运行 SecondaryNameNode。但由于该备份的元数据信息滞后于 NameNode,所以也会丢失掉部分的数据信息。
- 启用主备两个NameNode。
三、HDFS的运行机制
1. 副本机制
作用:
为了维护爱与和平…咳咳串台了,再来!为了保证集群的容错性和可用性。
2. 心跳机制
NameNode 启动后,会等待所有 DataNode 的“心跳”:DataNode 每隔一定间隔(默认三秒)主动向 NameNode 发送“心跳”,主动报告自己的状态信息。然后 NameNode 通过心跳向 DataNode 下达命令。
如果长时间未收到,则可以证明该 DataNode 宕机,然后检查该 DataNode 上的块副本信息并备份到其他的 DataNode 上。
对了,DataNode 会给主备主数据节点都会发送“心跳”。
3. 副本放置与机架感应策略
1) 副本放置
一个集群中多个机架,每个机架上多个数据节点,每个数据节点保存多个块副本。另外,元数据节点的元数据存储着每个数据节点所属的机架 ID。那么,如何分配文件的块副本到集群中的数据节点上面呢?
默认下,副本的配置数为 3,其中,有两个被放在同一机架的不同数据节点上面,另外一个被另一个机架上。
一般情况下,3 个足矣。若大于等于 3,则之后的副本可以随意放置。避免一个机架有太多同意副本即可。
2) 机架感应(rack-aware)
由于副本的存放位置会影响 HDFS 的可靠性和性能,HDFS 采用了一种机架感知策略来提高数据的可靠性,并提高网络带宽的利用率。
这样一来,即使一个机架发生故障,由于其他机架上的副本仍然可用,不会影响数据的可靠性。另外,当读取数据时,应用程序可用在多个机架上同时读取,大大提高数据的读取速度。
4. 联邦(Federation)机制
每个文件的元数据信息都需要保存到 NameNode 的内存中,于是便有了联邦机制。
作用:
集群横向扩展的方式解决 NameNode 的瓶颈问题,即增加元数据节点的数量。
由于 Hadoop 针对海量数据进行存储管理,并采用了数据冗余存储方式,所以磁盘I/O才是集群的《主要瓶颈》。
在联邦机制中,每个 NameNode 分别管理文件系统命名口径的一部分(命名空间卷)。各卷中分别存储了命名空间的元数据和文件数据块的块池。同时,各卷相互独立互不影响互不通信。此外,集群中的所有 DataNode 都必须注册到各个 NameNode。
不过,没有解决掉单点故障问题,若某一个 NameNode 失效,仍无法恢复无法访问。
5. HA(7*24小时不中断服务) 机制
所谓HA,即高可用(7*24小时不中断服务)。实现高可用最关键的是消除单点故障。
方式:允许运行主备两个 NameNode,当 NameNode 节点发生故障时,可以快速启用备用的 NameNode,以确保集群正常运行。
备主数据节点和主主数据节点始终同步(元数据信息一致),它们之间通过 JournalNode 守护进程进行通信。
6. 安全模式
启用后,就进入了安全模式。该模式下,主数据节点会检查块的完整性。此外,它还是一种只读模式。
正常情况下,NameNode启动(额外延迟30s)就会退出安全模式,但是如果DataNode 丢失的数据块超过设定的值,集群就会一直处于安全模式。
两件事
- 等待每个数据节点的心跳,判断是否宕机,然后NameNode 将 DataNode 所发送的 block 报告与其元数据进行对比,以判断数据块是否正常。
- 在内存中加载 fsimage,然后将 fsimage 和edits 合并成新的 fsimage,并创建一个新的 edits。合并完成后删除旧的 fsimage 和 edits,并将新的俩重命名。
7. 垃圾回收
没有任何利用价值的块副本被认为是垃圾:若一个文件被删除,那么备份的该文件副本也就没有用。
删除不会直接删除,会移动到回收站。四、HDFS 的工作流程
在 Hadoop 集群中,客户端与元数据节点之间的通信、元数据节点与数据节点之间的通信、数据节点相互之间的通信、都是基于 RPC(远程过程调用)机制的。
1. 启动流程
在 HDFS 的启动过程中,需要启动 NameNode 和DataNode。
启动时,会先进入安全模式。
数据节点启动时,会开启一个 DataBlockScanner 进程来扫描 block,并且由该进程定期向各个 NameNode 发送“心跳”。
2. 读流程
Client 读取时,首先会访问 NameNode 以确认是否可以读取。是,则 Client 获得文件的 block 和 DataNode 信息,然后执行 HDFS 的读操作来获取数据。在读取数据结束后,需要关闭文件输入流。
3. 写流程
Client 将数据预备写入到 HDFS 文件时,首先会访问 NameNode 确认写入的权限和文件是否存在(存在是否覆盖)。是,Client 在 NameNode 上创建写入文件的元数据信息,并返回可存储数据的 block 和 DataNode 信息,然后根据返回信息执行副本复制过程。写入结束后,需要关闭文件输出流。
4. 删除流程
1) 使用 HDFS 命令删除文件
root 用户的回收站目录为 hdfs://hadoop0:9000/user/root/.Trash
。
当用户使用 HDFS 命令执行删除操作后,系统会将需要删除的文件移动到回收站内的“/Current”下。例如,root用户删除了“koinl01.txt”文件,就可以在 hdfs://hadoop0:9000/user/root/.Trash/Current/koinl01.txt
找到。
回收站也是有时间周期滴。
2) 使用 Java API 删除文件
需要有一段延迟时间,才可以真正删除掉。
五、HDFS 的基本操作
基本操作包括:创建文件、移动文件、查看文件目录、读取文件等
1. HDFS 命令行操作
命令 | 解析 | 备注 |
---|---|---|
hdfs dfs -help | ||
hdfs dfs -ls / | 查看HDFS根目录下目录和文件 | -R选项递归展示 |
hdfs dfs -mkdir /mywork | 根目录下创建文件夹 | -p选项多级目录 |
hdfs dfs -put a.txt /mywork | 虚拟机本地文件上传到HDFS中 | -f 强制覆盖 |
hdfs dfs -get /mywork/a.txt /root/Downloads | HDFS中文件下载到虚拟机本地 | |
hdfs dfs -cp /mywork/a.txt /mywork/t1 | HDFS中文件复制到目录 | 若复制到文件,即复制+重命名 |
hdfs dfs -mv /mywork/a.txt /input/ | HDFS中文件移动到目录 | 若移动到文件,即移动+重命名 |
hdfs dfs -cat /input/word.txt | HDFS中查看文件内容 | |
hdfs dfs -rm /imput/a.txt | HDFS中删除文件 | -r选项删除目录 |
hdfs dfs -df/ | 查看HDFS可用空间 |
2. HDFS Java API 操作
使用 HDFS Java API 可以远程对 HDFS 中文件进行创建、上传、下载、删除、读写等操作。
1) 新建 Map/Reduce 项目和测试类
创建目录
在 Testfiles 类中添加一个用于创建目录的 createDir() 测试方法,该方法可以创建新目录
。
上传 Windows 本地文件
在 Testfiles 类中添加一个用于上传文件的 putFiles() 测试方法,该方法用于从 Windows 系统本地上传多个文件到集群。
下载文件到本地
在 Testfiles 类中添加一个用于下载文件的 getFiles() 测试方法,该方法通过正则表达式过滤出以“txt”为文件扩展名的文件并下载。
删除文件(或目录)
在 Testfiles 类中添加一个用于删除文件(或目录)的 deleteFiles() 测试方法,该方法用于从 HDFS 中删除文件(或目录)。
写入数据
在 Testfiles 类中添加一个用于写入数据到文件的 writeHDFS() 测试方法,该方法用于向 HDFS 中写入文件。
读取数据
在 Testfiles 类中添加一个用于读取文件数据的 readHDFS() 测试方法,该方法可以分行读取文件数据。
评论区
欢迎你留下宝贵的意见,昵称输入QQ号会显示QQ头像哦~