@HUST张友东 work@taobao zyd_com@126.com
分类: 服务器与存储
2014-05-27 10:59:22
作者:zyd_com@126.com
博客:ydzhang.blog.chinaunix.net | blog.yunnotes.net
微博:
硬件故障是常态
HDFS的目标是在有机器故障时仍能保证数据可靠,并自动进行故障恢复。
流式数据访问
HDFS主要为批处理应用设计,而非交互式应用,看重数据访问的吞吐量而非访问延迟。
海量大文件存储
HDFS主要针对大文件存储设计,一个典型的HDFS文件大小在数G到数T之间,由多个64M的block组成,一个集群内能支持海量的文件(百万至千万级别)。
简单的一致性模型
HDFS提供一次写多次读(write-once-read-many)的访问模型,文件只允许在末尾追加数据,这种模型简化了多副本一致性问题,提供高的数据访问吞吐量,非常适合做map/reduce。
迁移计算vs迁移存储
【把计算调度到数据所在的位置远】比【把数据迁移到计算所在位置】成本低,HDFS提供了接口将应用移到离数据近的位置。
支持异构软硬件
HDFS基于跨平台的java语言开发,能方便的兼容各种异构的软硬件。
全局中心节点
NameNode(NN)是HDFS里的中心管理节点,NN上的元数据全内存化,元数据主要分为两个部分:(1) 文件的元信息,如大小、时间戳、包含的block等;(2) block到DataNode(DN)的映射关系。前者持久化在NN本地,而后者则是在集群里DN启动时,由DN汇报上来。
元数据持久化
NN以fsimage的形式将集群内所有文件的元数据存储到本地,成,运行过程中NN会将文件系统的更改(如创建新的文件)记录到editlog。NN启动时,加载fsimage,并合并editlog的更改日志,在内存里建立整个文件系统的目录树结构;
存储节点管理
DN在启动时,会向NN汇报存储的block信息,并周期性的向NN发送心跳信息,NN超过一定时间没有收到DN的心跳,就认为DN发生故障。
副本放置策略
HDFS通常配置3个副本,在创建block时,会将其中二个副本存储到离客户端近的机架里,将第三个副本存储到另外的机架;由于机架内部的网络带宽远大于机架间的网络带宽,HDFS的策略实际上是数据安全(所有副本分散在不同机架)与写数据效率(所有副本分散在同一机架)的折中方案。
故障恢复
当DN机器发生故障时(通常是磁盘坏掉),该磁盘上存储block的副本都会出现副本不足,NN会复制这批block,让其副本达到安全值。
安全模式
HDFS集群刚启动时,所有的DN都会向NN汇报block,当集群规模较大时汇报时间也会较长。NN启动后会先以安全模式运行一段时间(如30s),等待DN汇报block完毕,待安全模式时间过后,一旦NN检测到block副本数不足,就会对block进行复制。
负载均衡
当集群内某个DN空闲的存储空间太少时,NN会主动将该DN的一些数据(block)迁移到其他的DN上;另外,当某个block的数据访问量较大时,NN会主动创建该block额外的副本,用于分担访问请求。
数据完整性
用户从DN读取文件数据时,因DN磁盘或网络问题、软件bug等原因,客户端可能读到错误的数据。HDFS在写入文件时,为文件的每个block计算校验和,当读取文件数据时,客户端通过对数据计算校验和来确认读到数据的完整性。
流水线复制
客户端在写入时,为保证最大吞吐量,客户端会将数据先缓存到本地文件,当客户端缓存的数据超过一个block大小时,会向NN申请创建block,将数据写到block里。在往block的多个副本写入数据时,HDFS采用流水线复制的方式,比如block的三个副本在A、B、C上,客户端将数据推送给最近的A、A收到数据后立即推送给B、B推送给C,等所有副本写入成功后,向客户端返回写入成功,当文件所有的block都写入成功后,客户端向NS请求更新文件的元信息。
参考资料