一种基于分布式文件系统的小文件存储方法和装置的制造方法
【技术领域】
[0001]本发明涉及数据存储技术,特别涉及一种基于分布式文件系统(HDFS,HadoopDistributed File System)的小文件存储方法和装置。
【背景技术】
[0002]HDFS是一个分布式文件系统,有着高容错性的特点,被设计用来部署在低廉的硬件上,且能够提供高吞吐量来访问应用程序的数据,适合那些有着超大数据集的应用程序。
[0003]在HDFS中,每存储一个文件,则需要为其建立并维护专属的元数据信息。
[0004]随着现代计算机技术及互联网技术的发展,无论是企业还是个人的数据都呈现迅速增长之势,相应地,需要存储的数据量越来越多,而文件的大小从KB到MB差异非常大。
[0005]HDFS主要适合存储大文件,在存储小文件时则会存在一定的问题,如:由于需要维护所存储的每个小文件的元数据信息,那么当所存储的小文件数量很多时,则需要维护大量的元数据信息,从而需要占用极大的内存空间。
【发明内容】
[0006]有鉴于此,本发明提供了一种基于HDFS的小文件存储方法和装置,能够较好的节省内存空间。
[0007]为了达到上述目的,本发明的技术方案是这样实现的:
[0008]一种基于HDFS的小文件存储方法,包括:
[0009]当接收到针对任一小文件的存储请求时,为小文件分配一个文件句柄,该文件句柄由一个索引文件和一个数据文件组成,其中,索引文件中包括一个第一记录区和一个第二记录区,第一记录区中存储有数据文件的存储路径信息;
[0010]将小文件存储到数据文件中,并将小文件对应的索引块信息存储到第二记录区中,索引块信息中包括:索引块号、小文件在数据文件中的起始偏移位置和小文件的大小。
[0011]—种基于HDFS的小文件存储装置,包括:第一处理模块和第二处理模块;
[0012]所述第一处理模块,用于当接收到针对任一小文件的存储请求时,为小文件分配一个文件句柄,该文件句柄由一个索引文件和一个数据文件组成,其中,索引文件中包括一个第一记录区和一个第二记录区,第一记录区中存储有数据文件的存储路径信息;
[0013]所述第二处理模块,用于将小文件存储到数据文件中,并将小文件对应的索引块信息存储到第二记录区中,索引块信息中包括:索引块号、小文件在数据文件中的起始偏移位置和小文件的大小。
[0014]可见,本发明所述方案中,可采用将多个小文件合并存储到一个大的数据文件中的方式,来实现小文件的存储,从而仅需要维护每个数据文件及对应的索引文件的元数据信息,进而较好的节省了内存空间。
【附图说明】
[0015]图1为本发明基于HDFS的小文件存储方法实施例的流程图。
[0016]图2为本发明文件句柄队列对各文件句柄的管理方式示意图。
[0017]图3为本发明文件句柄、索引文件和数据文件三者的关系及结构示意图。
【具体实施方式】
[0018]为了使本发明的技术方案更加清楚、明白,以下参照附图并举实施例,对本发明所述方案作进一步的详细说明。
[0019]图1为本发明基于HDFS的小文件存储方法实施例的流程图。如图1所示,包括以下步骤11?12。
[0020]步骤11:当接收到针对任一小文件X的存储请求时,为小文件X分配一个文件句柄,该文件句柄由一个索引文件和一个数据文件组成,其中,索引文件中包括一个第一记录区和一个第二记录区,第一记录区中存储有数据文件的存储路径信息。
[0021]为便于表述,用小文件X来代表任意一个需要进行存储的小文件。
[0022]数据文件的存储路径,即指数据文件在HDFS中的存储路径。
[0023]步骤12:将小文件X存储到数据文件中,并将小文件X对应的索引块信息存储到第二记录区中,索引块信息中包括:索引块号、小文件X在数据文件中的起始偏移位置和小文件X的大小。
[0024]以下对上述步骤11和步骤12的具体实现进行详细说明。
[0025]步骤11中,当接收到针对任一小文件X的存储请求时,可首先确定文件句柄队列中包括的文件句柄数是否已经达到预定阈值,所述预定阈值的具体取值可根据实际应用中的并发访问情况而定;如果否,即当文件句柄队列中包括的文件句柄数未达到预定阈值时,则可创建一个新的文件句柄,其中的数据文件和索引文件的第二记录区中均为空,并将新创建的文件句柄分配给小文件X ;如果是,即当文件句柄队列中包括的文件句柄数已经达到预定阈值时,则可将位于文件句柄队列最前面的文件句柄分配给小文件X。
[0026]相应地,步骤12中,当小文件X及其对应的索引块信息均已存储完成时,可将为小文件X分配的文件句柄放入到文件句柄队列的末尾,从而实现文件句柄的回收,即利用队列的先进先出特性循环工作。
[0027]需要说明的是,对于一个文件句柄来说,同一时刻只能针对一个小文件进行处理,假设文件句柄队列中的文件句柄已经分配完毕,此时又接收到了新的待存储的小文件,那么可进行等待,等到有文件句柄被回收到文件句柄队列中时,再进行处理。
[0028]也就是说,可利用文件句柄队列来管理各文件句柄,图2为本发明文件句柄队列对各文件句柄的管理方式示意图。
[0029]另外,如果为小文件X分配的文件句柄的数据文件中的剩余存储空间小于小文件X的大小或者发生存储异常,则可将为小文件X分配的文件句柄关闭,并从文件句柄队列中移除,并创建一个新的文件句柄,将新创建的文件句柄分配给小文件X。
[0030]如前所述,每个索引文件中分别包括一个第一记录区和一个第二记录区,第一记录区中存储有对应的数据文件的存储路径信息,从而建立了属于同一文件句柄的索引文件和数据文件之间的关联关系,第二记录区用于存储对应的数据文件中存储的各小文件对应的索引块信息,如对于小文件X来说,其对应的索引块信息中包括:索引块号、小文件X在数据文件中的起始偏移位置和小文件X的大小。
[0031]其中,第一记录区位于第二记录区的前面,且大小固定;第二记录区中按照索引块号由小到大的顺序依次存储有各索引块信息,且每个索引块信息的大小固定。
[0032]另外,在将小文件X存储到数据文件中时,会从数据文件中已存储的数据结束位置开始,存储小文件X,即按照请求存储的时间由先到后的顺序,依次将各小文件存储到数据文件中,相应地,小文件X对应的索引块号,即等同于小文件X在数据文件中的存储顺序号。
[0033]图3为本发明文件句柄、索引文件和数据文件三者的关系及结构示意图。
[0034]如图3所示,较佳地,索引文件的第一记录区中除了存储有数据文件的存储路径信息之外,还可进一步存储有版本号信息,其中,版本号信息的大小可为SB (字节),数据文件的存储路径信息的大小可为256B,另外还可包括760B的扩展空间,这样一来,第一记录区的总大小将为1KB,由于版本号信息与本发明所述方案无直接关系,故不作介绍。
[0035]另外,如图3所示,索引文件的第二记录区中可存储有各索引块信息,较佳地,每个索引块信息的大小可为16B,其中包括4B大小的索引块号信息、SB大小的起始偏移位置信息和4B大小的小文件大小(长度)信息。
[0036]如图3所示,假设数据文件中共存储了 10个小文件,那么相应地,索引文件的第二记录区中则会存储有这10个小文件分别对应的索引块信息;其中,最先存储到数据文件中的小文件对应的索引块号可为1,次先存储到数据文件中的小文件对应的索引块号可为2,依此类推。
[0037]对于任一小文件X来说,当步骤12中将小文件X及其对应的索引块信息均已存储完成后,可将小文件X对应的索引文件的存储路径信息和索引块号返回给存储请求的发送方,以便与实际业务数据进行关联。
[0038]索引文件的存储路径,即指索引文件在HDFS中的存储路径。
[0039]在实际应用中,除了需要进行小文件的存储之外,还会需要对所存储的小文件进行读取,具体读取过程可如以下步骤A?D所示。
[0040]A、当接收到针对任一小文件y的读取请求时,获取其中携带的索引文件的存储路径信息和索引块号。
[0041]为便于表述,用小文件y来代表任意一个需要进行读取的小文件。
[0042]B、根据获取到的索引文件的存储路径信息,找到相应的索引文件,并读取出存储在找到的索引文件的第一记录区中的数据文件的存储路径信息,根据读取出的数据文件的存储路径信息找到对应的数据文件。
[0043]C、计算(获取到的索引块号-1)*每个索引块信息的大小,得到获取到的索引块号对应的索引块信息在找到的索引文件的第二记录区中的起始偏移位置,并根据得到的起始偏移位置和每个索引块信息的大小,从第二记录区中读取出获取到的索引块号对应的索引块信息。
[0044]D、根据读取出的索引块信息中的小文件7在数据文件中的起始偏移位置和小文件I的大小,从找到的数据文件中读取出小文件1,并返回给读取请求的发送方。
[0045]举例说明:
[0046]假设小文件y对应的索引块号为3,第一记录区的大小以及每个索引块信息的大小均如图3所示;
[0047]当根据索引文件的存储路径信息找到相应的索引文件之后,由于第一记录区的大小是已知的,那么第二记录区的起始位置也是已知的,而又可知索引块号为3的索引块信息在第二记录区中的起始偏移位置为(3-1)*16Β,那么结合每个索引块信息的大小16B,则可从第二记录区中读取出索引块号为3的索引块信息;
[0048]并且,可根据找到的索引文件中的第一记录区中存储的数据文件的存储路径信息,找到小文件I所存储的数据文件,而小文件I对应的索引块信息中存储有小文件I在数据文件中的起始偏移位置和小文件I的大小,那么则可从小文件I所存储的数据文件中读取出小文件y。
[0049]基于上述介绍,本发明同时公开了一种基于HDFS的小文件存储装置,包括:第一处理模块和第二处理模块。
[0050]其中,
[0051]第一处理模块,用于当接收到针对任一小文件的存储请求时,为小文件分配一个文件句柄,该文件句柄由一个索引文件和一个数据文件组成,其中,索引文件中包括一个第一记录区和一个第二记录区