大数据的储存:百度HDFS集群的数据压缩

当前,数字信息急剧膨胀。根据IDC的研究结果,2011年创造的信息数量达到1800EB,每年产生的数字信息量还在以60%的速度高速增长,到2020年,全球每年产生的数字信息将达到35ZB。面对海量数据处理的需求,“大数据”这一新的概念应运而生。关于大数据的定义,目前还没有标准的说法。

  Hadoop Distributed File System,简称HDFS,是一个分布式文件系统。HDFS有着高容错性(fault-tolerent)的特点,并且设计用来部署在低廉的(low-cost)硬件上。而且它提供高吞吐量(high throughput)来访问应用程序的数据,适合那些有着超大数据集(large data set)的应用程序。HDFS放宽了(relax)POSIX的要求(requirements)这样可以实现流的形式访问(streaming access)文件系统中的数据。HDFS开始是为开源的apache项目nutch的基础结构而创建,HDFS是hadoop项目的一部分,而hadoop又是lucene的一部分。

  HDFS设计的针对对象主要适合流式访问的超大文件、在使用便宜的硬件搭建的集群上运行。HDFS中Block的大小默认是64M,小于块大小的的文件并不占据整个块的全部空间(一个块可能存有多个文件)。

  在谈到为什么使用百度HDFS集群的数据压缩时,孙桂林表示,在存储上带来了灵活的可扩展性、高可用性、充分提高了存储空间利用率。

  使用Blocks的好处

  1) 可以存储大文件,一个文件的大小可以大于任何一个单块硬盘的容量

  2) 把存储单元抽象成块而不是文件,简化了存储子系统:简化了数据管理、取消元数据关注

  3) 能很好适应数据复制,数据复制保证系统的容错和可用性。

  HDFS提供了两种namenode的容错机制:

  1) 备份存储持久化状态的文件系统元数据的文件

  2) 提供secondary namenode。Secondary的主要角色是合并namespace image和edit log,防止edit log过大。但是secondary namenode的数据较master namenode的数据有所延迟,所有数据恢复以后肯定会有数据丢失。

  一般来讲,冷数据和老数据经常会被压缩,块压缩相对于文件压缩的优势在于三方面。第一,透明性,客户端不需要知道压缩的存在,也不需要知道升级。第二,灵活性,对实际压缩的算法没有限制。第三,本地性,不需要在跨数据节点的压缩操作。

  百度HDFS集群的数据压缩

  提到异步压缩时,孙桂林表示,一个集群能从未压缩的状态变成压缩状态最多花费十天,如果压缩的数据很繁琐,我们可以通过处理器来减轻CPU的负载。


  存储压缩的机制

  DataNode数据已经压缩了,Client可能不知道,DataNode 在响应Client的时候回将数据解压。

  Client 和DataNode之间可以通过压缩的机制。整个通信协议需要一些扩展,需要告诉写方,我们所需要压缩的文件格式以及什么样的编码。在写的操作上,存储编码和传输编码不一样,我们可以选择是否压缩储存和传输编码。在读的操作上,支持一些协议来进行转换。


  为了节省带宽,我们尽量避免DataNode 和DataNode之间重复压缩的问题。在Append之前我们需要解压最后的块,还是解压最后一兆数据。一旦文件被Append之后,表示这个文件的最后一个块不被压缩。在压缩的时候,首先我们需要选择压缩速率,相对而言解压的速度更为关键。我们的目标是要实现节省存储空间、避免压缩影响计算作业,实时压缩透明。

  如何处理小文件

  1、 把小文件变成大文件(归档操作)

  2、 把相同目录下的小文件合成一个大文件。数据块的大小可以达到一个数量级,可以做压缩处理。

  不同的集群,压缩比部太一样,压缩比介于10%到50%之间,大部分的集群我们都可以获取50%以上的空间收益。

  未来,我们主推的是后台异步压缩,等待CPU空闲的时候,我们才会开始压缩。压缩过程和压缩编码完全透明,我们可以采用分级压缩方法。对于冷数据,我们可以使用一些极致的压缩算法,尽量来节省空间。通过一些归档操作,我们可以节省大量的磁盘空间。

  很多时候,我们A模块的输出数据刚好是B模块的输入,我们可以提供一个块共享的Quota Calculating ,我们可以通过块共享的机制使用快速拷贝。

  一个文件如果存在的时候,对于一些重复的块文件该怎么处理,这将是我们未来的发展方向。