HDFS组成角色及其功能
1. Client:客户端2. NameNode (NN):元数据节点
管理文件系统的Namespace元数据
处理客户端读写请求
3. DataNode (DN):数据节点
数据存储节点,保存和检索Block
执行数据读写操作
4. Secondary NameNode (SNN):从元数据节点
合并NameNode的edits到fsimage文件中
辅助NN将内存中元数据信息持久化
HDFS写流程
1.client请求
client通过DFS向NN请求(源文件已存在)
2.NN确认
目录存在、用户无操作权限return false否则return true
3.client切分并请求第一个Block DN
client将文件切成n个128M的Block
client向NN请求第1个Block的存储DN列表
4.NN返回DN列表
假如返回: dn1 dn2 dn3
5.client写入
a. FSDOS向dnl请求写入
b. dn1请求dn2 , dn2请求dn3,分别建立pipeline管道
c. dn3响应dn2 ,dn2响应dn1 , dn1响应client
d. Block传输
d.1: client读取第一个Block并以Packet(64k)为单位传输, dn1每收到一个Packet会建立等待应答队列,并逐级传输给dn2 , dn3
d.2: dn3 ,dn2 , dn1逐级应答,并将结果反馈给client
d.3:重复d.1~2直至Block传输完成
6.client发送complete给NN
7.重复3~6直至所有Block传输完成
8.关闭FileSystemDataOutputStream
HDFS读流程
1.client创建DFS
DFS dfs = Filesystem. open ()
2.DFS向NN请求RPC获取【文件开始部分或全部】Block有序列表
列表按距离client的距离升序排序
每个Block包含DN地址,如果client就是DN,则本地读取
3.DFS向client返回支持文件定位的输入流对象FSDIS
FSDIS中包含一个(DFSIS) DFSInputstream,用来管理DN和NN之间的IO
如:
DN中数据缺失或者下载一部分之后任务失败,则可以通过DFSInputstream联系NN求助
NN借助YARN找到距离最近的另一个备份节点
将未完成的下载任务迁移到该节点,并通过【支持文件定位】的输入流对象FSDIS进行【续传】
4.client调用FSDataInoutStream的read()找到离client最近的DN,并连接DN
5.DFSIS依次读取一个批次的Block
a.读取包含文件第一个Block的最近DN地址
b.重复调用read()方法,直至第一个Block读取完成
c.关闭DN连接
d.重复a~c直至第一个批次的Block全部读取完成
6.重复2~5,直至所有批次的Block读取完成
7.关闭DFSIS(distribute file system inputstream),FSDIS(file system datainput stream),DFS(distribute file system)