整套大数据学习资料(视频+笔记)百度网盘无门槛下载:http://www.edu360.cn/news/content?id=3377

4.2.2压缩和输入分片

hadoop 花牛 7℃ 0评论

在考虑如何压缩将由MapReduce处理的数据时,理解这些压缩格式是否支持切分(splitting)是非常重要的。以一个存储在HDFS文件系统中且压缩前大小为1GB的文件为例。如果HDFS的块大小设置为64MB,那么该文件将被存储在16个块中,把这个文件作为输人数据的MapReduce作业,将创建16个数据块,其中每个数据块作为一个map任务的输入。

现在,经过gzip压缩后,文件大小为1GB。与以前一样,HDFS将这个文件保存为16个数据块。但是,将每个数据块单独作为一个输入分片是无法实现工作的,因为无法实现从gzip压缩数据流的任意位置读取数据,所以让map任务独立于其他任务进行数据读取是行不通的。gzip格式使用DEFLATE算法来存储压缩后的数据,而DEFLATE算法将数据存储在一系列连续的压缩块中。问题在于从每个块的起始位置进行读取与从数据流的 任意位置开始读取时一致并接着往后读取下一个数据块,因此需要与整个数据流进行同步。由于上述原因,gzip并不支持文件切分。

在这种情况下,MapReduce会采用正确的做法,它不会尝试切分gzip压缩文件,因为它知道输入是gzip压缩文件(通过文件扩展名看出)且gzip不支持切分。这是可行的,但牺牲了数据的本地性:一个map任务处理16个HDFS块,而其中大多数块并没有存储在执行该map任务的节点。而且,map任务数越少,作业的粒度就较大,因而运行的时间可能会更长。

在前面假设的例子中,如果文件是通过LZO压缩的,我们会面临相同的问题,因为这个压缩格式也不支持数据读取和数据流同步。但是,在预处理LZO文件的时候使用包含在Hadoop LZO库文件中的索引工具是可能的。该工具构建了切分点索引,如果使用恰当的MapReduce输入格式可有效实现文件的可切分特性。

另一方面,bzip2文件提供不同数据块之间的同步标识(pi的48位近似值), 因而它支持切分。可以参见表4-1,了解每个压缩格式是否支持切分。

应该使用哪种压缩格式?

Hadoop应用处理的数据集非常大,因此需要借助于压缩。使用哪种压缩格式与待处理的文件的大小、格式和所使用的工具相关。下面有一些建议,大致是按照效率从高到低排列的。

· 使用容器文件格式,例如顺序文件(第130页)、RCFile(第438 页)或者Avro数据文件(第117页),所有这些文件格式同时支持压缩和切分。通常最好与一个快速压缩工具联合使用,例如 LZOLZ4,或者Snappy。

· 使用支持切分的压缩格式,例如bzip2(尽管bzip2非常慢),或者使用通过索引实现切分的压缩格式,例如LZO

· 在应用中将文件切分成块,并使用任意一种压缩格式为每个数据块建立压缩文件(不论它是否支持切分)。这种情况下,需要合理选择数据块的大小,以确保压缩后数据块的大小近似于HDFS 块的大小。

· 存储未经压缩的文件。

对于大文件来说,不用使用不支持切分整个文件的压缩格式,因为会失去数据的本地特性,进而造成MapReduce应用效率低下。

转载请注明:全栈大数据 » 4.2.2压缩和输入分片

喜欢 (0)or分享 (0)
发表我的评论
取消评论

表情

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址