HDFS相关内容
HDFS介绍
HDFS是Hadoop Distribute File System 的简称,意为:Hadoop分布式文件系统。是Hadoop核心组件之一,作为最底层的分布式存储服务而存在。
**分布式文件系统解决的问题就是大数据存储**
Hadoop 生态图
HDFS的重要特性
首先,它是一个文件系统,用于存储文件,通过统一的命名空间目录树来定位文件;
其次,它是分布式的,由很多服务器联合起来实现其功能,集群中的服务器有各自的角色。
HDFS 的节点
-
NameNode
- 负责管理 DataNode
- 保存所有元数据(目录的位置结构 存储的磁盘位置)
- 保存HDFS的核心,是单点故障 一旦出现问题,整个HDFS不在对外提供服务
- edits 操作日志文件
- fsimage 元数据文件
-
SecondaryNameNode
- 获取Namenode的数据 然后将新的数据进行合并再次写入Namenode
-
DataNode
- 负责数据的存储
- 数据是按块存储 128M 从hadoop2.XXX 开始 hadoop1是64M
- DataNode定时(定时机制)将自己的状态信息告知NameNode
-
副本
- 对DataNode 中的数据块进行备份
- 默认的备份数量是3个
-
归档
- 打包文件
hadoop archive -archiveName test.har -p /input /outfile
- 查看
hdfs dfs -ls har:///outfile/test.har
- 恢复
hdfs dfs -cp har:///outfile/test.har/1.txt /aaa
-
NameNode 下的元数据
-
内存元数据 在服务运行过程中的元数据会保存在内存中 方便快速进行数据操作
-
文件元数据 按照指定规则去将内存中的元数据持久化的以文件形式保存在磁盘上
- edits编辑文件数据 保存了所有的文件操作
# 文件查看 hdfs oev -i edits文件 -o 输出文件
- fsimage文件,保存了文件信息,数据的磁盘路径信息不在fsimage中保存,有DataNode定时告知给NameNode
# 文件查看 hdfs oiv -i fsimage文件 -p 执行文件类型xml -o 输出文件
-
/excpet/data/hadoop
- dfs/data name secondayname
-
-
安全机制
- 一旦安全机制被触发就不能执行事务操作,删除、创建、移动。读取数据不受影响
- 副本数量小于1。 副本在没有被创建,删除了数据,
- 副本创建的数量比例不能小于0.999
- 在条件满足后需要等待30s退出安全机制
HDFS的写入数据
1、 client发起文件上传请求,通过RPC与NameNode建立通讯,NameNode检查目标文件是否已存在,父目录是否存在,返回是否可以上传;
2、 client请求第一个 block该传输到哪些DataNode服务器上;
3、 NameNode根据配置文件中指定的备份数量及副本放置策略进行文件分配,返回可用的DataNode的地址,如:A,B,C;
注:默认存储策略由BlockPlacementPolicyDefault类支持。也就是日常生活中提到最经典的3副本策略。
1st replica 如果写请求方所在机器是其中一个datanode,则直接存放在本地,否则随机在集群中选择一个datanode.
2nd replica 第二个副本存放于不同第一个副本的所在的机架.
3rd replica 第三个副本存放于第二个副本所在的机架,但是属于不同的节点
4、 client请求3台DataNode中的一台A上传数据(本质上是一个RPC调用,建立pipeline),A收到请求会继续调用B,然后B调用C,将整个pipeline建立完成,后逐级返回client;
5、 client开始往A上传第一个block(先从磁盘读取数据放到一个本地内存缓存),以packet为单位(默认64K),A收到一个packet就会传给B,B传给C;A每传一个packet会放入一个应答队列等待应答。
6、 数据被分割成一个个packet数据包在pipeline上依次传输,在pipeline反方向上,逐个发送ack(命令正确应答),最终由pipeline中第一个DataNode节点A将pipeline ack发送给client;
7、 当一个block传输完成之后,client再次请求NameNode上传第二个block到服务器。
HDFS读数据流程
1、 Client向NameNode发起RPC请求,来确定请求文件block所在的位置;
2、 NameNode会视情况返回文件的部分或者全部block列表,对于每个block,NameNode都会返回含有该block副本的DataNode地址;
3、 这些返回的DN地址,会按照集群拓扑结构得出DataNode与客户端的距离,然后进行排序,排序两个规则:网络拓扑结构中距离Client近的排靠前;心跳机制中超时汇报的DN状态为STALE,这样的排靠后;
4、 Client选取排序靠前的DataNode来读取block,如果客户端本身就是DataNode,那么将从本地直接获取数据;
5、 底层上本质是建立FSDataInputStream,重复的调用父类DataInputStream的read方法,直到这个块上的数据读取完毕;一旦到达块的末尾,DFSInputStream 关闭连接并继续定位下一个块的下一个 DataNode;
6、 当读完列表的block后,若文件读取还没有结束,客户端会继续向NameNode获取下一批的block列表;一旦客户端完成读取,它就会调用 close() 方法。
7、 读取完一个block都会进行checksum验证,如果读取DataNode时出现错误,客户端会通知NameNode,然后再从下一个拥有该block副本的DataNode继续读。
8、 NameNode只是返回Client请求包含块的DataNode地址,并不是返回请求块的数据;
9、 最终读取来所有的block会合并成一个完整的最终文件。