非HA下的namenode 工作原理
nameNode的作用:1.管理元数据 2.维护目录树 3.响应客户请求(主要就是记录一些 真实数据存放在 被切割后 放在了 哪些机器上,等客户端下载时 找到这些文件块 在合并返回给客户端)
1.当客户端没请求一次时 nameNode都要记录这次请求记录 在给客户端响应
nameNode的元数据是非常庞大的,还要保证效率,怎么做的?
解决方案1.可以使用readis缓存数据库,还可以持久化,但是 hadoop不想依赖太多第三方的东西 想自己做
方案2:自己将 数据 保存在磁盘上(fsImage)如果没操作一次 就将数据 放入fsImage中,fsImage非常大,又是放在磁盘上,非常消耗性能,
还是可以将可以利用readis缓存数据库 定时网fsImage中存放
PS:nameNode不支持多线程
说了不想引入第三方东西太多 。
3.他使用了日志的方式存放 新建一个edits.log 的文件 edits.log文件默认大小是64M,超过64M,就将其改名为edits.log.1 这样edits.log就没有了 ,就会新建
edits.log是追加的(append only) (文件追加效率还是很高的)不断追加客户端的操作记录
4.在什么时候合并呢?怎么合并的
默认合并时间是 3600秒
如果就在本机上合并,fsimage数据太大,合并和耗时间,这样响应客户端的请求就会慢
hadoop启动的时候 默认给我们启动了一个 secondary namenode
使用secondaryNameNode 进程做合并处理
5.secondary nameNode 首先 将fsImage和多个edits日志文件下载到本地
6.加载到内存进行合并处理
7.给NameNode发送一个通知,让他别忘edits.log文件中写入数据,改为网editsNew中写数据
8.生成合并之后的fsimage 命名为fsImage.checkpoint
9.nameNode下载合并后的fsimage.checkpoint
10.nameNode将fsiamge.checkpoint改为 fsimage 替换老的fsimage
11.将editsNew给我edits.log
如此循环下去