3|3 HDFS详解 2018-05-24

1.HDFS的三个进程 NameNode(NN):名称节点,Client第一个操作对象;
DataNode(DN):数据节点,存储数据;
Secondary NameNode(SNN):第二名称节点;
2.Block数据块 大小:
旧版本:64M
新版本:128M
参数: dfs.blocksize
3.副本数 dfs.replication : 3
一个块会变为3个块
【3|3 HDFS详解 2018-05-24】hadoop2.x一般公司就3个
hadoop3.0 : 1.5(新特性 纠删码) 1+0.5
4.架构设计 3|3 HDFS详解 2018-05-24
文章图片
HDFS架构
3|3 HDFS详解 2018-05-24
文章图片
Secondary NameNode 流程
NameNode: 文件系统的命名空间
1.文件名称
2.文件目录结构
3.文件的属性(权限 创建时间 副本数)
4.文件对应哪些数据块--》这些数据块对应哪些DataNode节点上
不会持久化存储这个映射关系,是通过集群的启动和运行时,datanode定期发送blockReport给NameNnode,以此NameNode在【内存】中动态维护这种映射关系。
存储:维护文件系统树及整个树内的所有文件和目录,这些信息以两种文件形式永久保存在本地磁盘上:命名空间镜像文件fsimage、编辑日志editlog
DataNode:
存储: 数据块、数据块校验和
与NameNode通信:
1.每隔3秒发送一次心跳,参数可配置
2.每隔10次心跳发送一次blockReport(30s)
Secondary NameNode:
存储: 命名空间镜像文件fsimage、编辑日志editlog
作用: 定期合并fsimage+editlog文件为新的fsimage,推送给NameNode,称为检查点,checkpoint
参数: dfs.namenode.checkpoint.period:3600 秒/

实验: NameNode挂了,Secondary NameNode去恢复(企业不用) http://hmilyzhangl.iteye.com/blog/1407214

5.机架rack 机柜,每个机柜分别有各自的 IP 段
rack1挂了,rack2还能提供服务
6.副本放置策略 3|3 HDFS详解 2018-05-24
文章图片
副本放置策略 7.文件读写流程 3|3 HDFS详解 2018-05-24
文章图片
文件读流程
1、Client通过FileSystem.open(filePath)方法,去与NameNode进行RPC通信,返回该文件的部分或全部的Block列表(也包含该列表各Block的分布在Datanode地址的列表),也就是返回FSDataInputStream对象;
2、Client调用FSDataInputStream对象的read()方法:
a.去与第一个块的最近的datanode进行read,读取完后,会check,假如successful,会关闭与当前DataNode的通信(假如check fail,则记录失败的块与DataNode信息,下次就不再读取,去该块的第二个DataNode地址读取);
b.然后去第二个块的最近的DataNode上进行读取,check后会关闭与DataNode的通信;
c.假如Block列表读取完成,文件还未结束,那么FileSystem会从NameNode获取下一批的Block的列表(读操作对于Client端是透明的,感觉就是连续的数据流);
3、Client调用FSDataInputStream.close()方法,关闭输入流。

3|3 HDFS详解 2018-05-24
文章图片
文件写流程
1、Client调用FileSystem.create(filePath)方法,与NameNode进行RPC通信,check该路径的文件是否存在以及有没有权限创建该文件,假如OK,就创建一个新文件,但是并不关联任何block,返回一个FSDataOutputStream对象(假如check fail,则返回错误信息,所以写代码要try-catch);
2、Client调用FSDataOutputStream对象的write()方法,将第一个块写入第一个DataNode,第一个DataNode写完传给第二个节点,第二个写完传给第三个节点,当第三个节点写完返回一个ack packet 给第二个节点,第二个节点返回一个ack packet给第一个节点,第一个节点返回ack packet给FSDataOutputStream对象,意思标识第一个块写完,副本数为3,剩余块按此以此写(当然写操作对于Client端也是透明的);
3、当文件写入数据完成后,Client调用FSDataOutputStream.close()方法,关闭输出流,flush缓存的数据包;
4、再调用FileSystem.complete()方法,告诉NameNode节点写入成功。

    推荐阅读