hadoop+hbase海量小图片处理

来源:互联网 发布:新版淘宝收藏店铺在哪 编辑:程序博客网 时间:2024/04/30 06:39

1.方法原理:

系统借鉴Hbase存储的基本原理,提出以“状态标记位”的方法为当前并不能完美支持追加处理的HDFS的Mapfile文件提供了一种有效的解决方法,既解决了HDFS小文件存储的问题,又解决了Mapfile即时修改的问题。

2.方法介绍:

在海量图片背景中,图片的存储形式探讨就成为了保证系统性能的重要部分。HDFS存在普遍的小文件存储的通病,对小文件的读取通常会造成大量从datanode到datanode的seeks和hopping来retrieve文件,而这样是非常的低效的一种访问方式。因此对于大小远小于HDFS的块大小的文件,需要进行处理后再存入HDFS中。

几乎所有的图片都远远小于64M(HDFS默认数据块大小),处理这些大量的小图片就需要某种形式的容器来通过某种方式来打包这些file。Hadoop提供了一些选择。主要可以选择的有HARfile、Sequencefile、Mapfile。本系统采用了Mapfile作为小文件的容器存储。

同时,若对于所有小于64M的图片均进行打包,则会加大打包文件的过程的资源损耗,因此需要定一个阈值,当文件大小超过该阈值后进行打包操作,否则直接通过namenode进行上传。本系统所定的阈值为2MB。

此外,由于Hadoop在最新的版本才支持文件的追加append操作,但对于Mapfile还没有完善的支持。这意味着若用原始处理方法,每一次上传操作将会重写原Mapfile,效率低下。本系统采用了“标记法”对Mapfile打包小文件时的增删改查进行处理,保证了图片存储访问的效率。

3.具体实现:

图片基本操作包括图片的增加、删除、修改和查询。由于图片存储在HDFS的特殊环境,因此图片的增删改查操作需要进行特殊的处理。由于mapfile不支持追加写入操作,这样每次进行操作需要对原mapfile文件进行覆盖写入,效率低下。

为了实现相应功能,本系统对Hbase中存储的图片元数据增加了一个状态标志位,该状态位可能的取值为“HdfsLargeFile”,“HdfsMapflie”,“LocalSmallFile”以及“Deleted”四种。每次上传操作会进行会进行文件大小判断,并对其进行相应处理,更新标志位。

对于mapfile的增加操作,本系统使用了写缓存队列的操作进行支持。每次用户的上传操作之后,会将图片写入到本地队列,标志位为“LocalSmallFile”,当队列到达指定上传阈值后,再启动线程进行打包,并且更新标志位为“HdfsMapfile”。

标志位汇总参数如表4-1所示:

图片状态标志位表

标志

文件

存储

HdfsLargeFile

大文件

HDFS

HdfsMapflie

小文件(已打包)

HDFS(Mapfile容器)

LocalSmallFile

小文件(队列中)

本地队列

Deleted

已删除文件

HDFS(等待碎片处理)

为了使得mapfile打包的图片能够支持即时的删改操作,本系统用“标记法”进行了处理。对于已删除的文件,并非实际删除,而是在Hbase存储的数据中,对该图片增加“删除”标记,使得其在查询时不被查到,做到对于用户的删除。而在每次删除操作后启动维护线程检查该Mapfile的碎片(即已删除的图片),若碎片到达一定数量,即启动线程进行合并碎片操作。

系统对图片的增删改查操作进行了多级封装,保证各个类高内聚,低耦合的特点,也保证了系统图片操作功能的稳定性。

3.1 增加图片

3.1.1 功能说明

当用户上传图片时,执行增加图片操作。用户上传图片到系统,系统通过业务逻辑处理判断图片是否为大文件。

3.1.2处理流程

若图片为大文件,则将图片直接传到HDFS中,同时更新数据库相关信息。

若图片为小文件,则先写入本地队列,并启动异步线程检查本地文件队列是否达到打包上传的阈值。如果已达到则将本地文件写入mapfile,以unix时间戳命名该mapfile,上传至HDFS用户空间内,并更新数据库。

对于用户而言,尽管图片经过的严格的处理,但图片被上传到了虚拟化的云端,满足了需求。图片上传流程如图4-1所示:


3.2 删除图片

3.2.1 功能说明

用户删除图片时,需要执行删除图片操作。删除操作对于用户而言,是展示层上的删除,而内部操作较为复杂。

3.2.2 处理流程

业务逻辑层接受删除图片名,查询Hbase元数据获得图片数据,读取标志位。

若图片标志位为“HdfsLargeFile”,则表示图片为大图片,当前存储在HDFS中,则直接将其删除,并更新Hbase数据库。

若图片标志位为“LocalFile”,则表示图片在本地上传队列中,则从服务器中直接将其删除,并更新Hbase数据库。

若图片标志位为“HdfsMapfile”,则表示图片为小图片,且已经经过Mapfile打包处理。则需要在Hbase里将图片的标志位改为“Deleted”,并启动异步维护线程,检查该Mapfile中“Deleted”标志的数量,若数量达到给定阈值,则进行碎片处理,合并Mapfile碎片。对于已经被打上“Deleted”标记的图片,用户在查询时是不会被显示的,即对于用户而言该图片已经被删除。删除图片流程如图4-2所示:


3.3 更新图片

3.3.1 功能说明

用户在应用中心进行图片压缩、图片裁剪、图片水印等操作并保存后会进行更新图片。

3.3.2 处理流程

业务逻辑层获取文件名,查询Hbase图片的元数据,获取图片的标志位。

若图片标志位为“HdfsLargeFile”,则表示图片为大图片,当前存储在HDFS中,则将更新后的图片写入当前图片路径,将原图片覆盖。

若图片标志位为“LocalFile”,则表示图片在本地上传队列中,则将更新后的图片写入当前本地缓存文件夹,覆盖当前的图片。

若图片标志位为“HdfsMapfile”,则表示图片为小图片,且已经经过Mapfile打包处理。则需要在Hbase里将图片的标志位改为“Deleted”,将更新后的图片写入上传队列,并启动异步维护线程,检查该Mapfile中“Deleted”标志的数量,若数量达到给定阈值,则进行碎片处理,合并Mapfile碎片。更新图片相关流程如图4-3所示:


 

3.4 查询图片

3.4.1 功能说明

查询图片贯穿了整个管理系统的过程,几乎每一步骤都需要用到查询图片的从操作。

3.4.2 处理流程

业务逻辑获取图片名,查询Hbase获得图片元数据,读取图片状态标识位。

若标志位为“HdfsLargeFile”表示该图片为大文件,存储在HDFS中,则直接通过namenode将其读出;

若图片标志位为“HdfsMapfile”则表示该图片为小文件,且已经经过打包操作成为Mapfile文件,则获取其存在的Mapfile文件名,通过Mapfile读取操作将其读出。

若图片标志位为“LocalFile”则表示该图片正在本地缓存队列中,则直接通过本地IO进行读取。

读取图片操作流程如图4-4所示:


0 0
原创粉丝点击