Hadoop: The Definitive Guide 4th 读书笔记—chapter3: HDFS

本读书笔记组织形式是每个chapter为一篇,每篇大小标题对应书中一节和一小节。

转载请注明出处<>

The Design of HDFS

hdfs的定义为

filesystem designed for storing very large files with streaming data access patterns, running on clusters of commodity hardware.

他有三个主要特点:

  • very large files:可以支持到pb级别
  • streaming data access: write-once, read-many-time
  • commodity hardware: 不需要昂贵硬件支持

hdfs不适用于:

  1. low-latency data access: 低延迟的数据访问可以尝试使用hbase
  2. lots of small files: 主要原因是namenode 将filesystem的metadata存在memory中,内存大小限制了文件数量。
  3. multiple writers, arbitrary(武断的/随意的)file

HDFS Concepts

Blocks

block是hdfs的基本储存单元,每个128m。但是单个文件不是独占这128m,这和单机的fs不同。按照block组织有3个好处:

  1. 一个file的大小可以远大于一个node的内存,使用block以后可以隔绝这个问题。
  2. 简化storage subsystem。 storage subsystem只需要处理block,简化了他的管理逻辑。比如offset的计算,权限管理等。(权限管理是文件的属性,和block无关)
  3. blocks为容错带来好处。hdfs默认复制三份。

hdfs fsckk / -files -blocks可以查看block的基本信息

Namenodes and Datanodes

HDFS是master-slaver的模式,namenode是slaver。namenode管理者fs的namespace。他储存了filesystem tree和metadata。这些信息以namespace image和edit log的形式永久的存在磁盘上。namenode还储存了file的block位置,不过这些位置是系统启动时通过datanode发送的信息重建起来的。

client通过和类似POSIX接口和hdfs通信

namenode通过两种方式容错。

  1. 备份filesystem和metadata。hadoop可以配置namenode写这些信息的方式,设置成同步并且原子的备份即可。
  2. 可以启动一个secondary namenode。它平时是用于merge edit log和 namespace image。所以他有一份备份,可以用作容灾

Block Caching

HDFS Federation

单一namenode会实得内存成为系统瓶颈。在federation技术下,可以设置多个namenode,每个namenode管理一个namespace vloume,同时使用一个block pool管理整个filesystem的blocks。volume相互独立,但是block pools是相互依赖的,每个namenode会相互注册block

HDFS High Availability

hadoop1 中 namenode本质上还是一个SPOF(single point of failure)。失败后在启动另一个namenode前,hdfs无法提供服务。启动另一个namenode需要三个步骤:

  1. load namespace image into memory
  2. replay edit log
  3. receive enough block reports

hadoop2 提供了high availability(HA)模式,通过一个active standby config可以设置standby namenode。

QJM(quorum journal manager)是一种常用的HA shared storage。 QJM跑一群journal 节点上,每一次写操作必须记录在它上面。

Failover and fencing

默认情况下,zookeeper 保证一个namenode处于active的状态

当网络状况不好时,原先的namenode活着的时候也可能被误判为挂了,这时使用fencing的方法来处理这个问题。如果standby节点已经启动,则直接通过断电的方式来挂掉原先的namenode

As a last resort, the previously active namenode can be fenced with a technique rather graphically known as STONITH, or “shoot the other node in the head,” which uses a specialized power distribution unit to forcibly power down the host machine.

client端的failover:首先namenode是通过url的形式把逻辑地址写入config。之后client library轮流访问两个namenode(HA)指到成功。

The command-line interface

File Permission in HDFS

hadf有三种permission,user,group,other。默认情况下是没有authenticated的。如果permission checking打开,就先看client是不是owner,然后看在不在group里,都不是则按other的权限。
hdfs的权限也是rwx,其中x(execute)对于文件没有用,对于文件夹是控制能否访问子文件夹的

The java interface

Data Flow

Anatomy of a file read

151126hdfs-read

Network Topology and hadoop

151126hdfs-replica-placement
每次读取namenode都会找距离最小的block,距离是这样定义的:

  • 处理器和block在同一个机器,
  • 在同一个rack(刀架?)
  • 在同一个data center
  • 在不同datacenter

Anatomy of a file write

151126hdfs-write

  1. creates file by create() on distribytedFileSystem
  2. DistributedFileSystem RPC calls namenode to create a new file in filesystem’s space
  3. client write data to internal data queue.
  4. DataStreamer consumed the data queue and write to datanode in pipeline
  5. DFSOutputStream wait for the ack queue. When all datanode in pipeline finish write, it return a ack
    • 当一个datanode出错时,首先pipeline被关闭,所有ack被加到之前的data queue。然后好的datanode上的block会被赋一个新的identity。失败的datanode被移出所有pipeline,然后新的pipeline被建立,选出新的datanode写入数据。
    • 多个datanode出错时,只要有dfs.namenode.replication.min(default 1)成功,就先返回成功,然后一步的复制。
  6. 数据成功写完后,client close stream

replica placement

defautl。在当前node上写一份。另一个刀架r上写第二份,同时再在r上写第三份

coherency Model

flush不保证data能被读到。
hflush保证data至少被写进所有datanode的内存
hsync保证被写进硬盘


本文采用创作共用保留署名-非商业-禁止演绎4.0国际许可证,欢迎转载,但转载请注明来自http://thousandhu.github.io,并保持转载后文章内容的完整。本人保留所有版权相关权利。

本文链接:http://thousandhu.github.io/2015/10/27/Hadoop-The-Definitive-Guide-4th-读书笔记—chapter3-HDFS/