- 数据文件在集群中的分发过程
- 首先由客户端向Name Node发起请求,申请上传文件
- Name Node返回给客户端DataNode的信息
- 客户端根据配置文件和获取到的Data Node信息,将数据文件进行切分,将block写入Data Node
- 默认情况下,每个block在Data Node中有三份副本,Client只负责写入其中一个副本,其他副本由Data Node进行复制传递
- 下一个Data Node依次返回给上一个Data Node副本创建是否成功的消息
- 如果副本创建失败,Name Node会受到信息,说明哪个block的哪个副本创建失败,Name Node会在集群中重新选择Data Node创建新的副本
- 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模式)
- 客户端向集群申请写入数据
- Name Node先向edits log中写入元数据操作日志
- 当Name Node发现edits log写满时,会通知Secondary Name Node, 进行checkpoint操作(即将edits log写入到fsimage中 )
- Name Node停止向edits log文件内写入操作日志, 创建新的edits.new文件写入
- Secondary Name Node通过http方式将Name Node中的fsimage和edits log文件下载下来,进行合并,生成新的fsimage.chkpoint文件
- Secondary Name Node将合并完成的fsimage.chkpoint上传给Name Node,替换原来fsimage文件,将fsimage.chkpoint重命名为fsimage, edits log文件删除,将edits.new重命名为edits log并继续写入
- checkpoint触发机制:
1)fs.checkpoint.period 指定两次checkpoint的最大间隔时间,默认为3600秒;
2)fs.checkpoint.size 指定edits文件的最大值,一旦超过最大值则强制执行checkpoint操作,不管是否到达最大间隔时间。默认大小为64M
在这种情况下,能保证大多数情况下的Name Node的数据完整性(即元数据的可靠性),但是在Name Node发生故障时无法保证对外界提供服务(即集群服务的可用性)。这时候就需要Hadoop的HA部署方式来解决这个问题了。
- DataNode数据管理
- DataNode提供真实的文件数据存储服务
- 文件块(block)是最基本的存储单位,从文件的起始位置0偏移开始,按照固定大小,顺序对文件进行编号,划分好的每一块称一个block,HDFS默认的block大小为128M(可通过配置dfs.block.size进行设置)
- 不同于普通文件系统的是,HDFS中,如果一个文件小于一个数据块的大小,并不占据整个数据块存储空间
- block副本数Replication默认为3,通过dfs.replication进行配置
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。