HDFS通信方式与存储原理
通信方式:
注:其实整个HDFS就是一个库,它向外界暴露HDFS文件系统的接口,让用户使用,但是隐藏了其背后实现功能的复杂性。
所有操作除了可以通过api来代码操作实现还可以通过shell命令实现。
(1)客户端与名称节点之间的连接:使用客户端的协议(比如TCP/IP);
(2)整个集群中名称节点与数据节点之间的交互:使用专门的数据节点协议进行交互;
(3)客户端与数据节点交互:通过远程调用RPC来实现。
存储原理
注:HDFS1.0存在的局限性是致命的,如下图所示,所以到了2.0版本之后。HDFS2.0采用热备份以及不再是一个名称节点,而是多个名称节点,全面得到提升。
存储遇到的问题:冗余数据保存的问题;数据保存策略的问题;数据恢复的问题。
1.冗余保存:在整个HDFS中,每个数据都被冗余保存,默认冗余因子为3(也就是一个数据块会被默认的保存3份);当使用伪分布式的时候,冗余因子只能为1,因为名称节点和数据节点已经在同一个机器上。
冗余存储的好处:
(1)加快数据传输速度(因为有冗余的多个副本,可以实现多个访问者去访问不同的机器)
(2)很容易检查数据错误(因为有多个参照)
(3)保证数据可靠性(假如某一个副本出现故障或者丢失,则系统会自动从其它副本恢复)
2.HDFS存放策略:
假如有一个块以及三个相同的块副本需要存储,那么假如在(也就是说在集群内部)数据节点1上面有个应用发起上传文件(写数据),那么就把第一副本放在发起写入文件块的数据节点机器上【这个就是第一副本的放置原则,假如发起写数据的请求来自集群外部、那么HDFS将会随机的从集群中挑选一台磁盘不太满、CPU不太满的机器放置】。
第二副本的放置策略:放置在和第一副本不同机架的节点上(随机、根据磁盘大小以及CPU决定);
第三个副本的放置策略:放在和第一个副本相同机架的其它节点上。
第4、5、6、7…n个副本放置策略:放在和第一个副本、第三个副本相同机架的其它节点上,采取随机算法放置。
3.数据读取策略:(就近读取)
(1)HDFS提供api可以确定一个数据节点所属的机架ID,客户端也可以调用api获取自己所属的机架ID。
(2)当客户端读取数据时,从名称节点获得数据块不同副本的存放位置列表,列表中包含了副本所在的数据节点,可以调用api来确定客户端和这些数据节点所属的机架ID,当发现某个数据副本对应的机架ID和客户端对应的机架ID相同时就优先选择该副本读取数据,如果没有发现、就随机选择一个副本去读取数据,因为在同一个机架内的机器上读取数据比较快代价比较小。
4.数据的错误和恢复:
(1)名称节点出错
假如名称节点出错,那么;在HDFS1.0当中,会暂时停止一段时间,这段时间内会从第二名称节点中进行冷备份数据的恢复;在HDFS2.0中,会直接从第二名称节点中进行热备份数据的恢复,无需暂停服务。
(2)数据节点出错
数据节点会在远程调用的时候或者其它时间会向名称节点定期发送一个信号,证明该数据节点本身是正常的,假如某一个时段名称节点收不到代表这个含义的信号,那么就表明该数据节点出错。然后,名称节点就会在所有数据节点的列表上标记该数据节点状态为不可用。
并且名称节点会要求该数据节点把正常的数据复制出来分发到正常的其他数据节点上。
(3)数据本身出错
HDFS如何探测数据是否出现错误:数据文件(数据块)在被创建的时候会生成校验码,当去读取数据块的时候会连校验码一起读取,之后如果发现不一致那么将意味着数据在存储过程出现错误。就需要通过数据的冗余机制实现恢复。