Hadoop-03 HDFS
HDFS
介绍: hdfs是Hadoop实现的分布式文件系统
HDFS架构:
1个Master(NameNode/NN) 带 N个Slaves(DataNode/DN)
blocksize:128M
NN:负责客户端请求的响应,负责元数据(文件的名称、副本系数、block存放的DN)的管理
DN:存储用户的文件对应的数据块,要定期向NN发送心跳信息,汇报本身及其所有的block信息,健康状况。
- NameNode
- 存储文件的metadata,运行时所有数据都保存到内存,整个hdfs可存储的文件数受限于NameNode的内存大小。
- 一个Block在NameNode中对应一条记录(一般一个block占用150字节),如果大量小文件,会消耗大量内存。同时map task的数量是由splits来决定的,所以用MapReduce处理大量的小文件时,就会产生过多的map task,线程管理的开销将会增加作业时间。处理大量小文件的速度远远小于处理同等大小的大文件速度。因此,Hadoop建议存储大文件。
- 数据会定时保存到本地磁盘,但不保存block的位置信息,而是由DataNode注册时上报和运行时维护(NameNode和DateNode的相关信息并不保存到NameNode的文件系统中,而是NameNode每次重启后,动态重建)
- NameNode失效则整个hdfs都会失效,所以要保证NameNode的可用性。
- DataNode
- 保存具体的block数据。
- 负责数据的读写操作和复杂操作。
- DataNode启动时会向NameNode报告当前存储的数据块信息,后续也会定时报告修改信息。
- DataNode之间会互相进行通信,复制数据块,保证数据的冗余性。
- Block数据块
- 基本存储单位,默认为128M(配置大的块主要是因为a.减少搜寻时间,一般硬盘传输速率比寻道时间要快,大的块可以减少寻道时间。b.减少管理块的数据开销,每个块需要在NameNode上有对应的记录。c.对数据块进行读写,减少建立网络的连接成本。)
- 一个大文件会被拆成多个块,然后存储于不同的机器。如果一个文件少于block的大小,那么实际占用的空间为文件的大小。
- 基本的读写资源,类似于磁盘的页,每次都是读写一个块。
- 每个块都是被复制到多台机器,默认是3份。
- Secondary NameNode
- 定时与NameNode进行同步(定期合并文件系统镜像和编辑日志,然后把合并后的数据传给NameNode,替换其镜像,并清空编辑日志,类似于CheckPoint机制),但NameNode失效后仍需要手动将其设置为主机。
HDFS-写文件
-
客户端将文件写入本地磁盘的Hdfs Client文件中。
-
当临时文件大小达到一个block的时候,Hdfs Client通知NameNode,申请写入文件。
-
NameNode在Hdfs的文件系统中创建一个文件,并把该block id和要写入的DataNode的列表返回给客户端。
-
客户端收到这些信息后,将临时文件写入DataNodes。
- 客户端将文件内容写入第一个DataNode(一般以4kb为单位进行传输)。
- 第一个DataNode接收后,将数据写入本地磁盘,同时也传输给第二个DataNode。
- 以此类推到最后一个DataNode,数据在DataNode之间是通过pipline的方式进行复制的。
- 后面的DataNode接受完数据后,都会发送一个确认给前一个DataNode,最终第一个DataNode返回确认给客户端。
- 当客户端收到整个block的确认后,会向NameNode发送一个最终的确认信息。
- 如果写入某个DataNode失败,数据会继续写人其他的DataNode。然后NameNode会找另外一个好的DataNode继续复制,以保证冗余性。
- 每个block都会有一个校验码,并存放在独立的文件中,以便读的时候来验证其完整性。
-
文件写完后(客户端关闭),NameNode提交文件(这时文件才可见,如果提交前,NameNode挂掉,那文件也就丢失了。只保证了数据信息写到NameNode上,并不能保证数据已经被写到了DataNode中)
Rack aware(机架感知)
通过配置文件指定机架名和DNS的对应关系
假设复制参数是3,在写入文件时,会在本地的机架保存一份数据,然后在另外一个机架内保存两份数据(同机架内的传输速度快,从而提高性能)
整个HDFS的集群,最好是负载平衡的,这样才能尽量利用集群的优势
HDFS-读文件
- 客户端向NameNode发送读取请求。
- NameNode返回文件所有Block和这些block所在的DataNodes(包括复制节点)
- 客户端直接从DataNode中读取数据,如果该DataNode读取失败(DataNode失效或校验码不对),则从复制节点中读取(如果读取的数据就在本机,则直接读取,否则通过网络读取)。
HDFS-可靠性
- 冗余副本策略
- 可以在hdfs-site.xml中设置复制因子指定副本数量。
所有数据块都可副本。 - DataNode启动时,遍历本地文件系统,产生一份HDFS数据块和本地文件对应关系列表(blockreport)汇报给NameNode。
- 可以在hdfs-site.xml中设置复制因子指定副本数量。
- 机架策略
- HDFS的“机架感知”,通过节点之间发送一个数据包,来判断他们是否在同一个机架。
- 一般本机架放一个副本,在其他机架再存放一个副本,这样可以防止机架失效时丢失数据,也可以提高带宽利用率。
- 心跳机制
- NataNode定期从DataNode接受心跳信息和块报告。
- NameNode根据块报告验证元数据。
- 没有按时发送心跳的DataNode会被标记为宕机,不会再给他任何i/o请求。
- 如果DataNode失效造成副本数量下降,并且低于预先设置的值,NameNode会检测这些数据库,并在合适的时间重新复制。
- 引发重新复制的原因还包括数据副本本身损坏,磁盘错误,复制因子被增大等。
- 安全模式
- NameNode启动时会经过一个“安全模式”阶段。
- 安全模式阶段不会产生数据写。
- 在此阶段NameNode收集各个DataNode的报告,当数据块达到最小副本数以上时,会被认为是“安全”的。
- 在一定比例(可设置)的数据块被确定为“安全”后,再过若干时间,安全模式结束。
- 当检测到副本不足数据块时,该块会被复制,直到达到最小副本数。
- 检验和
- 在文件创立时,每个块都产生校验和。
- 校验和会作为单独一个隐藏文件保存在命名空间下。
- 客户端获取数据时可以检查校验和是否相同,从而发现数据块是否损坏。
- 如果正在读取的数据块损坏,则可以继续读取其他副本。
- 回收站
- 删除文件时,其实是放入回收站/trach中。
- 回收站里的文件是可以快速恢复的。
- 可以设置一个时间值,当回收站里的文件的存放时间超过这个值,就被彻底删除,并且释放占用的数据块。
- 元数据保护
- 映像文件和事务日志是NameNode的核心数据,可以配置为拥有多个副本。
- 副本会降低NameNode的处理速度,但增加安全性。
- NameNode依然是单点,如果发生故障需要切换。
- 快照机制
本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!