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

byqmnocz  于 2021-05-29  发布在  Hadoop
关注(0)|答案(2)|浏览(428)

一般来说,任何压缩格式(如gzip)与容器文件格式(如avro和sequence(文件格式))一起使用时,都会使压缩格式可拆分。
这是否意味着容器格式中的块将基于首选压缩(如gzip)或其他方式进行压缩。有人能解释一下吗?谢谢!
嗯,我想这个问题需要更新一下。
更新:
我们是否有一种简单的方法将不可拆分文件压缩格式(如gzip)中的大文件转换为可拆分文件(使用容器文件格式,如avro、sequence或parquet)以供mapreduce处理?
注意:我的意思不是要求解决方法,例如解压缩文件,然后再次使用可拆分压缩格式压缩数据。

bf1o4zei

bf1o4zei1#

不知道你在说什么。。。但是任何文件都可以在任何点被分割。
我为什么这么说。。。希望你用的是linux或者类似的东西。
在linux上,创建一个真正存储在某些文件串联上的块设备(不是太容易)。
我是说:
你可以将一个文件分成任意多个块,每个块的大小不同,不需要是ood甚至大小,512字节的倍数,等等,不管你想要什么大小,数学上表示分割的文件大小=(desired\u size mod 1)。
您可以定义一个按正确顺序连接所有文件的块设备
您可以定义指向此类设备的符号链接
这样,您就可以在一个fat32分区上存储一个大文件(超过16gib,超过4gib)(每个文件的限制为4gib-1字节)。。。在飞行中以透明的方式访问它。。。只在阅读时思考。
对于读/写。。。有一个诀窍(即复杂的部分)是有效的:
拆分文件(这次是n*512字节的块)
定义一个参数化的设备驱动程序(这样它就知道如何通过创建更多的文件来分配更多的块)
在linux上,我过去使用过一些工具(命令行)来完成所有的工作,它们允许您创建一个动态调整大小的虚拟容器,该容器将使用精确大小的文件(包括最后一个),并将其公开为常规块设备(您可以在其中执行dd if=。。。共=。。。以及与之关联的虚拟文件。
这样你就有了:
一些大小不太一样的文件
它们将保存流的真实数据
根据需要创建/删除它们(增长/收缩或截断)
它们在某个点上作为常规文件公开
访问这样的文件就像连接一样
也许这会给你提供解决问题的其他方法:
与其调整压缩系统,不如放一个层(比简单的循环设备复杂一点),它可以动态透明地执行拆分/连接
这样的工具存在,我不记得名字了,对不起!但我记得那个只读的(dvd\U双层。*在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

希望这个想法能对你有所帮助。

hts6caw3

hts6caw32#

如果指定 BLOCK 压缩时,将使用指定的压缩编解码器对每个块进行压缩。块允许hadoop在块级别拆分数据,同时使用压缩(压缩本身不可拆分)并跳过整个块而无需解压缩。
其中大部分内容在hadoop wiki上进行了描述:https://wiki.apache.org/hadoop/sequencefile
块压缩键/值记录-键和值分别收集在“块”中并进行压缩。“块”的大小是可配置的。
对于avro来说,这也非常相似:https://avro.apache.org/docs/1.7.7/spec.html#object+容器+文件
对象存储在可以压缩的块中。在块之间使用同步标记,以便高效地拆分文件以进行mapreduce处理。
因此,可以有效地提取或跳过每个块的二进制数据,而无需对内容进行反序列化。
将数据从一种格式转换为另一种格式最简单(通常也是最快)的方法是让mapreduce为您完成这项工作。例如: GZip Text -> SequenceFile 您将有一个只使用 TextInputFormat 输入和输出 SequenceFileFormat . 通过这种方式,您可以对文件数进行1:1转换(如果需要更改,请添加reduce步骤),如果要转换的文件很多,则可以并行进行转换。

相关问题