HDFS

存储模型:字节

文件线性切割成块(Block):偏移量 offset (byte)
Block分散存储在集群节点中
单一文件Block大小一致,文件与 文件可以不一致
Block可以设置副本数,副本分散在不同节点中
副本数不要超过节点数量
文件上传可以设置Block大小和副本数
已上传的文件Block副本数可以调整,大小不变
只支持一次写入多次读取,同一时刻只有一个写入者
可以append追加数据

架构模型:

文件元数据MetaData,文件数据
1>元数据(namenode 元数据 和 datanode 上报元数据)
2>数据本身
(主)NameNode节点保存文件元数据:单节点 posix
(从)DataNode节点保存文件Block数据:多节点
DataNode与NameNode保持心跳,提交Block列表
HdfsClient与NameNode交互元数据信息
HdfsClient与DataNode交互文件Block数据

单机 HDFS架构

HDFS 思想

Namenode

基于内存存储 :
  • 不会和磁盘发生交换
  • 只存在内存中
  • 持久化
NameNode主要功能:
  • 接受客户端的读写服务
  • 收集DataNode汇报的Block列表信息
NameNode保存metadata信息包括
  • 文件owership和permissions
  • 文件大小,时间
  • (Block列表:Block偏移量),位置信息
  • Block每副本位置(由DataNode上报)
NameNode持久化
  • metadata一部分信息在启动后会加载到内存,还有一部分由DataNode上报
  • metadata存储到磁盘文件名为 fsimage
  • Block的位置信息不会保存到 fsimage
  • edits记录对metadata的操作日志,定期或达到某个大小 由SecondNameNode 或者是 NameNode Standby(HA) 拷贝回去 合并到fsimage

SecondaryNameNode

减少NameNode启动时间
  • 它不是NN的备份(但可以做备份),它的主要工作是帮助NN合并edits log,减少NN启动时间。
SNN执行合并时机
  • 根据配置文件设置的时间间隔fs.checkpoint.period 默认3600秒
  • 根据配置文件设置edits log大小 fs.checkpoint.size 规定edits文件的最大值默认是64MB
合并流程
第一次合并 需要拉去 edit 和 fsimage 第二次只需要拉去 edit

DataNode

本地磁盘目录存储数据(Block),文件形式
同时存储Block的元数据信息文件
启动DN时会向NN汇报block信息
通过向NN发送心跳保持与其联系(3秒一次),如果NN 10分钟没有收到DN的心跳,则认为其已经lost,并copy其上的block到其它DN

HDFS 优点

高容错性
  • 数据自动保存多个副本
  • 副本丢失后,自动恢复
适合批处理
  • 移动计算而非数据
  • 数据位置暴露给计算框架(Block偏移量)
适合大数据处理
  • GB 、TB 、甚至PB 级数据
  • 百万规模以上的文件数量
  • 10K+ 节点
可构建在廉价机器上
  • 通过多副本提高可靠性
  • 提供了容错和恢复 机制

HDFS 缺点

低延迟数据访问
  • 比如毫秒级
  • 低延迟与高吞吐率
小文件存取
  • 占用NameNode 大量内存
  • 寻道时间超过读取时间
并发写入、文件随机修改
  • 一个文件只能有一个写者
  • 仅支持append

Block 副本放置策略

第一个副本:放置在上传文件的DN;如果是集群外提交,则随机挑选一台磁盘不太满,CPU不太忙的节点。
第二个副本:放置在于第一个副本不同的 机架的节点上。
第三个副本:与第二个副本相同机架的节点。
更多副本:随机节点

写流程

Client
  1. 切分文件Block(切分过程中是严格按照大小来切分,有可能导致同一行出现在两个不同的block中,mr 在处理的时候考虑这种情况)
  2. 按Block线性和NN获取DN列表(副本数)
  3. 验证DN列表后以更小的单位流式传输数据
  4. 各节点,两两通信确定可用
  5. Block传输结束后:
  6. DN向NN汇报Block信息
  7. DN向Client汇报完成
  8. Client向NN汇报完成
  9. 获取下一个Block存放的DN列表
  10. 最终Client汇报完成
  11. NN会在写流程更新文件状态

读流程

  1. 和NN获取一部分Block副本位置列表
  2. 在Block副本列表中按距离择优选取
  3. 线性和DN获取Block,最终合并为一个文件

HDFS文件权限 POSIX

与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中。

总结

角色==进程
namenode
  1. 数据元数据
  2. 内存存储,不会有磁盘交换
  3. 持久化(fsimage,eidts log)
  4. 不会持久化block的位置信息
  5. block:偏移量,因为block不可以调整大小,hdfs,不支持修改文件
  6. 偏移量不会改变
datanode
  1. block块
  2. 磁盘
  3. 面向文件,大小一样,不能调整
  4. 副本数,调整,(备份,高可用,容错/可以调整很多个,为了计算向数据移动)
SN
  1. NN&DN
  2. 心跳机制
  3. DN向NN汇报block信息
安全模式
client

posted on 2019-11-19 18:50  chouc  阅读(171)  评论(0编辑  收藏  举报

导航