首先要了解的是,HDFS采用的是主从架构,即一个主节点(名称节点),多个从节点(数据节点),主节点起到管家做用,负责提供数据目录服务,从节点都是数据节点负责数据存储。shell
咱们都知道文件系统中都是有命名空间的概念的,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)数据出现错误:客户端读取数据后会对它的数据进行校验码验证(每一个文件都有一个校验码),若是发现校验码不对,就说明数据除了问题,校验码是在文件被建立的时候生成的,即客户端每写入一个文件都会为该数据块生成一个校验码,把它保存在同一文件目录下,下次读取的时候会连带校验码一块儿读取,读到以后进行计算,把计算获得的校验码和上次生成的校验码进行比较,若是不一致,说明数据存储过程当中发生了错误,而后对错误数据进行恢复和复制。