国庆放假7天,花了二天时间搬家,花了二天时间去绍兴,接下来这三天用来学习,这几周比较忙,加班比较多,手头上有几个task,因此没有及时更新blog,但是不管再忙,都一定要花时间来学习,上周javaone大会结束了,看了毕玄等同学的分享,java的性能方面很多公司还在研究当中,特别GC管理这块,hadoop书出了第二版,网上已经有下载了,这个月hadoop world也要举办,基本上是跟hadoop相关的session,taobao的TFS开源,比较靠谱的东西,同时也适合于存储小文件,这是由hdfs有区别的地方,接下来抽空看看,加深对DFS的理解和感悟。
Hdfs-Raid tools 文档翻译
相关链接:
https://issues.apache.org/jira/browse/MAPREDUCE-1969
https://issues.apache.org/jira/browse/MAPREDUCE-2036
在数据块存储时采用 RAID5 或 RAID6 来代替 triplication scheme(3 副本方案 ) ,原先的存储只有 1 /3 可用,因为一个 block 有三个副本,如果副本设置更多,那么存储的使用将更低,为了提高存储容量的使用, RAID 将采用检验块来得到丢失的数据块,而不是通过副本来得到,这样可以减少需要附加的存储容量。
按 RAID6 来存储,将为 4 个数据块产生 2 个附近的校验块,当 4 个中有 2 个数据块丢失,都是可以恢复回来的,但是如果 2 个以上的数据块丢失,就无法恢复,这是 RAID6 不好的地方。
Raid5:
Raid6:
设计理论:
组策略问题
当一个文件的数据很大时,即大于 4 个数据块时,相当好处理,就按 4 个为一组来计算出校验块,然后剩下的数据块组合一组来计算出校验块。
最难解决的问题,就是小文件,如果把每个小文件看成一组,这样就浪费了很多空间。
如果把多个文件看成一个组,问题又来了,因为文件之间是独立,当有文件删除时,其数据块不能删除,不然同组中其他文件的数据块将无法被恢复。
他们对 yahoo 的 7 个集群进行了统计,
80% 的空间是存储小于 8G 的文件。
75% 以上的空间存储大于 8G 的文件目录。
因此采用将一个目录作为一个组,来计算校验数据块。
当前设计:
提供一个 RAID Tool 工具给客户端使用,支持以目录作为组来进行 RAID 。提供计算校验数据与恢复数据二种功能。
采用 MR-job 来计算校验数据块。
客户端访问数据时,如果数据发生错误或丢失,就可以通过 RAID tool 进行在线恢复。就是对 FSInputStream 再包装一层,提供恢复丢失数据块的功能。
当客户端读 HDFS 时,发生错误。
RAIDFileSyste ,包装好 FileInputStream 。
离线错误检测
NameNodeFsck 检测错误的数据块,然后利用 MRjob 来对其进行恢复。
错误处理可以在线恢复,也可以提供离线恢复。
在当前的 hadoop 的数据块的副本数目都是由 ReplicationMonitor 线程来离线检测和恢复的。
提高与改进:
校验数据存储格式
影响到 NN 的资源和空间使用。
有隔离,密集和稀疏。
可靠性问题
数据块及校验数据的存储位置选择比 3 副本策略复杂。
数据恢复的性能
当某个块发生冲突,可以直接重写这个数据块就可以,并不要去重写整个文件。