Hadoop权威指南读书笔记(三)——认识HDFS

一、什么是HDFS

尽管磁盘容量的发展速度很快,但单台物理机的存储能力面对海量数据是远远不够的。分布式的存储是大数据的基石。管理跨多台计算机存储的数据/文件,是分布式文件系统角色的定位。Hadoop的分布式文件系统是HDFS,以流式数据访问模式(在后面对HDFS读取/写入文件进行剖析的时候会具体阐述) 来存储超大的文件。

分布式文件系统,其主要的 几个难点在于如何容忍节点故障(高可用性–HA)、保障数据准确性和一致性、实现负载均衡、提高读写效率。这几个点在本书第三章基本都有介绍,这篇博客会先对HDFS的设计理念和一些基本概念,包括数据块、NameNode、DataNode等等进行学习,后面会针对每个点进行专门的记录。

二、HDFS的设计理念

根据书上的内容,简单列几条,先有个映像。

  • 这里的超大文件达到PB级别甚至更大。
  • HDFS面对的离线数据应用场景,往往是一次写入、多次读取,支持OLAP分析。因此,读取整个数据集的时间延迟比读取第一条记录的时间延迟(类似寻址时间)更重要。
  • 集群中的机器(普通硬件)的故障几率是比较高的,HDFS需要有容忍节点故障的能力,保证HA。
  • HDFS不适合低延时的数据访问,其以牺牲低延时为代价,保证高吞吐量。
  • HDFS整个文件系统的元数据都存储在NameNode的内存中,这是集群存储容量的瓶颈之一。
  • HDFS不支持多个进程同时写入

三、数据块

磁盘都有默认的数据块大小,数据块是读写数据文件的最小单位。对于机器的本地文件系统,也有文件系统的块概念,一般文件系统的块大小是磁盘块大小的整数倍(磁盘一般为512bytes,文件系统可以为KB级别)。

面对更大的数据量级,HDFS需要更大的数据块大小(默认是128MB)。存储在HDFS上的文件也以数据块大小被分割成多个块,每个块是一个独立的存储单元,分布在集群中的不同节点上。(注意若文件小于块大小,则不会占据整个块的空间,而是文件大小的空间)

HDFS的数据块大小被设计为这么大(相对于local fs)的原因,是为了最小化寻址开销。(用白话来说,希望一次寻址的开销可以尽量读取更多的文件) 分布式文件系统面对的文件大小量级更大,相对应更大的数据块大小可以使定位块开始位置的时间在整个读写过程中占比变得更少,大量的时间需要花费在数据传输上。举例,对于一个数据块,假设固定的寻址时间为10ms,磁盘读写速率为100MB/s,为了使寻址时间只占传输时间的1%,块大小需要设定为100MB。随着磁盘读写速率的提升,块大小可以被设置得更高。

有同学说,那数据块大小无限增大,岂不是寻址开销趋近于0。如果块大小过大,那么对于一个文件来说,其被split为块的数量就会变少。对于一个map task,通常每个task处理一个块的数据,那么task的数量过少,作业运行的速度就会变慢(并行度降低)。

块的概念对于分布式文件系统有如下几个好处:

  1. 文件大小可以大于集群中任意一个机器的磁盘容量。因为单个文件会被split为过个block,这些blocks不需要被存储在单个机器上。
  2. 使用块这个抽象概念作为存储单元,可以简化文件系统的设计。由于块的大小是固定的,可以很容易计算出单个磁盘容量对应的块数量。且对于文件的元数据,可以和文件本身的存储解耦,进行单独管理。
  3. 方便数据备份,提高容错能力和可用性。每个块会被复制到几个节点上,复本的存在保障在节点机器发生故障时,数据仍是可用的,且能分散集群的读取负载(后面分析读文件时,会介绍读取文件时,对于不同的复本所在的节点的选择策略,这个策略可以简单概括为最小公共祖先)。

四、NameNode和DataNode

整个HDFS集群中,存在两类节点,即NameNode和DataNode,前者是管理节点,后者是工作节点——一个NameNode管理着多个DataNode。

NameNode管理着文件系统的命名空间,即文件系统树和树内所有的文件/目录。这些信息会被以文件的形式保存在NameNode节点的本地磁盘上–命名空间镜像文件、编辑日志文件。除夕之外,NameNode还为每个文件记录着各个块所在DataNode的位置信息,但这些位置信息并不永久保存,会在系统启动时根据DataNode信息(即DataNode向NameNode发送的所存储的块的列表等)重建。

DataNode作为文件系统的工作节点,负责进行数据的存储和检索(受客户端/NameNode调度,客户端在从NameNode得到Block Locations后和DataNode交互,进行读写)。

NameNode管理着整个文件系统,对于其的容错是非常重要的。Hadoop提供了两种机制:

  1. 备份元数据的持久状态。利用原子操作,在NameNode将持久状态写入本地磁盘时,写入一个远程挂在的网络文件系统NFS。
  2. 运行一个辅助NameNode。辅助NameNode不被用作NameNode,只是定期合并命名空间景象文件和编辑日志文件。辅助NameNode在一台单独的物理机上运行,在主NameNode发生故障后,将被启用。但问题在于辅助节点保存的持久状态总会滞后于主节点,所以存在数据丢失。

最后一小点,DataNode从磁盘中读取数据块时,对于访问频繁的块,可以将其显式地缓存到内存中。运行计算作业时,缓存的优势可以提高读写性能。比如,在进行join操作时,将小表进行块缓存(这里可以具体了解下map side join操作是如何实现的,简单的说就是将小表复制多份,写入每个map task运行节点的内存,在mapper端进行join,避免shuffle的大量数据传输)。用户可以在cache pool中增加cache derective来告诉NameNode哪些文件需要缓存,且缓存多久。

你可能感兴趣的:(Hadoop权威指南读书笔记,Hadoop,hadoop,大数据,hdfs)