最近一直在研究hadoop,看了一遍培训的视频,没怎么记住,然后又开始看第二遍,感觉懂了好多,随手记下来.hadoop的元数据是由namenode管理的,但是怎么保持读取速度和写的时候不会冲突呢.如果想读取数据的时候速度很快,那肯定要放在内存当中,可是一旦namenode宕机,就在也找不到这些数据,所以还是需要一份同样的数据卸载磁盘上做持久化(保存在磁盘上的文件我们称fsimage).那么问题来了,如果写的时候同时写入内存和磁盘中,这样会很浪费磁盘IO,影响读取速度,所以就多出来个很小的文件(edits:64M大小),这样客户端写入文件时,就会先像edits中写入一份元数据,然后如果想DataNode中写入block成功后会在像namenode中的内存中写入一份,当edits中写满时在像fsimage备份,这样就不会因为namenode宕机导致数据丢失了,但是又有问题了,如果用namenode这个进程来将edits备份到fsimage中也会占用namenode的内存,影响读的速度,所以就多出了SecondaryNameNode,它主要任务就是当edits达到临界值时从namenode中下载过来edits(同时namenode生成一个新的edits文件)和fsimage文件然后合并在传回给namenode.
同时还有个问题,就是如果在客户端像DataNode中写文件时这时候namenode宕机了,这时namenode的内存中肯定是没有元数据了 ,但是edits是存在的,那它存入的最后一条数据也就是客户端像DataNode写文件之前存入edits的那条数据到底会不会保存下来?我猜是不会的,因为如果客户端像DataNode中写block失败了呢,如果这条数据保存下来客户端想在传这个文件就传不上来了,其实这个文件根本没有传成功.
转载请注明原文地址: https://ju.6miu.com/read-1753.html