程孝孝
摘要:随着计算机视觉与人工智能技术的发展,网络中的图片及视频资源越来越多,海量图片的检索及存储就成为一个重要的现实问题。Hadoop提供的HDFS可以提供可靠的高并发访问,MapReduce计算框架能够并行进行图片的处理,因此对于海量图片的快速存储和处理有巨大帮助。
关键词:Hadoop;海量图片;存储优化;分布式处理
中图分类号:TP393 文献标识码:A
文章编号:1009-3044(2019)10-0221-02
开放科学(资源服务)标识码(OSID):
相对于文字而言,图片资源是一种内容丰富、方便理解的工具,已经深入应用到日常生活的方方面面。随着人工智能技术、计算机视觉技术在各个领域的应用和手机终端的普及,图片数量也已级数级别迅猛增长。在图片资源可以称海量的情况下,如何从海量图片中检索出有用的数据、如何高速的实现图片的存取就是一件有现实意义的研究。
Hadoop开源大数据平台是一个可以处理海量数据的分布式并行计算框架,它提供的HDFS并行文件系统为海量图片的实际存储提供物理平台,MapReduce计算框架可以对海量图片进行并行处理,Hbase可以为海量图片的存储提供多格式的统一管理。
1 Hadoop技术
Hadoop是一个基于Java语言的分布式并行框架,包括多个组件,其中最核心的是[1]:(1)HDFS分布式文件系统。可以部署在多台廉价机器上,不仅可以通过组成集群的方式提高硬件资源的利用率,还能够在线添加、删除集群节点,或对分布式文件系统上存储的资源进行各种操作。HDFS能够保证存储数据的安全性及可靠性,其高容错性保证了即使在出现故障时,数据也能够正常的存储和传输。(2)MapReduce计算框架。MapReduce会把大任务分解为多个小任务,然后在每个小任务处理完毕后进行汇总。多个小任务是并行处理的,这种并发执行提高了存储效率。(3)Hbase数据库。存储数据不是通过关系型数据库实现,无须事先定义列的数目及类型,支持列的通道扩展;所有的列存储的数据都是二进制的。
2 检索算法及存储优化
图片的检索和图片的存储息息相关,存储图片的目的是为了检索并使用图片,因此图片的检索算法对图片的存储至关重要。
传统的图片存储一般都是通过Oracle等关系型数据库完成,然而传统的数据库在使用时存在一定的不足[2]:(1)数据需要满足表结构指定的类型,而且表结构通常是固定的,可扩展性不佳。(2)海量数据的存储效率比较低,不适合海量图片的高并发快速存取。正是基于这样的原因,在处理海量图片时,传统的图片检索方式主要有两种:基于文本特征的图片检索(TBIR)和基于内容的图片检索(CBIR)。
在数据量不太大时,存储图片时可以直接把每个图片和存储表的地址对应起来。然而,如果数据量比较大的时候,顺序存储表中的存储空间会浪费很多。
哈希检索算法是一种精准的检索算法,它主要包括哈希存储表以及哈希函数两个组成部分。哈希存储表是真正存储图片的存储空间,哈希函数是一种映射關系,指定了按照某规律分布的图片映射到不同的哈希存储表内。通过哈希检索算法检索图片时,需要的时间复杂度会大大降低,从而提高了检索效率。
为了解决海量的图片小文件的存储问题,可以采取不同的优化方案。Hadoop内置两种存储图片小文件的优化方案:SquenceFile以及MapFile。
Hadoop提供了存储二进制文件的机制——SquenceFile。多个小的图片文件可以组合为一个大的SquenceFile大文件,其结构如图1所示:
由图可以看出,SquenceFile文件由一系列键值对组成,其中Key处存放图片文件名,Value处存放图片文件的内容。对于存储海量小的图片文件来说,可以以这种Key/Value形式把若干图片文件写入到SquenceFile文件容器中。例如,假设有1000万张大小为30K的图片,则存放这些图片文件使用的SquenceFile大概为300G。
在实际应用过程中,为了提高网络带宽的传输速率,可以压缩SquenceFile大文件,同时也节省了磁盘空间。值得注意的是,虽然很多图片小文件可以存储到一个大的SquenceFile文件中,但是并没有维护小图片文件在SquenceFile文件中的索引关系,所以如果需要在SquenceFile大文件中检索一个图片文件,则需要遍历整个SquenceFile文件,图片检索效率不太好。
可以把MapFile看做是带索引的SequenceFile,Index部分存储图片文件的索引,Data部分存储图片文件。和SequenceFile类似的是,Data部分也是Key/Value的形式,key存放图片文件的文件名,Value存放图片文件。在需要访问MapFile中的小图片文件时,会先加载Index部分,从中获取小图片文件所在的位置,然后再访问Data部分存储的图片内容。
3 图片存储系统设计
在对小图片文件的存储模式进行优化后,可以将存储系统设计为业务层、服务层和存储层三部分[3]:业务层负责完成图片文件的业务处理,存储层实现存储功能,服务层为业务层或存储层的读取提供服务。
业务处理模块实现对图片数据的处理。图片在上传到存储平台前通常需要进行缩放、裁剪等操作。基于Hadoop的海量图片存储系统可以使用MapReduce处理图片,然后将处理后的图片存储到分布式HDFS上,从而减轻了各个工作节点的处理压力。
图片索引模块保存了图片的元数据。Hadoop系统中的元数据指的是保存到NameNode节点上的Block信息,然而在使用hadoop保存图片数据时,每个图片都有图片名称、上传时间、图片描述等信息,随着存储的图片数量越来越多,这些信息的总量也会越来越大,当这些元数据达到G级别的时候就不再适合保存到NameNode中,此时可以考虑将其存储到Hbase数据库内。默认情况下HDFS单个Block是64M,如果图片文件不大,则可以把多个图片文件拼接到一个Block中,既提高了HDFS的利用效率,又使得维护更加简单。
存储模块在多个廉价机器上部署HDFS文件系统,并对外提供可以实现对图片操作的接口。通常情况下保存的图片大小是不规则的,可以认为小于2M的图片是小图片,大于2M的图片是大图片,不同的图片采取不同的存储及检索策略。小图片可以直接安装上面的存储优化策略进行;大图片则需要使用MapReduce任务拆分后进行多次并行存取。
在同时存储的图片数量很多时,可能需要进行缓存。缓存服务模块的功能是构造缓存区,并对图片文件进行筛选过滤。传统的用于构建缓存区的Memecache对于小文件是比较适合的,但如果存储的是大图片文件,则存储效率会明显降低。Redis可以克服Memecache的这一不足,会周期性地对图片文件进行更新,或者追加写入。另外,Redis支持大文件缓存,在缓存量比较大时还能高速运行。
4 图片分布式处理设计
在进行图片的分布式处理时,设计理念如下[4]:把合并后的图片大文件存储到HDFS文件系统中,此处的大文件包括Index部分和Data部分。处理海量图片时,根据MapReduce计算框架的要求,Map阶段先加载图片的Index部分,根据Index对Data部分进行分割,并生成Split切片;各个数据节点处理完自己的切片后,生成一个个待处理的图片小文件;把这些图片小文件的内容作为Map程序的Value,图片文件名的Hash值作为Map程序的Key。
Map程序取得输入后,就可以对图片进行处理,比如调用OpenCV进行二值化。Map程序处理后的结果会以键值对的形式传递给Reduce程序,并最终生成处理后的图片。
MapReduce计算框架进行并行处理时,主要过程是先接收图片文件作为输入,并使用Map程序和Reduce程序进行转换处理,最后输出处理后的圖片文件。在这一过程中有两个接口至关重要:InputFormat接口用于控制输入文件,OutputFormat接口可以按照特定格式输出文件。InputFormat接口包括createRecordReader()和getSplits()两个方法,分别用于定义输入分片、读取分片,在并行处理海量图片的时候尤为有用。OutputFormat接口包含getRecordWriter()和checkOutputSpecs()两个方法,checkOutputSpecs()方法会确定每个并行任务的输出路径,getRecordWriter()方法会在Reduce阶段输出切片的Key/Value值。
5 总结
本文对基于Hadoop技术的海量图片的存储和处理进行研究。首先,介绍了Hadoop技术及其组成部分;接下来,在此基础上阐述了对图片的存储至关重要的图片检索算法,以提高图片的存储效率;然后分别进行图片的存储设计和分布式处理设计。
参考文献:
[1] 孙玉林, 王晓卉. 一种基于Hadoop的海量图片检索策略[J].电子技术与软件工程,2016 (18) :89-89.
[2] 王梅,朱信忠,赵建民,等.基于Hadoop的海量图像检索系统[J].计算机技术与发展,2013 (1) :204-208.
[3] 李林. 基于hadoop的海量图片存储模型的分析和设计[D].杭州电子科技大学硕士毕业论文,2011.12.
[4] 张振猛. 基于Hadoop的海量文件存储系统的分析与设计[D].北京工业大学,2015.
【通联编辑:王力】