Hadoop分布式文件系统
分布式文件系统:管理网络中跨多台计算机存储的文件系统称为分布式文件系统。
提出背景:当数据集的大小超过一台独立的物理计算机的存储能力时,就有必要对它进行分区(partition)并存储到若干台单独的计算机上。
Hadoop的分布式文件系统称为HDFS(Hadoop Distributed Filesystem)。
HDFS的设计
HDFS以流式数据访问模式来存储超大文件,运行在商用硬件集群上。
- 超大文件:可以时几百MB、几百GB甚至几百TB大小的文件。
- 流式数据访问:HDFS的构建思路是:一次写入、多次读取。这是最高效的访问模式。
- 商用硬件:可以运行在普通硬件的集群上。节点故障率较高。HDFS遇到故障时,被设计成能够继续运行且不让用户察觉到明显中断。
- 低时间延迟的数据访问:要求低时间延迟数据访问的应用,不适合在HDFS上运行。
- 大量小文件:由于namenode将文件系统的元数据存储在内存中,因此该文件系统所能存储的文件总数受限于namenode的内存容量。
- 多用户写入,任意修改文件:HDFS中的文件可能只有一个writer,而且写操作总是将数据添加在文件的末尾。不支持具有多个写入者的操作,也不支持在文件的任意位置进行修改。
HDFS的概念
数据块
HDFS也有块(block)的概念,比磁盘的数据块大得多,默认为64MB。
HDFS上的文件也被划分为块大小的多个分块(chunk),作为独立的存储单元。但HDFS中小于一个块的文件不会占据整个块的空间。
为什么HDFS中的块如此之大?
HDFS的块比磁盘的块大,其目的是为了最小寻址开销。
对块进行抽象的好处:
- 一个文件的大小可以大于网络中任意一个磁盘的容量。
- 使用抽象块而非整个文件作为存储单元,大大简化了存储子系统的设计
namenode与datanode
HDFS集群有两类节点以管理者-工作者模式运行,即一个namenode和多个datanode
namenode
namenode管理文件系统的命名空间。维护着文件系统树及整棵树内所有的文件和目录。这些信息以两个文件形式永久保存在本地磁盘上:命名空间镜像文件和编辑日志文件。namenode也记录着每个文件中各个块所在的数据节点信息,但并不是永久保存块位置信息,而是在系统启动时由数据节点重建。
datanode
datanode是文件系统的工作节点。它们根据需要存储并检索数据块,并且定期向namenode发送它们所存储的块的列表。
如果HDFS集群没有namenode节点会怎么样?
没有namenode节点,文件系统将无法使用,文件系统上所有的文件将会丢失。
解决方法:
1.备份那些组成文件系统元数据持久状态的文件
2.运行一个辅助namenode,即secondary namenode。
联邦HDFS
namenode在内存中存储的方式意味着内存将成为限制系统横向发展的瓶颈。
在2.x发行版系统中引入联邦HDFS允许系统通过添加namenode实现扩展,其中每个namenode管理文件系统命名空间的一部分。
例如:一个namenode可能管理/user目录下的所有文件,而另一个namenode可能管理/share目录下的所有文件
在联邦环境下,每个namenode维护一个命名空间卷。命名空间卷之间相互独立,两两之间并不互相通信,互不影响。
数据块池不进行切分,因此datanode需要注册到所有namenode,并存储来自多个数据块池的数据。