【问题标题】:File compression formats and container file formats文件压缩格式和容器文件格式
【发布时间】:2016-11-26 01:46:02
【问题描述】:

一般来说,任何像 Gzip 这样的压缩格式,当与像 avro 和 sequence(文件格式)这样的容器文件格式一起使用时,都会使压缩格式可拆分。

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

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

更新:

我们是否有一种直接的方法可以将不可拆分的文件压缩格式(如 Gzip)的大文件转换为可拆分的文件(使用 Avro、Sequence 或 Parquet 等容器文件格式)以供 MapReduce 处理?

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

【问题讨论】:

    标签: hadoop mapreduce hadoop2 avro parquet


    【解决方案1】:

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

    Hadoop wiki 中描述了大部分内容:https://wiki.apache.org/hadoop/SequenceFile

    阻止压缩的键/值记录 - 键和值都是 单独收集在“块”中并压缩。的大小 'block' 是可配置的。

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

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

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

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

    GZip Text -> SequenceFile

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

    【讨论】:

    • 容器格式能否应用到使用不可拆分压缩格式压缩的文件之上?
    • container 这个词有点混乱,它们是file formats,所以如果你想把一个现有的文件转换成另一种格式,就必须有某种形式的转换。你不能只是包装文件。
    • 很抱歉给您带来了困惑。提到“容器文件格式”,我指的只是 hadoop 文件格式,例如 Avro。
    • 刚刚注意到您更新了问题,所以我在回答中添加了一些内容。
    【解决方案2】:

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

    我为什么这么说...希望您使用的是 Linux 或类似的东西。

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

    我的意思是:

    • 您可以根据需要将文件拆分为任意数量的块,每个块的大小不同,不需要太大甚至大小,512 字节的倍数等,无论您想要什么大小,数学上都表示为 splitted_file_size=(desired_size mod 1)。
    • 您定义了一个以正确顺序连接所有文件的块设备
    • 您定义了指向此类设备的符号链接

    这样您就可以将一个大文件(超过 16GiB,超过 4GiB)存储在一个 FAT32 分区(每个文件的限制为 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
    

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-09-20
      • 1970-01-01
      • 1970-01-01
      • 2017-11-12
      • 1970-01-01
      • 2016-11-19
      相关资源
      最近更新 更多