文件压缩格式和容器文件格式

时间:2016-07-22 08:25:59

标签: hadoop mapreduce hadoop2 avro parquet

通常说Gzip这样的压缩格式与avro和sequence(文件格式)等容器文件格式一起使用时,会使压缩格式可以分割。

这是否意味着容器格式的块会根据首选压缩(如gzip)或其他内容进行压缩。有人可以解释一下吗?谢谢!

嗯,我认为这个问题需要更新。

更新

我们是否有一种简单的方法将非可拆分文件压缩格式(如Gzip)中的大文件转换为可由MapReduce处理的可拆分文件(使用容器文件格式,如Avro,Sequence或Parquet)?

注意:我并不是要求解决方法,例如解压缩文件,再使用可拆分压缩格式压缩数据。

2 个答案:

答案 0 :(得分:1)

对于Sequence文件,如果指定BLOCK压缩,则将使用指定的压缩编解码器压缩每个块。块允许Hadoop在块级别拆分数据,同时使用压缩(压缩本身不可拆分)并跳过整个块而无需解压缩。

大部分内容都在Hadoop wiki上进行了描述:https://wiki.apache.org/hadoop/SequenceFile

  

阻止压缩的键/值记录 - 键和值都是   收集在'块'分开压缩。的大小   '块'是可配置的。

对于Avro,这一切也非常相似:https://avro.apache.org/docs/1.7.7/spec.html#Object+Container+Files

  

对象存储在可以压缩的块中。同步化   在块之间使用标记以允许有效地分割文件   用于MapReduce处理。

     

因此,可以有效地提取或跳过每个块的二进制数据   没有反序列化内容。

将数据从一种格式转换为另一种格式的最简单(通常是最快)的方法是让MapReduce为您完成工作。在以下示例中:

GZip Text -> SequenceFile

您将拥有仅使用TextInputFormat输入和输出SequenceFileFormat的地图作业。通过这种方式,您可以对文件数量进行一对一转换(如果需要更改,则添加一个reduce步骤),如果有大量要转换的文件,则可以并行执行转换。

答案 1 :(得分:0)

不知道你在说什么......但任何文件都可以在任何时候拆分。

为什么我这样说...希望你使用像Linux或类似的东西。

在Linux上,创建一个真正存储在某些文件串联中的块设备(不是太多)很容易。

我的意思是:

  • 你可以根据需要分割一个文件,每个都有不同的大小,不需要ood甚至大小,512个字节的倍数等等,无论你想要什么大小,mathematicaly expresed splitted_file_size =(desired_size mod 1)。
  • 您定义了一个以正确顺序连接所有文件的块设备
  • 您可以定义指向此类设备的符号链接

这样你就可以在一个FAT32分区上存储一个BIG文件(超过16GiB,超过4GiB)(每个文件的限制为4GiB-1字节)...并且可以即时访问它透明地......只在阅读时思考。

对于读/写......有一个有效的技巧(即复杂的部分):

  • 拆分文件(这次是N * 512字节的块)
  • 定义设备驱动程序参数化(因此它知道如何通过创建更多文件来分配更多块)

在Linux上,我过去使用了一些完成所有工作的工具(命令行),并且它们允许您创建可动态调整大小的虚拟容器,它将使用精确大小的文件(包括最后一个)并将其公开为常规块设备(您可以在其中执行dd if = ... of = ...来填充它)以及与之关联的虚拟文件。

你有这样的方式:

  • 一些大小相同的文件
  • 他们将保留内容的实际数据
  • 根据需要创建/删除它们(增长/缩小或截断)
  • 它们在某些点上作为常规文件公开
  • 访问此类文件将如串联所见

也许这可以让你了解你遇到的问题的其他方法:

  • 而不是调整压缩系统,只需放置一个层(比简单的循环设备稍微复杂一点)即时执行并透明地分割/连接

这样的工具存在,我不记得名字了,对不起!但我记得那个只读(dvd_double_layer。*在FAT32上):

# cd /mnt/FAT32
# ls -lh dvd_double_layer.*
total #
-r--r--r-- 1 root root 3.5G 2017-04-20 13:10 dvd_double_layer.000
-r--r--r-- 1 root root 3.5G 2017-04-20 13:11 dvd_double_layer.001
-r--r--r-- 1 root root 0.2G 2017-04-20 13:12 dvd_double_layer.002
# affuse dvd_double_layer.000 /mnt/transparent_concatenated_on_the_fly
# cd /mnt/transparent_concatenated_on_the_fly
# ln -s dvd_double_layer.000.raw dvd_double_layer.iso
# ls -lh dvd_double_layer.*
total #
-r--r--r-- 1 root root 7.2G 2017-04-20 13:13 dvd_double_layer.000.raw
-r--r--r-- 1 root root 7.2G 2017-04-20 13:14 dvd_double_layer.iso

希望这个想法可以帮助你。