本读书笔记组织形式是每个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不适用于:
- low-latency data access: 低延迟的数据访问可以尝试使用hbase
- lots of small files: 主要原因是namenode 将filesystem的metadata存在memory中,内存大小限制了文件数量。
- multiple writers, arbitrary(武断的/随意的)file
HDFS Concepts
Blocks
block是hdfs的基本储存单元,每个128m。但是单个文件不是独占这128m,这和单机的fs不同。按照block组织有3个好处:
- 一个file的大小可以远大于一个node的内存,使用block以后可以隔绝这个问题。
- 简化storage subsystem。 storage subsystem只需要处理block,简化了他的管理逻辑。比如offset的计算,权限管理等。(权限管理是文件的属性,和block无关)
- 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通过两种方式容错。
- 备份filesystem和metadata。hadoop可以配置namenode写这些信息的方式,设置成同步并且原子的备份即可。
- 可以启动一个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需要三个步骤:
- load namespace image into memory
- replay edit log
- 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

Network Topology and hadoop

每次读取namenode都会找距离最小的block,距离是这样定义的:
- 处理器和block在同一个机器,
- 在同一个rack(刀架?)
- 在同一个data center
- 在不同datacenter
Anatomy of a file write
- creates file by create() on distribytedFileSystem
- DistributedFileSystem RPC calls namenode to create a new file in filesystem’s space
- client write data to internal data queue.
- DataStreamer consumed the data queue and write to datanode in pipeline
- 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)成功,就先返回成功,然后一步的复制。
- 数据成功写完后,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/