一种用于多文件的存储方法_2

文档序号:8457369阅读:来源:国知局
个文件的读写操作,首先在命名空间中查询,查找文件的块地址、文件大小等信息,然后再在数据节点空间中进行检索。当读取的文件很小时,读写过程中主要时间都消耗在了检索查询中,而不是文件数据的传输,影响服务器集群的处理效率。
[0021]云存储平台利用小文件合并来生成存储文件。首先实现一个过滤器对文件按类型和大小进行过滤,选择可以进行全文检索的文档文件,本文文件大小设定阈值为10M,当文件大于1M时则视为大文件,不需要进行合并。过滤后云存储平台按照文件条目所属资源集合为单位对过滤后的小文件进行合并成为文件块。资源集合是具有一定相关性的资源条目的集合,一个资源条目只属于一个资源集合。通常集合按照属性范围、时间等划分,文件可以按照属性域来划分。新的文件块内资源条目具有很大的关联性,在以后的数据处理中就可以将文件块分配给一个MapReduce任务,避免了因任务的计算量太少而浪费任务分配和切换的时间,减少数据在集群中的移动,正符合Hadoop移动计算比移动数据更有效的原理。
[0022]2建立次索引优化文件读取速度
[0023]小文件合并后名字节点内存是整个文件系统的性能瓶颈,因为所有的文件元数据信息需要存储在其内存中,将小文件合并后可以减少文件的数量,节省很多内存空间,但是合并后的文件读取效率会很低。
[0024]本发明优选的实施例采用分级索引来建立小文件元数据索引,将大的索引文件以合理的规则划分为小的索引文件。以资源集合为主索引,每个资源集合下的资源条目内容作为次索引,这样在查找的时候先根据资源条目所在集合进行查找,再到相应的次索引文件中进行查找。虽然多了一个在主索引中查找的过程,但是由于资源集合数不会太多,其查找时间是很小的,经过划分的次索引文件比全局索引文件小的多,所以整体上会提高查找效率。同时次索引文件也并非全部加载入内存,可根据内存使用情况并结合缓存策略进行灵活调度,解决内存不足的问题。
[0025]3基于索引预取的文件响应速度优化
[0026]这里提出的索引预取是指通过用户当前访问的数据预测用户下面将会访问的数据,并将其索引调入缓存。若能准确预测,就可提前将用户将要访问的数据载入缓存,当用户访问时就能得到较快的系统响应。
[0027]用户在下载或浏览资源条目前,通常必须通过检索或目录查找的方式得到“中间结果集”,然后才能在其中选择需要的资源条目进一步访问。在用户看到结果集页面与执行下载或浏览之间存在一个数秒的间隔,在这段时间内通过提前缓存中间结果集中资源条目的索引,在用户点击下载或浏览时就不用再执行一系列文件元数据查询,直接进行传输文件即可,这样可以很大程度上提高这些文件的请求响应。这种响应提升并不需要太多的内存,假设有10万个用户同时在执行检索,每个结果集页面显示20条资源条目,缓存一个文件的元数据信息需要150B,也只需要0.3G内存空间。
[0028]以下详细描述了本发明云存储平台的存储层构架。云存储平台系统除了利用上述策略,在实现时,其存储层架构是系统的基础。云存储平台存储层构建在Hadoop集群上的分布式存储系统上,提供基本的文件保存和读取服务。
[0029]云存储平台存储层的架构采用三层结构设计:用户接口层,业务逻辑层和存储层,而且为了提高性能,采用将Web服务器和服务器集群分离的方式。用户接口层即提供的用户界面,用户通过该层提供的功能发送请求和接收反馈信息。业务逻辑层是小文件读取和写入的功能实现层,包括文件合并、索引构建和缓存构建等。
[0030]业务逻辑层包括文件合并、检索系统、小文件索引、缓存和分布式系统客户端等功能模块。各模块具体实现如下:
[0031]⑴文件合并
[0032]文件合并功能包含2个阶段:仓ij建SequenceFile对象进行小文件进行合并。通过过滤器的过滤,对符合合并要求的文件进行合并,首先根据资源条目所在的资源集合在主索引中查找,查找到资源集合对应的文件路径后,创建SequenceFile对象,并获得SequenceFile的Writer对象并对其进行配置,准备写入文件。在执行文件写入的同时开启一个新的线程,将该资源条目对应的文件位值、长度等元数据信息写入资源条目次索引。资源条目写入成功后关闭输出流,返回提交成功,否则返回提交失败。
[0033](2)检索系统
[0034]提供文件检索功能,依靠该模块基于“中间结果集”对分布式文件系统进行读取优化。
[0035](3)小文件索引
[0036]构建小文件索引,包括资源集合主索引和资源条目次索引,提供索引文件创建、追加和删除记录等功能。
[0037]主索引数据存储在关系数据库中,通过关系数据库访问接口提供访问,使用Java中的Map数据结构保存。因为资源集合已经存入数据库,根据此索引只需要增加在资源条目添加的时候由系统生成值的字段,所以可以保存在关系数据库中,不影响处理效率。主索引中的数据采用Key/Value结构,可以使用Java中Map数据结构提高查询效率。另外,为保证检索效率,必须在服务启动的时候根据数据库中内容初始化该Map对象并一直存在,由于主索引文件数不多,Map对象占用内存很小,所以系统开销有限,当有新的资源集合加入或有的被删除的时候,需对该Map对象进行更新。
[0038]次索引是通过开源项目Lucene创建的,支持小文件元数据检索。Lucene有一套完善的索引构建、更新和查找解决方案,而且在索引文件小于IG时查询效率非常高,可用于构建商用搜索引擎。云存储平台要创建的索引需要一些特殊的功能,如每当用户添加资源条目的时候需实时更新索引文件;多个用户在一个资源集合下同时添加资源条目时,文件写入的并发控制;压缩索引文件以减少内存占用等。
[0039]⑷预取
[0040]为了更好地提升响应速度,这里提供对用户感兴趣的“中间结果集”的缓存管理,包括缓存空间维护,缓存更新,更新算法维护等功能。
[0041]在用户发出检索请求后,Web服务根据用户检索条件查询符合用户需要的资源条目结果集,返回给用户,同时创建异步线程更新缓存,在返回用户结果集到用户浏览结果集并确定点击下载或浏览操作之间的时间间隔内更新缓存内容。当缓存模块接收到更新缓存内容请求时,调用索引模块进行检索,将当前结果集条目的元数据载入缓存。当用户发送下载或浏览请求时,Web服务调用分布式系统客户端在缓存中查找元数据开始读取数据并向客户端传输。
[0042]系统维护一个固定线程数量的线程池在每次接收到更新缓存请求的时候调用一个线程去处理,若线程池内没有空闲线程则让该缓存任务等待。这样可以将缓存更新任务占的系统资源维持在一个合理的范围内,不影响系统整体性能。本发明选择FIFO算法实现缓存模块调度功能,以最高效的方式淘汰最久以前的缓存条目。具体实现是:建立缓存池,配置缓存池大小,默认为32M,可以保存20万条文件元数据信息。缓存池里面存储的是一个个键值对key/value,文件名作为key,文件的数据节点ID,起始位置和长度的组合作为value。该缓存池提供两个操作put和get。put往缓存池放入数据,如果缓存池里面已有的数据达到了上限,则根据缓存替换算法替换相应的数据,如果还有空间直接放入就行。Get操作根据key值获取相应的value值,如没有则返回空。
[0043](5)分布式系统客户端
[0044]分布式系统客户端封装了操作文件系统与外界交互的API,包括读写文件和查询文件位置等。当文件系统接收到文件读取请求时,首先经过文件过滤器进行判断,属于被合并了的文件则首先在缓存中查找文件的元数据信息,若不存在,则在索引文件中进行查找,若还是查找不到则与名字节点通信。查找到文件元数据后构建SequenceFile对象然后获得SequenceFile的Reader对象向数据节点发送读取请求,将数据传输给用户后关闭输入流,返回完成。
[0045
当前第2页1 2 3 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1