HDFS是根据GFS论文设计出来的。
HDFS默认一个块的大小是64mb
小的文件用HDFS来存储反而性能更差。
HDFS的设计目标
- 兼容廉价的硬件设备:在硬件故障的时候也能保障数据完整。
- 简单的文件模型:一次写入,多次读取
- 跨平台:使用java语言实现
HDFS劣势: - 不适合低延迟数据访问,低延迟可以使用HBase数据库
- 无法高效存储大量小文件。
- 不支持多用户写入及任意修改文件。一个文件只能有一个写入者(是指只能由一个角色
写还是同一时间一个人写?),且文件只能追加不能随机写。
整个系统本身采用主从结构,每个集群又分为一个名称节点namenode和多个数据节点datanode。 - 名称节点的功能是负责协调数据的读、写,分配命名、空间等资源。
- 数据节点负责实际的执行数据块的创建、删除和复制。
数据的存取策略
HDFS系统中的数据会被分成多个块,每个块会进行冗余副本的复制,所有的副本中,第一块会被写入到接到写入请求的那个数据节点上,其他的块写入另一个机架的数据节点中。
读取的时候会先向namenode询问数据所在的数据节点,然后负载均衡分配读取目标,顺序(为什么不是并行?)读取各个数据块,最后进行散列值验证。
常见故障和修复
名称节点出错—元信息同步其他文件系统,准备第二名称节点,故障时第二名称节点首先同步元信息之后,替换工作。
数据节点出错—通过心跳包来检测,当宕机时,名称节点会找新的机子启动数据复制,再造一个同样的数据节点出来。
数据出错—数据块散列值校验出错,则会访问其他副本。并且后续会重新复制制作失效的数据块。