-
Hadoop Distributed File System:Hadoop分布式文件系统
-
源自于Google的GFS论文,发表于2003年10月,HDFS是GFS克隆版
-
HDFS是Hadoop体系中数据存储管理的基础
-
通过流式数据访问,提供高吞吐量应用程序数据访问功能,适合带有大型数据集的应用程序
-
提供一次写入多次读取的机制,数据以块的形式,同时分布在集群不同物理机器上
-
高度容错性的系统,能检测和应对硬件故障,用于在低成本的通用硬件上运行
HDFS的一些基本的概念
HDFS 是一个主从式(Master/Slave)的体系结构。HDFS 集群中有一个 NameNode 和一些DataNodes, NameNode 管理文件的元数据,DataNode 存储实际的数据。从用户的角度看,就像操作传统的文件系统一样,可以通过目录路径对文件执行创建、读取、删除操作。客户端联系 NameNode 来获取元数据信息,而真正的文件 I/O 是直接和 DataNode 进行交互的。
Block:
HDFS中的存储单元是每个数据块block,HDFS默认的最基本的存储单位是128M的数据块。和普通的文件系统相同的是,HDFS中的文件也是被分成64M一块的数据块存储的。不同的是,在HDFS中,如果一个文件大小小于一个数据块的大小,它是不需要占用整个数据块的存储空间的。
NameNode:
元数据节点。该节点用来管理文件系统中的命名空间,是master。其将所有的为了见和文件夹的元数据保存在一个文件系统树中,这些信息在硬盘上保存为了:命名空间镜像(namespace image)以及修改日志(edit log),后面还会讲到。此外,NameNode还保存了一个文件包括哪些数据块,分布在哪些数据节点上。然而,这些信息不存放在硬盘上,而是在系统启动的时候从数据节点收集而成的。
DataNode:
数据节点。是HDFS真正存储数据的地方。客户端(client)和元数据节点(NameNode)可以向数据节点请求写入或者读出数据块。此外,DataNode需要周期性的向元数据节点回报其存储的数据块信息。
Secondary NameNode:
从元数据节点。从元数据节点并不是NameNode出现问题时候的备用节点,它的主要功能是周期性的将NameNode中的namespace image和edit log合并,以防log文件过大。此外,合并过后的namespace image文件也会在Secondary NameNode上保存一份,以防NameNode失败的时候,可以恢复。
edit log:
修改日志。当文件系统客户端client进行写操作的时候,我们就要把这条记录放在修改日志中。在记录了修改日志后,NameNode则修改内存中的数据结构。每次写操作成功之前,edit log都会同步到文件系统中。
fsimage:
命名空间镜像。它是内存中的元数据在硬盘上的checkpoint。当NameNode失败的时候,最新的checkpoint的元数据信息就会从fsimage加载到内存中,然后注意重新执行修改日志中的操作。而Secondary NameNode就是用来帮助元数据节点将内存中的元数据信息checkpoint到硬盘上的。
HDFS的特点
1.高容错和高可用性,硬件错误是常态而不是异常
HDFS 设计为运行在普通硬件(节省成本)上,所以硬件故障是很正常的。HDFS 提供文件存储副本策略,可以实现错误自检并快速自动恢复。个别硬件的损坏不影响整体数据完整性和计算任务的正常执行。横向增加一些普通的硬件(节点),而不是纵向。
2.流式数据访问 (一次写入,多次读取)
HDFS 主要采用流式数据读取,做批量处理而不是用户交互处理,因此 HDFS 更关注数据访问的高吞吐量。
3.弹性存储,支持大规模数据集
HDFS 支持大文件存储,典型的文件在 GB 甚至 TB 级别,可以支持数以千万计的大规模数据集。根据业务需要灵活的增加或者缩减存储节点。(好比淘宝平时用的节点的数量和双十一的节点数量)弹性存储的最大挑战是减小在修改存储节点时的数据震荡问题。
4.简单一致性模型
HDFS 文件实行一次性写、多次读的访问模式。设计为文件一经创建、写入和关闭之后就不需要再更改了,这种设计和假定简化了数据一致性问题,使高吞吐量成为可能。
5.移动计算而非移动数据
由于 HDFS 支持大文件存储,对于大文件来说,移动计算比移动数据的代价要低。这样也可以减少网络的拥塞和提高系统的吞吐量。
6.协议和接口多样性
为上层应用提供了多种接口,Http RestFul 接口、NFS 接口、Ftp 接口等等 POSIX 标准协议,另外通常会有自己的专用接口。
7.多样的数据管理功能
对于数据压缩、数据加密、数据缓存和存储配额等提供了多样的管理功能。
HDFS缺点
-
不适合低延时数据访问,比如毫秒级的存储数据,是做不到的。
-
无法高效的对大量小文件进行存储。
-
存储大量小文件的话,它会占用NameNode大量的内存来存储文件目录和块信息。这样是不可取的,因为NameNode的内存总是有限的;
-
小文件存储的寻址时间会超过读取时间,它违反了HDFS的设计目标。
-
不支持并发写入、文件随机修改。
-
一个文件只能有一个写,不允许多个线程同时写;
-
仅支持数据append(追加),不支持文件的随机修改。
读写文件
HDFS写数据流程
(1)客户端通过Distributed FileSystem模块向NameNode请求上传文件,NameNode检查目标文件是否已存在,父目录是否存在。
(2)NameNode返回是否可以上传。
(3)客户端请求第一个 Block上传到哪几个DataNode服务器上。
(4)NameNode返回3个DataNode节点,分别为dn1、dn2、dn3。
(5)客户端通过FSDataOutputStream模块请求dn1上传数据,dn1收到请求会继续调用dn2,然后dn2调用dn3,将这个通信管道建立完成。
(6)dn1、dn2、dn3逐级应答客户端。
(7)客户端开始往dn1上传第一个Block(先从磁盘读取数据放到一个本地内存缓存),以Packet为单位,dn1收到一个Packet就会传给dn2,dn2传给dn3;dn1每传一个packet会放入一个应答队列等待应答。
(8)当一个Block传输完成之后,客户端再次请求NameNode上传第二个Block的服务器。(重复执行3-7步)。
HDFS读数据流程
(1)客户端通过DistributedFileSystem向NameNode请求下载文件,NameNode通过查询元数据,找到文件块所在的DataNode地址。
(2)挑选一台DataNode(就近原则,然后随机)服务器,请求读取数据。
(3)DataNode开始传输数据给客户端(从磁盘里面读取数据输入流,以Packet为单位来做校验)。
(4)客户端以Packet为单位接收,先在本地缓存,然后写入目标文件。
为什么HDFS可以做到高可靠性
1、冗余备份
数据存储在这些 HDFS 中的节点上,为了防止因为某个节点宕机而导致数据丢失,HDFS 对数据进行冗余备份,至于具体冗余多少个副本,在 dfs.replication 中配置。
2、跨机架副本存放
仅仅对数据进行冗余备份还不够,假设所有的备份都在一个节点上,那么该节点宕机后,数据一样会丢失,因此 HDFS 要有一个好的副本存放策略,该策略还在开发中。目前使用的是,以dfs.replication=3 为例,在同一机架的两个节点上各备份一个副本,然后在另一个机架的某个节点上再放一个副本。前者防止该机架的某个节点宕机,后者防止某个机架宕机。
3、心跳检测
DataNode 节点定时向 NameNode 节点发送心跳包,以确保 DataNode 没有宕机。如果宕机,会采取相应措施,比如数据副本的备份。
4、数据完整性检测
NameNode 在创建 HDFS 文件时,会计算每个数据的校验和并储存起来。当客户端从 DataNode 获取数据时,他会将获取的数据的校验和与之前储存的校验和进行对比。
5、安全模式
HDFS 启动时,会进入安全模式,此时不允许写操作。这时NameNode 会收到所有 DataNode 节点的数据块报告,在确认安全之后,系统自动退出安全模式。
6、核心文件备份
HDFS 的核心文件是映像文件和事务日志,如果这些文件损坏,将会导致 HDFS 不可用。系统支持对这两个文件的备份,以确保 NameNode 宕机后的恢复。
7、空间回收
从 HDFS 中删除的文件会首先被放入到/trash 中,/trash 文件夹中的内容是被删除文件最后的副本,该文件夹会被定时清空。该文件夹中不存在的文件就彻底不存在了。
常用备份
-
查看所有命令hdfs dfs
-
查看文件列表hdfs dfs -ls/
-
查看文件的内容hdfs dfs -cat
-
创建目录 hdfs dfs -mkdir /目录
-
删除目录 hdfs dfs -rmr /
-
下载到本地 hdfs dfs -copyToLocal /
-
上传到hdfs dfs -copyFromLocal 本地路径 hdfs路径
-
查看压缩文件内容 hdfs dfs -test 文件
-
创建文件 hdfs dfs -touchz
原文来自:https://blog.csdn.net/Teacher_du/article/details/86383508