首先要了解的是,HDFS采用的是主从架构,即一个主节点(名称节点),多个从节点(数据节点),主节点起到管家作用,负责提供数据目录服务,从节点都是数据节点负责数据存储。
我们都知道文件系统中都是有命名空间的概念的,HDFS也不例外,它的命名空间只有一个,里面包含了目录、文件、块,它的使用和传统的文件体系是一样的,我们访问HDFS文件系统,也和传统的访问方式一样通过 / + 目录名称访问。
提到访问数据,就必须知道HDFS的通信协议。所有的HDFS通信协议都是构建在TCP/IP的基础之上,而且不同组件之间,通信协议会有些差别,比如,客户端向名称节点发起的TCP连接,是使用客户端的协议和名称节点进行交互。而整个集群中名称节点和数据节点之间的交互是使用专门的的数据节点协议进行交互的,另外经常涉及到客户端读取数据,就需要客户端和数据节点进行交互,它通过远程调用RPC来实现。整个HDFS客户端实际上就是一个库,它向外界暴露HDFS文件系统的接口而且还隐藏了后台实现的复杂性,整个操作除了可以通过JAVA API实现,也可以直接通过shell命令实现。
对于分布式文件系统中经常遇到的几个问题,HDFS给出了如下解决方案:
(1)冗余数据保存的问题:数据以块为单位,每个块都被冗余保存,一般一个数据块被默认保存为三份。这种设计方式的好处:
1)加快数据传输速度(若多个客户端同时访问,可保证去访问冗余块即并行操作);
2)很容易检查数据错误(即通过检查冗余块对比数据检查错误);
3)保证数据可靠性(若某机器坏掉仍保证数据可用,且在HDFS中,若副本量低于预设值,系统会自动复制副本达到预设值)
(2)数据保存策略问题:第一个块来了之后,保存三个副本,第一个副本放在上传文件的数据节点上(若发送请求不再集群内部,则会随机挑选一台磁盘不太满,CPU又不太忙的节点,将第一个副本放在上面),第二个副本会放在和第一个副本不同机架的节点上,第三个副本放在第一个副本相同的机架节点上。这样的优势显而易见,可以保证某个服务器或某个机架出现问题后,其余副本还能正常工作
(3)数据恢复的问题:在数据的存储中经常会发生数据错误,这时候就需要数据恢复策略来恢复数据。HDFS中可能出现数据问题的地方有以下几种:
1)名称节点出错:HDFS 1.0版本通过第二名称节点进行冷备份,但是这样的缺点也是显而易见的,即数据需要一定的时间恢复,在这段时间里,HDFS是无法提供对外服务的。而在HDFS 2.0版本中实现了热备份,即如果名称节点出了问题,第二名称节点会即时顶替名称节点工作,而不存在数据恢复时间。
2)数据节点出错:数据节点会定期向名称节点发送心跳信息(用来告诉名称节点自己可用),若名称节点探测到某个数据节点不可用,则将其余数据节点中的备份再复制一份到另一个机器(即随时保持副本的数量为预设值)
3)数据出现错误:客户端读取数据后会对它的数据进行校验码验证(每个文件都有一个校验码),如果发现校验码不对,就说明数据除了问题,校验码是在文件被创建的时候生成的,即客户端每写入一个文件都会为该数据块生成一个校验码,把它保存在同一文件目录下,下次读取的时候会连带校验码一起读取,读到之后进行计算,把计算得到的校验码和上次生成的校验码进行比较,如果不一致,说明数据存储过程中发生了错误,然后对错误数据进行恢复和复制。