大数据学习Hadoop之HDFS
Hadoop和HDFS定义
hadoop广义上讲是指整个大数据学习阶段的hadoop生态圈;狭义上讲就是hdfs和mapreduce,一个用来存储数据,一个用来计算数据。
hdfs是指hadoop分布式文件存储系统,将我们的数据存放在多台服务器上进行存储
文件的存储方式
把大文件切分成多个小文件存储在多个节点上存储
切分:存储时把大的文件切分成多个小的文件,查找时可以根据文件的偏移量进行合并。
等大:文件切分的时候要等大,最后一个不需要
名词:block块(128M),切成的一个小文件就是块
安全:备份block防止小文件合并时出错
Hadoop系统架构
DataNode
数据的存储节点,存储在硬盘中,存放的是文件的数据信息和验证文件完整性的校验信息
当客户端读写数据的时候,首先去NameNode查询文件与Block的映射关系,Block与DataNode的映射关系,然后客户端与DataNode建立连接读写数据
NameNode
功能:
1.接受客户端的读写服务
NameNode存放文件与Block的映射关系
NameNode会记录Block与DataNode的映射关系,但是不会持久化
2.保存文件的元数据信息
3.收集Block的信息
系统启动时,DateNode会将自己节点上存储的Block信息汇报给NameNode
启动完后,DateNode与NameNode保持心跳机制
性能:
NameNode为了效率,将所有的操作都在内存中完成,但数据保存在内存中,掉电易失
NameNodeSecodary
用来合并快照和Edits(让日志大小可控,定时快照保存)
原本快照和日志存储在NameNode中,后为了不占NameNode内存和为了安全,把日志文件和第一次快照加载到SecondaryNameNode上合并生成新的快照,新的快照和新的文件会继续进行合并
安全模式
NameNode启动时的一种状态:
集群启动时把快照读取到内存中并根据日志完善数据,此时监听所需的DataNode是否启动完成,如果没有启动完成,则该系统处于安全模式,只接收客户端的读请求
机架感知原则
block随机选择存储的DataNode节点,要保证副本在集群的安全性和可用性
节点存储在同一机架中,效率高但安全性差;在不同机架中,安全性高但效率低;因此第一个节点随机放,第二和第三个节点,一个放在第一个节点的同一机架,一个放在不同机架,后面其他节点与前面节点不重复
数据的写入流程
1.客户端向HDFS发送数据的写入命令
2.文件系统检查命令的准确性,并通过rpc调用NameNode的creat方法
3.NameNode检查客户端权限及磁盘空间是否满足,如果不满足则抛出异常给客户端,如果满足则创建一个空对象并返回成功状态给文件系统,文件系统会给给客户端创建一个输出流
4.客户端向NameNode请求block存储位置,通过机架感知原则得到。
5.客户端读取数据以packet传输,每个packet由一个Heade,多个checkksum(校验数据)和chuckdate(实际数据)构成,packet会通过队列传输(生成者消费者模式),而且为了数据的安全,会有两个队列,一个DataQueue用来传输,一个AckQueue在传输失败时用来恢复packet继续传输,DataQueue队列中的packet会通过客户端和DataNode的socket通道传输数据,DataNode彼此间通过他们之间的socket通道传输,最后返回ack,整个block传完后关闭通道,接着传输别的block直到所有数据写入完成。
数据的读取流程
1.客户端向文件系统中某个文件发送读取命令
2.文件系统检查命令的准确性,并通过rpc调用NameNode的open方法
3.NameNode检查客户端权限及检查文件是否存在,如果不满足则抛出异常,如果满足则给文件系统返回成功状态,文件创造一个输入流给客户端读取数据
4.客户端获取到Block的多个存储位置,根据就近原则从DataNode读取block数据,依次读取其它block合并一个成文件
Hadoop的高可用
NameNode的备份
ANN
Active NameNode,主节点,功能和原理与NameNode的功能是一样的
SNN
Standby NameNode,备用节点,他和主节点做同样的工作,但是它不会发出任何指令
QJM
Quorum JournalNode Manager 共享存储系统,NameNode通过共享存储系统实现日志数据同步,代替了SecondNameNode存储日志信息。
JournaNode集群,存储日志的集群,它的实现原理和Zookeeper的一致( Paxos),ANN不断向JournaNode提交日志,SNN不断从其得到日志,JournaNode只允许一个NameNode成为作者上传日志。
ZKFC
Failover Controller故障转移控制器,通过zookpper监控NameNode,并通过投票选举出主节点
脑裂
主NameNode因为一些原因被误认为设备故障,备用节点切换为主节点,此时有2个Active节点
解决方案:
1.第三方共享存储:任一时刻,只有一个 NN 可以写入
2.DataNode:需要保证只有一个 NN 发出与管理数据副本有关的命令
3.Client需要保证同一时刻只有一个 NN 能够对 Client 的请求发出正确的响应
Federation
NameNode水平扩展,相当于NameNode集群,两两为一组
每两个NameNode只管理一部分文件,既提高了效率,又增加了隔离性(不同用户请求被隔开)