Hadoop系列(二)Hadoop三大核心之HDFS基础


针对海量数据,核心问题始终是计算和存储。当数据集的大小超过一台独立物理计算机的存储能力时,就有必要对它进行分区并存储到多台机器上。跨机器存储的文件系统就被成为分布式文件系统。分布式系统架构于网络之上,势必引入网络编程的复杂性,如何实现容忍节点故障但不丢失数据,是HDFS的重要挑战。

hdfs基础

Hadoop 自带HDFS分布式文件系统:Hadoop Distributed Filesystem。也简称DFS。主要用来解决海量数据的存储问题。

HDFS有以下两点特性

  • 文件系统:用于存储文件,通过统一目录树定位
  • 分布式:很多机器共同支撑其功能

重要概念

数据块

和一般的文件系统一样,HDFS也有块(block)的概念,HDFS上的文件也被划分为块大小的多个分块作为独立的存储单元。

Hadoop 1.x 默认大小为64MB, 2.x和3.x均为128MB。具体指定版本的默认值,可参见官网块的定义。HDFS的块比磁盘的块大,是为了最小化寻址开销,减少寻址定位所需时间。

与磁盘文件系统不一样的是**HDFS中小于一个块大小的文件不会占据整个块的空间 **例:当一个1MB的文件存储在一个128MB的块中时,文件只使用1MB的磁盘空间,而不是128MB。当一个150M的文件要存储到HDFS中,将会拆分成2个块,大小分别是128M、22M。

设置数据块的好处:

(1)一个文件的大小可以大于集群任意节点磁盘的容量

(2)容易对数据进行备份,提高容错能力,块丢失可快速从其它节点复制

(3)使用抽象块概念而非整个文件作为存储单元,大大简化存储子系统的设计

HDFS集群有两类节点以管理节点-工作节点的方式运行。即NameNode和DataNode。

NameNode(NN)

文件系统的管理节点。管理文件系统的命名空间,维护着文本系统树及整棵树内所有文件和目录。基于内存存储,在内存中保存着文件系统每个文件和每个数据块的引用关系以及块信息等。文件目录在NameNode重启后,需要重建。

功能:

  • 接收客户端读写服务
  • 收集DataNode汇报的Block列表信息

DataNode(DN)

文件系统的工作节点,多个节点共同工作。本地磁盘目录存储数据,文件形式。

功能:

  • 文件形式存储数据(Block)
  • 存储Block的元数据信息文件 (md5)
  • 启动时向NameNode汇报block信息
  • 与NameNode保持心跳连接(3s/次)

NameNode虽然以内存方式存储,但是NameNode也会在适当时候持久化两类文件到磁盘。

  • fsimage:NameNode启动时对整个文件系统的快照
  • edit logs:NameNode启动后,对文件系统的改动序列

只有在NameNode重启时,edit logs才会合并到fsimage文件中,从而得到一个文件系统的最新快照。但是在产品集群中NameNode是很少重启的,这也意味着当NameNode运行了很长时间后,edit logs文件会变得很大。这会引发以下严重问题:1.edit logs文件会变的很大,不容易管理;2.重启会花费很长时间,因为有很多改动,可能经历好几个小时甚至几十个小时,这是不能容忍的。

Secondary NameNode (SNN)

SecondaryNameNode就是来帮助解决上述问题的,职责是帮助NN合并edits log成fsimage,减少NameNode启动时间

SNN 合并edits触发条件:
1.定期触发。默认一小时。
2.时间未到的情况,edits log大小超过容量也会触发。默认 64M。

配置文件core-site.xml 可设置时间间隔(fs.checkpoint.period )和edits log容量(fs.checkpoint.size)。

Hadoop 特点

HDFS也是按照Master和Slave的结构。分NameNode、SecondaryNameNode、DataNode这几个角色。

因其架构方案,拥有很多特点:
保存多个副本,且提供容错机制,副本丢失或宕机自动恢复(默认存3份)。
  可运行在廉价的机器上
  适合大数据的处理。HDFS默认会将文件分割成block。然后将block按键值对存储在HDFS上,并将键值对的映射存到内存中。

当然HDFS也有其局限性:
1.低延时数据访问。在用户交互性的应用中,应用需要在ms或者几个s的时间内得到响应。由于HDFS为高吞吐率做了设计,也因此牺牲了快速响应。对于低延时的应用,可以考虑使用HBase或者Cassandra。
2.大量的小文件。标准的HDFS数据块的大小是64M,存储小文件并不会浪费实际的存储空间,但是无疑会增加了在NameNode上的元数据,大量的小文件会影响整个集群的性能。
3.多用户写入,修改文件。HDFS的文件只能有一个写入者,而且写操作只能在文件结尾以追加的方式进行。它不支持多个写入者,也不支持在文件写入后,对文件的任意位置的修改。
但是在大数据领域,分析的是已经存在的数据,这些数据一旦产生就不会修改,因此,HDFS的这些特性和设计局限也就很容易理解了。HDFS为大数据领域的数据分析,提供了非常重要而且十分基础的文件存储功能。

Hadoop HA

可靠性

  1. 冗余备份
    每个文件存储成一系列数据块(Block)。为了容错,文件的所有数据块都会有副本(副本数量即复制因子,可配置)(dfs.replication)
  2. 副本存放
    采用机架感知(Rak-aware)的策略来改进数据的可靠性、高可用和网络带宽的利用率
  3. 心跳检测
    NameNode周期性地从集群中的每一个DataNode接受心跳包和块报告,收到心跳包说明该DataNode工作正常
  4. 安全模式
    系统启动时,NameNode会进入一个安全模式。此时不会出现数据块的写操作。
  5. 数据完整性检测
    HDFS客户端软件实现了对HDFS文件内容的校验和(Checksum)检查(dfs.bytes-per-checksum)。

单点故障问题

因为NameNode部署为单点失效,存在单点故障问题,当NameNode,那么客户端或MapReduce作业均无法读写查看文件。注意HDFS已有存储不会丢失。

解决方案:

启动一个拥有文件系统元数据的新NameNode(这个一般不采用,因为复制元数据非常耗时间)
配置一对活动-备用(Active-Sandby)NameNode,活动NameNode失效时,备用NameNode立即接管,用户不会有明显中断感觉。
    共享编辑日志文件(借助NFS、zookeeper等)
    DataNode同时向两个NameNode汇报数据块信息
    客户端采用特定机制处理 NameNode失效问题,该机制对用户透明

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章