论文部分内容阅读
作为日趋成熟的分布式系统,Hadoop拥有强大的海量数据存储与分析处理能力,在许多公司的应用之中都有良好的表现。本文所研究的HDFS(Hadoop Distributed File System)是Hadoop的重要组成部分之一,它被设计用来以流式数据访问模式存储大文件,非常适合用来对大数据集进行分析。然而许多实际应用场景要求存储和处理大量的小文件,这并不是HDFS所擅长的。在小文件量急剧增长时会出现以下问题:名称节点内存大量被消耗,成为系统瓶颈;访问大量小文件效率低下;mapreduce时浪费系统数据处理资源。因此如何将Hadoop应用到小文件场景成为亟待解决的问题。本文通过分析发现了解决问题的关键所在:一方面需要减少文件数量,另一方面需要减少客户端在存取文件时与名称节点的交互次数。根据这样的思路,首先,本文通过将小文件合并成大文件,将合并文件整个存入文件系统的方式来减少名称节点需要维护的文件元数据信息的数量,借此缓解名称节点内存压力;之后本文利用B+树查找速度快、元素按序排列的优势,以B+树为结构基础在名称节点上建立索引来维护小文件与其所在合并文件的对应关系,同时对原始的B+树加以改进,使获取所请求文件信息时能够将与其上传时间相关或存储位置相关的其他文件索引信息一同获取,利用这些预取的索引信息,再次访问时先从本地查找索引信息,若命中则可以直接根据该信息从名称节点请求数据,从而减少访问名称节点索引的次数,提高读取效率;最后在客户端读取文件时将小文件所在数据块预取到本地,并建立索引维护本地数据信息,再次请求文件时若文件已被预取到本地就不需要再向名称节点请求文件,从而进一步减少访问名称节点的次数。之后,本文搭建了Hadoop集群,并将上面的设计方案在该集群上进行了实现,并对试验中名称节点的内存以及读写速率等性能进行了测试。经试验表明,与原始的HDFS相比较,本文提出的改进方案在内存消耗和文件访问效率方面均有不错的提升。