目录

介绍一个数据库——DHFS

HDFS

hdfs是hadoop的核心

概述

介绍

在现代的企业环境中,单机容量往往无法存储大量数据,需要跨机器存储,统一管理分布在集群上的文件系统成为泡影分布式文件系统

HDFS(Hadoop Distributed File System)是Apache Hadoop项目的一个子项目,hadoop就是使用的HDFS作为存储系统,HDFS使用多台计算机存储文件,并且提供统一的访问借口,像是访问一个普通文件系统一样使用分布式文件系统

假设有一个大文件

https://cdn.cjpa.top/image-20210317135711455.png

可以把这个文件放在三台主机上

https://cdn.cjpa.top/image-20210317135857573.png

为了管理这些主机上面的文件,就有了HDFS

HDFS可以把这些主机上面的文件组合起来,让每个主机都贡献一部分自己的磁盘,外部通过一个HDFS访问,就像访问同一块磁盘一样

假设三台主机每个主机都有一个T,HDFS就有3个T

https://cdn.cjpa.top/image-20210317140222841.png

应用场景

  • 适合存储非常大的文件,几百m、g、或者tb级别,需要高吞吐量,对延时没有要求
  • 采用流式的数据访问,一次写入,多次读取,数据集通常从数据源圣城或者拷贝一次,然后在其上做很多分析工作
  • 不需要特别昂贵的硬件,可以节约成本
  • 有很高的容错性
  • 为数据存储提供拓展能力

不适合的应用场景

  • 低延时的数据访问,对延时要求在毫秒级别的应用,不适合采用HDFS。HDFS是为高吞吐数据传输设计的,因此可能牺牲延时
  • 大量小文件, 文件的元数据保存在NameNode的内存中(NameNode就是一些文件的描述信息),一个目录/文件/文件块一般占有150字节的元数据内存空间。如果有100万个文件,每个文件占用一个文件块,则需要大约300万的内存,因此十亿级别的文件数量在现有商用机器上难以支持
  • 多方读写,需要任意的文件修改HDFS采用追加(append-only)方式写入数据。不支持的文件任意offset(偏移量)的修改,想对文件进行定位的话,会不太行,不支持多个写入器(wirter)

HDFS的架构

HDFS是一个主/从(master,Slave)的结构

有四个部分

  • HDFS Client
  • NameNode
  • DateNode
  • Secondary
  • NameNode

https://cdn.cjpa.top/image-20210317142427903.png

client

就是客户端

  • 文件切分。文件上传HDFS的时候,client将文件切分成一个一个的Block,然后存储到HDFS
  • 与NameNode交互,获取文件的位置信息
  • 与DateNode交互,读取或者写入数据(真实的数据都是在DateNode中)
  • Client提供一些命令来管理和访问HDFS,比如启动或者关闭HDFS

NameNode

如果namenode挂掉了,那么这个HDFS就没了,NameNode是一个主管,管理者

作用

  • 管理HDFS的名称空间

    客户端如果想要读取文件,需要知道文件的路径,NameNode可以把位置告诉Client

  • 管理数据块(Block)映射信息

  • 配置副本策略

  • 处理客户端读写请求

DataNode

DataNode就是slave。NameNode下达命令,DataNode执行实际的操作。

作用

  • 存储实际的数据块

  • 执行数据块的读/写操作

Secondary NameNode

并非NameNode的热备份,当NameNode挂掉的时候,它并不能马上替换NameNode并提供服务,只是一个辅助的作用

  • 辅助NameNode,分担其工作量
  • 定期合并fsimage和fsedits,并推送给NameNode
  • 在紧急情况下,可辅助恢复NameNode

NameNode和DataNode

  • NameNode在内存中保存着整个文件系统的名称、空间和文件数据块的地址映射(每个block)
  • 整个HDFS可存储的文件数受限于name node的内存大小

元数据信息

描述数据的信息

路径、时间、大小、权限、块列表

https://cdn.cjpa.top/image-20210317144751123.png

namenode有一个持久化机制

  • fsimage

    镜像文件,相当于数据的备份

  • edits

    日志文件

如果namenode重启了,数据就会从这两个里面恢复

文件操作

namenode并没有存储具体的数据,访问数据的流程如下所示:

https://cdn.cjpa.top/image-20210317145120117.png

namenode副本

一个block可以存放多个副本,namenode决定副本存在哪个主机上。

心跳机制

datanode隔一段时间会想namenode发送一段信息(这段信息包含该datanode上面所有的数据块的列表,blocks report每个小时发送一次),告诉namenode自己还活着

如果datanode宕机了,那么namenode为了维持原来的副本数量,会把副本再发送到其他的机器上。

datanode

  • 以数据块的形式存储DHFS文件

  • 相应HDFS客户端读写请求

  • 周期性想namenode汇报心跳信息

  • DataNode收起性向NameNode汇报数据块信息

  • DataNode周期性想NameNode汇报缓存数据块信息

    块缓存是为了提高访问速度,DataNode放在自己内存里面的数据

HDFS的副本机制和机架感知

副本

https://cdn.cjpa.top/image-20210317150755238.png

hadoop规定必须要切片,就算文件很小,也要切分成block

block的副本数量有规定,在配置文件里面可以修改

机架感知

https://cdn.cjpa.top/image-20210317151239238.png