介绍一个数据库——DHFS
HDFS
hdfs是hadoop的核心
概述
介绍
在现代的企业环境中,单机容量往往无法存储大量数据,需要跨机器存储,统一管理分布在集群上的文件系统成为泡影分布式文件系统
HDFS(Hadoop Distributed File System)是Apache Hadoop项目的一个子项目,hadoop就是使用的HDFS作为存储系统,HDFS使用多台计算机存储文件,并且提供统一的访问借口,像是访问一个普通文件系统一样使用分布式文件系统
假设有一个大文件
可以把这个文件放在三台主机上
为了管理这些主机上面的文件,就有了HDFS
HDFS可以把这些主机上面的文件组合起来,让每个主机都贡献一部分自己的磁盘,外部通过一个HDFS访问,就像访问同一块磁盘一样
假设三台主机每个主机都有一个T,HDFS就有3个T
应用场景
- 适合存储非常大的文件,几百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
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的内存大小
元数据信息
描述数据的信息
路径、时间、大小、权限、块列表
namenode有一个持久化机制
-
fsimage
镜像文件,相当于数据的备份
-
edits
日志文件
如果namenode重启了,数据就会从这两个里面恢复
文件操作
namenode并没有存储具体的数据,访问数据的流程如下所示:
namenode副本
一个block可以存放多个副本,namenode决定副本存在哪个主机上。
心跳机制
datanode隔一段时间会想namenode发送一段信息(这段信息包含该datanode上面所有的数据块的列表,blocks report每个小时发送一次),告诉namenode自己还活着
如果datanode宕机了,那么namenode为了维持原来的副本数量,会把副本再发送到其他的机器上。
datanode
-
以数据块的形式存储DHFS文件
-
相应HDFS客户端读写请求
-
周期性想namenode汇报心跳信息
-
DataNode收起性向NameNode汇报数据块信息
-
DataNode周期性想NameNode汇报缓存数据块信息
块缓存是为了提高访问速度,DataNode放在自己内存里面的数据
HDFS的副本机制和机架感知
副本
hadoop规定必须要切片,就算文件很小,也要切分成block
block的副本数量有规定,在配置文件里面可以修改