1.Hadoop与HDFS的关系
Hadoop实现了一个分布式文件系统,即Hadoop Distributed File System,简称HDFS。对外部客户机而言,HDFS就像一个传统的分级文件系统,所以,很多时候,我们也叫它DFS(Distributed File System)。可以理解为HDFS是Hadoop中的一个部件。
文件系统由三部分组成:文件管理软件、被管理文件、文件存储结构
2.HDFS存储(流处理,块存储)
HDFS以流处理访问模式来存储文件的。分布化的文件系统会因为分布后的结构不完整,导致系统复杂度加大。那么HDFS如何来保证完整性的?HDFS的解决方案是分片冗余,本地校验。冗余后的分片中只要有一份是完整的,经过多次协同调整之后,其他分片文件也将完整。所以,整个系统里的文件是完整的。
3.元数据
元数据:用于描述要素、数据集或数据集系列的内容、覆盖范围、管理方式等相关信息,简单的说,就是关于数据属性的数据。
元数据包括:
——文件系统目录树信息
*文件名,目录名
*文件和目录的大小,创建及最后访问时间
*权限,文件和目录的从属关系
——文件和块的对应关系
*文件由哪些块组成
——块的存放位置
*机器名,块IP
HDFS就是将巨大的数据变成大量数据的数据。
3.HDFS架构
一个HDFS文件系统包括一个主控节点Namenode和一组从节点DataNode。
Namenode:是一个主服务器,用来管理整个文件系统的命名空间和元数据。
Namenode保存了文件系统的三种元数据:
1)命名空间,整个分布式文件系统的目录结构
2)数据块与文件名的映射表
3)每个数据块副本的位置信息,每个数据块默认有三个副本
Namenode可以执行文件操作,比如打开、关闭、重命名;同时向DataNode分配数据块并建立数据块和DataNode的对应关系。
DataNode:块的实际数据存放,用来实际存储和管理文件的数据块,客户端读取写入的时候直接与DataNode通信。
DataNode处理用户具体的数据读写请求,同时处理Namenode对于数据块的创建、删除副本的指令。
4.数据块
HDFS最大的特点是使用了数据块的存储方式。
HDFS中每个块是一个独立的存储单位,以块为单位在集群服务器上分配存储。
使用块的好处:
(1)当一个文件大于集群中任意一个磁盘的时候,文件系统可以充分利用集群中所有的磁盘。
(2)管理块使底层的存储子系统相对简单
(3)块更加适合备份,为容错和高可用性的实现带来方便
(4)实现了名字与位置的分离,存储位置的独立性
块的备份:
(1)每个块在集群中存储多份(replica)
(2)某个块的所有备份都是同一ID
(3)系统可以根据机架的配置自动分配备份位置
5.HDFS客户端的访问流程
A. 首先,用户的应用程序通过HDFS 的客户端程序将文件名发送至NameNode 。
B. NameNode 接收到文件名之后,在HDFS 目录中检索文件名对应的数据块,再根据数据块信息找到保存数据块的DataNode 地址,将这些地址回送给客户端。
C. 客户端接收到DataNode 地址之后,与DataNode 并行地进行数据传输操作,同时将操作结果的相关日志(比如是否成功,修改后的数据块信息等)提交到NameNode 。
6.数据的读取过程
A. 客户端调用FileSystem 实例的open 方法,获得这个文件对应的输入流InputStream
B. 通过RPC 远程调用NameNode ,获得NameNode 中此文件对应的数据块保存位置,包括这个文件的副本的保存位置( 主要是各DataNode的地址) 。
C. 获得输入流之后,客户端调用read 方法读取数据。选择最近的DataNode 建立连接并读取数据。
D. 如果客户端和其中一个DataNode 位于同一机器(比如MapReduce 过程中的mapper 和reducer),那么就会直接从本地读取数据。
E. 到达数据块末端,关闭与这个DataNode 的连接,然后重新查找下一个数据块。
F. 不断执行第2 - 5 步直到数据全部读完
G. 客户端调用close ,关闭输入流DF S InputStream
7.数据的写入过程
A. 客户端调用Fi leSystem 实例的create 方法,创建文件。NameNode 通过一些检查,比如文件是否存在,客户端是否拥有创建权限等;通过检查之后,在NameNode 添加文件信息。注意,因为此时文件没有数据,所以NameNode 上也没有文件数据块的信息。
B. 创建结束之后, HDFS 会返回一个输出流DFSDataOutputStream 给客户端。
C. 客户端调用输出流DFSDataOutputStream 的write 方法向HDFS 中对应的文件写入数据。
D. 数据首先会被分包,这些分包会写人一个输出流的内部队列Data 队列中,接收完数据分包,输出流DFSDataOutputStream 会向NameNode 申请保存文件和副本数据块的若干个DataNode , 这若干个DataNode 会形成一个数据传输管道。DFSDataOutputStream 将数据传输给距离上最短的DataNode ,这个DataNode 接收到数据包之后会传给下一个DataNode 。数据在各DataNode之间通过管道流动,而不是全部由输出流分发,以减少传输开销。
E. 因为各DataNode 位于不同机器上,数据需要通过网络发送,所以,为了保证所有DataNode 的数据都是准确的,接收到数据的DataNode 要向发送者发送确认包(ACK Packet ) 。对于某个数据块,只有当DFSDataOutputStream 收到了所有DataNode 的正确ACK. 才能确认传输结束。DFSDataOutputStream 内部专门维护了一个等待ACK 队列,这一队列保存已经进入管道传输数据、但是并未被完全确认的数据包。
F. 不断执行第3 - 5 步直到数据全部写完,客户端调用close 关闭文件。
G. DFSDataInputStream 继续等待直到所有数据写人完毕并被确认,调用complete 方法通知NameNode 文件写入完成。NameNode 接收到complete 消息之后,等待相应数量的副本写入完毕后,告知客户端。
原文地址:https://www.cnblogs.com/m-study/p/8343115.html