欢迎使用CSDN-markdown编辑器

云计算 waitig 396℃ 百度已收录 0评论

海量图片存储方案

以hadoop的分布式文件系统HDFS构建可扩展的海量图片存储架构

需求分析

图片数据在1MB~2MB之间,数据量大,每两个星期增量为2TB,持续产生,设计的存储系统能够批量导出

HDFS特点

(1) 流式读取方式,主要是针对一次写入,多次读出的使用模式。写入的过程使用的是append的方式
(2) 设计目的是为了存储超大文件,主要是针对几百MB,GB,甚至TB的文件
(3) 该分布式系统构建在普通PC机组成的集群上,大大降低了构建成本,并屏蔽了系统故障,使得用户可以专注于自身的操作运算

系统构建难点

当个图片的数据量很小,Hadoop框架中的切片大小是以64MB为单位,主要适用于超大文件的存储,目前大多公司采用的方法是将多张图片或者记录压缩存储;另外对于图片的访问做了一些优化措施。

系统读写过程

写过程
这里写图片描述
图片产生抓取之后首先来到应用服务其排队进入HDFS存储系统,通过NameNode分配DataNode进行存储。图片写入过程先确定Block,再确定Sequence File,系统将两者的ID组合命名为图片在系统内的名称。图片的元数据存储在HBase中,主要保存有图片外部名与图片内部名的对应信息,还可加入其他需保存的选项。
具体流程:客户端发起写数据请求(step1),请求到达NameNode后,NameNode 权衡之后选择一个Block,并将Block和可写Block的DataNode的信息返回给客户端(step2),客户端写数据并备份(step3,step4),之后DataNode报告Block信息给NameNode,NameNode接收后返回写操作完成(step5,step6),然后DataNode向客户端报告写数据完成。
Hadoop的Sequence File可以将多个小文件合并压缩成一个块


读过程
这里写图片描述
读请求到达客户端之后,首先到HBase中获取图片内部描述名(包括图片所存储的块性息和偏移位置信息),然后根据通过NameNode获取对应存储块的DataNode,客户端到DataNode上读取对应块,通过偏移信息得到对应图片。

图片文件名设计

图片存储时,由于大量小图片未能达到单个Block的默认大小64M,且如果Block大小设置太小,会造成Block数量太多,对NameNode维护Block带来困难,所以我们采用图片拼接,将大量小图片拼接在一个Block。
这里写图片描述
这种做法是,使用Filename作为Key,并且File contents作为
Value。如果写入10000个100KB的文件,可以用写入程序来将这些小文件写入到一个单独的SequenceFile中去,然后就可以在单个Streaming Fashion中来使用这个SequenceFile。如图所示,每个文件都通过一个Key对应到SequenceFile中,这里我们可以设置一个偏移量,方便图片的读取。
图片文件名是指客户端使用图片时向图片存储系统发送的请求,为便于检索,我们将图片文件名进行设计,采用BlockId和Fileld通过一定的编码方式得到。编码的前部分是Blockld,代表DataNode上的一个存储单元,
NameNode可以根据Blockld确定最近的DataNode地址。由于数据Block是由大量的小图片合并生成,一个Block中可能包含有多个Sequence File,所以后面的FileId是指小图片合并时SequenceFile的Id,offset代表key做一个Sequence File上的偏移量。客户端发送请求后,前端处理通过解析图片文件名,定位到某个Block文件,以及Block中SequenceFile的Id和offset偏移量,客户端直接根据解析内容和NameNode提供的DataNode地址读取图片。

图片元数据存储

hadoop提供key-value型数据库hbase,其具有优点有:
1, 根据Key进行表的划分,将各个分表存储到不同的节点上,写入新数据的时候只需要根据Key的范围即可定位到存储该范围Key的DataNode,数据量达到百万后,HBase写入效率高于关系型数据库。查询数据时也是根据Key查找,可将针对海量数据的检索缩小到针对单个DataNode存储数据的检索,效率也高于关系型数据库。
2, 扩容性好,关系型数据分库分表一次需要处理大量的数据,时间上也比较长。HBase会设定单张表的大小,当一张表容量大于设定值后会自动分割成两张表。由于HBase是基于列而不是传统关系型数据库的基于行,所以表的分割不牵扯到表内容、表结构,分表效率远高于关系型数据库。
因为每个图片都有自己独立的图片文件名,所以我们采用图片文件名做Key,图片描述等作为列族,结构如图4.8所示,图片文件名做行键,便于图片检索和图片的读取,由于对图片文件名进行了定义,所以我们在分表的时候就按照Blockld划分,将相同Block中所包含图片的元数据存储在表中相近的位置,同一列族的数据,物理存储位置也是相近的,这样检索后磁头读取的时候,减少了磁头来回换道的时间消耗。


本文由【waitig】发表在等英博客
本文固定链接:欢迎使用CSDN-markdown编辑器
欢迎关注本站官方公众号,每日都有干货分享!
等英博客官方公众号
点赞 (0)分享 (0)