二、Hadoop权威指南学习(HDFS)

Hadoop distributed filesystem:以流式数据访问模式来存储超大文件。一次写入、多次读取。

  • 流式数据访问  每次读取都将涉及到数据集的大部分数据甚至全部。(为了读取很大的文件)
  • 商用硬件
  • 低时间延迟  不适合在HDFS上运行,HDFS是为搞数据吞吐量应用优化的,这可能会以提高实践延迟为代价。HBase更适合低延迟访问需求。
  • 大量小文件 无法高效的存储大量小文件
  • 多用户写入,任意修改文件  HDFS只支持单个写入者,写操作是以“只添加”方式在文件末尾写数据。以后可能会支持多用户写入这些操作

二、Hadoop权威指南学习(HDFS)

rack:机架

一个黄色框框是一个服务器,绿色框框代表一个datanode

二、Hadoop权威指南学习(HDFS)

协议详述tpc,http,rpc等:https://www.cnblogs.com/csuliujia/p/10139374.html

hdfs各工作流程机制(带图):https://www.cnblogs.com/xuanku/p/hdfs.html

一、数据块:

文件系统块一般为几千字节,而磁盘块一般为512字节,(现在是4k)。

HDFS中的块(block)默认为128MB,HDFS中小于一个块大小的文件不会占据整个块空间(与单一磁盘的文件系统不同)

包括两个文件,一个数据本身,一个元数据(数据长度,块数据的校验和,以及时间戳)

HDFS的块大的目的是为了最小化寻址开销。但块的大小也不会设置的过大,MapReduce中map任务通常一次只处理一个块中的数据,因此如果任务数太少,作业的运行速度就会比较慢。

对HDFS中块进行抽象的好处:一个文件的大小可以大于网络中任意一个磁盘的容量。文件的所有块并不需要存储在同一个磁盘上;实用抽象块而非整个文件作为存储单元,大大简化了存储子系统的设计。1.简化存储管理,由于快的大小是固定的,计算单个磁盘能存储多少个块就相对容易;2.消除了对元数据的顾虑,块只是存储大块数据,而文件的元数据,如权限信息,并不需要与块一起存储;3.提高了数据容错能力和可用性,将每个块复制到少数几个物理上相互独立的机器上(默认3个),可以确保数据不会丢失。

fsck指令可以显示块信息

二、Hadoop权威指南学习(HDFS)

二、节点

namecode和datanode

namenode管理文件系统的命名空间(namespace),维护文件系统树一级所有的文件和目录。记录每个文件中各个块所在的数据节点信息,但不永久存储块的位置信息,因为这些信息会在系统启动时根据数据节点信息重建。

周期性地从集群中的每个datanode接受心跳信号(块正常工作)和块状态报告(所有数据块的列表)

元数据:镜像文件Fsimage+日志文件Edits

元数据细节 可见 -->> https://blog.csdn.net/qq_33624952/article/details/79341477

客户端(client)代表用户通过与namenode和datanode交互来访问整个文件系统。

datanode是文件系统的工作节点。根据需要存储并检索数据块,定期向namenode发送他们所存储的块的列表。

namenode容错机制:

1.备份那些组成系统系统元数据持久状态的文件。一般的配置是,将持久状态些人本地磁盘的同时,写入一个远程挂载的网络文件系统(NFS)

2.运行一个辅助namenode,定期合并编辑日志与命名空间镜像。但发生故障时,辅助保存的状态总是滞后于主节点,这时一般把NFS上namenode元数据复制到辅助namenode上并作为新的主namenode运行。

(3)热备份namenode代替namenode,避免冷启动问题。因为新的namenode需要:1.将命名空间的镜像导入内存中;2.重演编辑日志;3.接收到足够多的来自datanode的数据块报告并退出安全模式。一般需要30min以上的时间。

三、块缓存

通常datanode从磁盘中读取块,对于访问频繁的文件,其对应的块可能被显式地缓存在datanode的内存中,以堆外块缓存(off-heap block cache)的形式存在。默认情况下,一个块仅缓存在一个datanode的内存中。

四、联邦HDFS

每个namenode维护一个命名空间卷(namespace volume),由命名空间的元数据(metadata 描述数据的数据, 文件名称 大小 所属人 地址 128k)和一个数据块池(block pool)组成,数据块池包含该命名空间下文件的所有数据块。namespace volume之间相互独立,数据块池不再进行切分,因此集群中的datanode需要注册到每个namenode中。