一、何为HDFS
HDFS全称是Hadoop Distributed File System,为Hadoop两大核心之一(另一个是MapReduce)。
在单个计算机中,由于硬件性能局限,难以存储大量数据,因此可以利用集群的思想来处理海量数据。集群结构上,一个机架上配多台计算机,多台计算机通过光纤交换机互连,不同机架间通过更高速的网络互联,从而形成集群网络。
集群中存在主从节点,主节点通常只有一个承担数据目录服务,从节点完成数据的具体存储。
二、HDFS优势及缺陷
- 优势
- 兼容廉价的硬件设备
- 实现流数据读写
传统文件系统的块为单位进行读写,不适合大量数据读写,而HDFS可以支持大批量数据读写。 - 支持大数据集
可以管理大到几个TB的文件。 - 支持简单的文件模型
只允许追加,不允许修改,能快速处理批量数据集 - 跨平台兼容性
Java语言实现带来的跨平台特性。
- 缺陷
- 不适合低延迟数据访问
由于面向大批量读写,因此精确读取某条数据时很耗时,需要取出后再筛选,因此不适合实时性数据处理(HBase可以满足实现性处理需求)。 - 无法高效储存大量小文件
HDFS是通过NameNode中的数据目录(元数据)去查找的,当小文件过多,数据目录过大会导致搜索耗时增加,效率降低。 - 不支持多用户写入及任意修改文件
只允许追加不允许修改导致的。 - 性能受限于名称节点
由于所有读写操作都需要先访问名称节点,因此名称节点的吞吐量会影响系统性能。
三、HDFS涉及三个重要概念
-
块
作用:以块为单位进行磁盘读写,从而分担磁盘寻址开销。
普通文件系统中块一般为几千字节,存储在一个机器上。而HDFS默认为64MB且可自行设计块大小,存储在多个机器上。 -
名称节点 = NameNode = master机
作用:整个HDFS的数据管家,寻找文件时需先访问名称节点,元数据是存储在内存中的,因此处理性能较好。
包含两个核心数据结构:FsImage和EditLog
FsImage:存储相关元数据,记录文件复制等级、修改和访问时间、块大小及组成文件的块及访问权限。需要注意的是,实际文件块信息不由此数据结构存储,而是在数据节点接入名称节点时进行汇报并存入内存中的某块区域的。
EditLog:存储创建、删除、重命名等操作。更新的部分单独放到EditLog部分而不去修改FsImage,从而提高FsImage性能。
名称节点启动过程:发起启动命令——》合并FsImage和EditLog以形成新的数据目录——》新的数据目录存入FsImage并创建一个空的EditLog。 -
第二名称节点
作用:①对名称节点进行冷备份 ②对运行过程中不断增大的EditLog进行处理,降低EditLog占用内存逐渐增大造成的影响。
②的原理:将EditLog拷贝到第二名称节点的同时在名称节点生成新的EditLog,接着以HTTP GET的方式从名称节点上获取FsImage,接着合并FsImage与EditLog为新的FsImage并送回给名称节点并覆盖旧的FsImage。 -
数据节点 = DataNode = worker机
作用:负责实际存储数据,并将数据存入本地磁盘中。在找到数据所在地(即和名称节点交流后)都是直接和数据节点打交道的。
四、HDFS存储原理
-
数据冗余保存
由于廉价PC机出故障是常态,因此需要冗余保存数据。一般默认的冗余因子是三,也就是一个数据块会被存为三份,具体可在hdfs-site.xml中设置 dfs.replication 属性。
好处:
①加快数据传输(可从其他冗余数据所在机上进行数据访问,不必按先后访问原始数据机器)
②易检查数据错误(通过比对副本数据,检查一致性)
③保证数据可靠性(若有副本损坏,将重新复制副本,使得副本数量恢复到冗余因子3的水平)
Tips:Hadoop伪分布式模式由于只用一台机器部署,因此冗余因子只能为1。 -
冗余数据保存策略
第一副本:内部上传放在上传文件的数据节点,集群外部上传则随机挑选一台CPU不太忙、磁盘不太满的数据节点上。
第二副本放在与第一个副本不同的机架上。
第三、四、···副本用随机算法放在第一份副本机架相同的数据节点上。
读取时使用HDFS提供的API确定所属机架ID,从而就近选择数据节点进行读取,优先找和自己同一机架内的数据节点进行读取,若没有发现则随机挑选。 -
数据的错误和恢复
①名称节点出错
通过SecondaryNameNode进行数据恢复,Hadoop1.0进行的时冷备份,Hadoop2.0进行的时热备份。
②数据节点出错
数据节点会定期通过远程调用对名称节点发送心跳信息,一旦一个周期未收到某节点的心跳信息则认为该数据节点已宕机。此时名称节点作为管家,会对该数据节点上数据在其他数据节点的冗余副本进行复制,从而将冗余数据数量恢复到冗余因子水平。(HDFS和其他分布式文件系统最大的区别就是可以调整冗余数据的位置,当负载不均时也可通过跳转数据位置实现负载均衡)
③数据本身出错
校验码在数据块创建时生成,在读取时计算校验码与生成的校验码进行校验。客户端读取数据后会进行校验码校验,若校验码不对则说明文件数据出错。
五、HDFS读写文件过程
后面会专门做一篇关于HDFS读写原理的文章,这里先放个空链接。