文章目录
HDFS 简介以及架构设计
详解SecondaryNameNode
HDFS小文件危害以及解决方案
HDFS 读流程
HDFS 写流程
1. HDFS 架构设计
HDFS架构设计.pngNameNode(元数据节点):
- 管理文件系统的命名空间
- 设置副本策略
- 管理数据块的映射信息
- 处理客户端的c读写请求***
DataNode(数据节点):DataNode 是真正存储数据的地方。
- Client 或者 NameNode 可以向 DataNode 请求写入或者读出数据块。
- 定时向 NameNode 汇报存储数据块信息。
Secondary NameNode(从元数据节点):它并不是备用的 NameNode 节点,它负责不同的事。
1.它会周期性地将 NameNode 的 FSimage 和 Edits 合并,以防日志文件过大。
- 合并之后的 FSimage 会在 Secondary NameNode 中保存一份,防止 NameNode 节点失败时可以恢复
详解SecondaryNameNode
作用
定期合并NN节点的fsimage(快照)+editlog(操作日志)为新的fsimage,推送给NN。而触发这个操作的称为检查点checkpoint。影响checkpoint主要是两个参数:
checkpoint之间的时间间隔 dfs.namenode.checkpoint.period=3600秒=1小时
操作事务数 dfs.namenode.checkpoint.txns=1000000
以上两个参数满足其一就触发SNN的合并操作。
合并流程
SNN.png
1.SecondaryNameNode 通过周期性(五分钟),通过 getEditLog 获取 editlog 大小,当其 达到合并的大小时通过 RollEditLog 方法进行合并。
- NameNode 停止使用 edits 文件,并生成一个新的临时的 Edits.new 文件。
- SecondaryNameNode 通过 NameNode 内建的 Http 服务器,以 get 的方式获取 edits 与fsimage 文件。Get 方法中携带着 Fsimage 与 Edits 的路径。
- SecondaryNameNode 将 Fsimage 载入内存并逐一执行 Edits 中的操作,生成新的 Fsimage 文件。
- 执行结束后,会向NameNode发送 http 请求,告知 NameNode 合并结束,NameNode 通过 http post 的方式获取新 fsimage 文件
- Namenode 更新 fsimage 文件中记录检查点执行的时间,并改名为 fsimage 文件。
- Edit.new 文件更名为 edit 文件
2 . HDFS小文件危害以及解决方案
小文件危害
先说对小文件的定义,一般来说小于等于30M的文件,都叫小文件。在HDFS中,通常NN维护一个文件的名称,目录结构等大约是250字节。现实中,HDFS的小文件如果不做任何操作增长会很快,现在假设NN节点的内存为4G,差不多42亿字节,现在在HDFS上有一亿个小文件,那么需要250乘一亿大约是250亿字节,这样会将NN撑爆。小文件到达一定数目,就会将NN节点撑爆。就算NN能够存储,对于hive,spark计算时,小文件意味着需要更多的task和资源,同样也会将节点弄挂掉。
解决方案
生产上首先需要设置小文件的阈值,到达这个值对小文件进行合并。对于这个合并,一种是在HDFS存储之前就进行合并,还有一种就是计算完之后根据业务周期来进行合并。后一种需要在计算时格外对小文件进行调整,具体的会额外出文章讲。
3. HDFS 读流程
HDFS读流程-.png- client使用FileSystem.open(filepath)来rpc调用NN,NN接受到请求会进行权限等一系列check
- 如果都ok,就会返回该文件全部或部分block列表(也就是FSInputStream),如果过不了check直接抛出异常。
- client调用FSInputStream的read()去找到离最近的DN读取block数据,在读取之后会check。如果失败会记录该DN和这个副本信息,下次不会在这个DN读取,如果没问题就继续读取下一个最近的block。当全部block列表读取完之后该文件还没结束,那么filesystem会继续向NN获取下一批block列表。
- 当客户端读取完毕数据的时候,调用FSDataInputStream的close函数。
4. HDFS 写流程
HDFS写流程.png- client调用FileSysytem.create(filepath)来rpc调用NN。
- NN会对这个filepath进行check,例如是不是已经存在该文件等,如果没通过check就会返回异常信息,否则返回FSOutputStream并创建一个未与block联系的路径。
- client使用FSOutputStream来进行block的写入,将第一个块的第一个副本写入DN1,第一个副本写完传输给第二个DN2,第二个副本写完就传输给第三个DN3,当第DN3写完,就返回一个ack packet给DN2,DN2就返回ack packet给DN1,DN1就返回ack packet的FSDataOutputStream对象,标识第一个块的三个副本都写完了,余下的块都是这样写入。如果其中有一个DN出现故障那么数据流会重新调整,绕过故障DN。
- client写完数据关闭FSOutputStream。
- 同时client调用filesystem的complete通知NN写入操作已经完成。
网友评论