hdfs基本架构:
nameNode
dataNode
secondaryNameNode
运作方式:
第一步:客户端向nameNode请求上传文件
第二步:nameNode向客户端返回分配的dataNode
第三步:客户端将文件分块,写入对应的dataNode
问题:假如存入的文件都很小,会浪费nameNode的元数据空间,且对于mapreduce的数据分析来说也会降低运算效率
ps:nameNode中一条元数据大概占150个byte
nameNode管理元数据策略:
磁盘存在一份:fsimage(写)
内存也存在一份元数据(读)
以日志文件记录新追加的元数据:edits log
运作方式:
1、客户端访问nameNode
2、nameNode将元数据记入edits log中
3、nameNode返回分配的dataNode
4、客户端写入dataNode
5、dataNode返回写入成功
6、客户端告诉nameNode写入成功
7、nameNode将信息更新到内存中
8、每当edits log中的文件写满时,要将这一段时间edits log中的元数据刷新到fsimage中
8.1、当edits log中的数据写满是,nameNode同时secondaryNameNode进行checkpoint操作
8.2、secondaryNameNode告知nameNode停止往edits log中写入数据
8.3、nameNode停止写入edits log,并生成一个edits.new,继续接收数据
8.4、secondaryNameNode将edits log和fsimage下载下来,并进行合并,生成fsimage.checkpoint
8.5、secondaryNameNode将fsimge.checkpoint上传个nameNode
8.6、nameNode进行重命名操作
如果nameNode节点宕机虽然可以在修复后恢复元数据,但在这一段时间中集群无法对外提供服务,可以部署备用nameNode
这两个nameNode不能同时为客户端提供服务,一个active,一个standby,即highavalability,ha机制
元数据格式:
虚拟路径,副本数量,分片id,分片id+主机名
示例:/test/a.log,3,{blk_1,blk_2},[{blk_1:[h0,h1,h3],{blk_2[h0,h2,h4]}}