简介
HDFS是一个分布式文件管理系统。当数据量越来越多时,可分配到其他的磁盘中,但是在不同操作系统下不方便管理和维护,因此迫切需要一种系统来管理多台机器上的文件,这就是分布式文件管理系统;是一种允许文件通过网络在多台主机上分享的文件系统,可让多机器上的多用户分享文件和存储空间。
HDFS是做存储用的,它提供了几个特性:
- 可靠性:
HDFS创建了多份数据块(data blocks)的复制(replicas),并将它们放置在服务器群的计算节点中(computer nodes),MapReduce就可以在它们所在的节点上处理这些数据,以此来实现可靠性。 - 高扩展性
- 高吞吐率
HDFS优点:
-高容错性
数据自动保存多个副本
副本丢失后,自动恢复
-适合批处理
移动计算而非数据
数据位置暴露给计算框架
-适合大数据处理
GB、TB、甚至PB级数据
百万规模以上的文件数量
10K+节点
-可构建在廉价机器上
通过多副本提供可靠性
提供了容错和恢复机制
HDFS缺点:
-低延迟数据访问
比如毫秒级
低延迟与高吞吐率
-小文件存取
占用NameNode大量内存
寻道时间超过读取时间
-并发写入、文件随机修改
一个文件只能有一个写者
仅支持append
HDFS运行机制
- 一个名字节点和多个数据节点
- 数据复制(冗余机制)
--存放的位置(机架感知策略) - 故障检测
--数据节点
心跳包(检测是否宕机)
块报告(安全模式下检测)
数据完整性检测(校验和比较)
--名字节点(日志文件,镜像文件) - 空间回收机制
HDFS命令
Shell命令
Ls,lsr
Mkdir,rm,cp
Chmod chown
Cat,mv,put,get,tail
与Linux的操作相似!
HDFS结构
HDFS架构
HDFS数据存储单元(block)
- 文件被切分成固定大小的数据块
默认数据块大小为64MB,可配置
若文件大小不到64MB,则单独存成一个block - 一个文件存储方式
按大小被切分成若干个block,存储到不同节点上
默认情况下每个block都有三个副本 - Block大小和副本数通过Client端上传文件是设置,文件上传成功后副本数可以变更,Block Size不可变更
HDFS设计思想
NameNode(NN)
- NameNode主要功能:接受客户端的读写服务
- NameNode保存metadata信息包括
-文件owership和permissions
-文件包含哪些块
-Block保存在哪个DataNode(由DataNode启动时上报) - NameNode的metadata信息在启动后会加载到内存
-metadata存储到磁盘文件名为“fsimage”
-Block的位置信息不会保存到fsimage
-edits记录对metadata的操作日志
SecondaryNameNode(SNN)
- 它不是NN的备份(但可以做备份),它的主要工作是帮助NN合并edits log,减少NN启动时间。
- SSN执行合并时机
-根据配置文件设置的时间间隔fs.checkpoint.period 默认3600秒
-根据配置文件设置edits log 大小 fs.checkpoint.size规定edits文件的最大值默认是64MB
为了节省NameNode的资源而设的,让NameNode更专注于读写服务,而备份服务就由另设的一台机器来解决。
SNN合并流程
DataNode(DN)
- 存储数据(Block)
- 启动DN线程的时候会向NN汇报block信息
- 通过向NN发送心跳保持与其联系(3秒一次),如果NN10分钟没有收到DN的心跳,则认为其已经lost,并copy其上的block到其他DN
Block的副本放置策略
- 第一个副本:放置在上传文件的DN;如果是集群外提交,则随机挑选一台磁盘不太满,CPU不太忙的节点。
- 第二个副本:放置在与第一个副本不同的机架的节点上。
- 第三个副本:与第二个副本相同机架的节点
- 更多副本:随机节点
HDFS读流程
流程:HDFS客户端发送请求open方法,去调用Distributed FileSystem这个API,这个API又再发送一个请求到NameNode,这样来得到block location,因为数据其实都存储在DataNode上;拿到块的位置信息之后,就开始由FSDataInputStream并发查询各个DataNode,直到找到数据。
HDFS写流程
HDFS文件权限
- 与Linux文件权限类似
r:read;w:write;x:execute,权限x对于文件忽略,对于文件夹表示是否允许访问其内容 - 如果Linux系统用户zhangsan使用hadoop命令创建一个文件,那么这个文件在HDFS中owner就是zhangsan。
- HDFS的权限的目的:阻止好人做错事,而不是阻止坏人做坏事。HDFS相信,你告诉我你是谁,我就认为你是谁。(即不做密码认证)
安全模式
- namenode启动的时候,首先将映像文件(fsimage)载入内存,并执行编辑日志(edits)中的各项操作。
- 一旦在内存中成功建立文件系统元数据的映射,则创建一个新的fsimage文件(这个操作不需要SecondaryNameNode)和一个空的编辑日志。
- 此刻namenode运行在安全模式。即namenode的文件系统对于客服端来说是只读的。(显示目录,显示文件内容等。写、删除、重命名都会失败)。
- 在此阶段Namenode收集各个datanode的报告,当数据块达到最小副本数以上时,会被认为是“安全”的,在一定比例(可设置)的数据块被确定为“安全”后,再过若干时间,安全模式结束。
- 当检测到副本数不足的数据块时,该块会被复制直到达到最小副本数,系统中数据块的位置并不是由namenode维护的,而是以块列表的形式存储在datanode中。