• 数据文件在集群中的分发过程

clipboard.png

  1. 首先由客户端向Name Node发起请求,申请上传文件
  2. Name Node返回给客户端DataNode的信息
  3. 客户端根据配置文件和获取到的Data Node信息,将数据文件进行切分,将block写入Data Node
  4. 默认情况下,每个block在Data Node中有三份副本,Client只负责写入其中一个副本,其他副本由Data Node进行复制传递
  5. 下一个Data Node依次返回给上一个Data Node副本创建是否成功的消息
  6. 如果副本创建失败,Name Node会受到信息,说明哪个block的哪个副本创建失败,Name Node会在集群中重新选择Data Node创建新的副本
  7. Name Node元数据存储细节:NameNode(FileName, replicas, block-ids, id2host...)
    例如:
    /a/b/c/d.txt, 3, {blk_1, blk_2}, [{blk_1:[h0, h1, h2]}, {blk_2:[h0, h2, h4]}]
  • NameNode元数据管理(非HA模式)

clipboard.png

  1. 客户端向集群申请写入数据
  2. Name Node先向edits log中写入元数据操作日志
  3. 当Name Node发现edits log写满时,会通知Secondary Name Node, 进行checkpoint操作(即将edits log写入到fsimage中 )
  4. Name Node停止向edits log文件内写入操作日志, 创建新的edits.new文件写入
  5. Secondary Name Node通过http方式将Name Node中的fsimage和edits log文件下载下来,进行合并,生成新的fsimage.chkpoint文件
  6. Secondary Name Node将合并完成的fsimage.chkpoint上传给Name Node,替换原来fsimage文件,将fsimage.chkpoint重命名为fsimage, edits log文件删除,将edits.new重命名为edits log并继续写入
  7. checkpoint触发机制:
    1)fs.checkpoint.period 指定两次checkpoint的最大间隔时间,默认为3600秒;
    2)fs.checkpoint.size 指定edits文件的最大值,一旦超过最大值则强制执行checkpoint操作,不管是否到达最大间隔时间。默认大小为64M

在这种情况下,能保证大多数情况下的Name Node的数据完整性(即元数据的可靠性),但是在Name Node发生故障时无法保证对外界提供服务(即集群服务的可用性)。这时候就需要Hadoop的HA部署方式来解决这个问题了。

  • DataNode数据管理
  1. DataNode提供真实的文件数据存储服务
  2. 文件块(block)是最基本的存储单位,从文件的起始位置0偏移开始,按照固定大小,顺序对文件进行编号,划分好的每一块称一个block,HDFS默认的block大小为128M(可通过配置dfs.block.size进行设置)
  3. 不同于普通文件系统的是,HDFS中,如果一个文件小于一个数据块的大小,并不占据整个数据块存储空间
  4. block副本数Replication默认为3,通过dfs.replication进行配置

本文固定链接: http://www.js-code.com/node-js/node-js_30404.html