大家好! 我们正在发布为数据工程师课程新组的学生准备的文章的翻译。 如果您有兴趣学习如何以最小的成本构建高效且可扩展的数据处理系统,请参阅Yegor Mateshuk 录制的大师班 !

几周前,我写了一篇有关Hadoop的文章,内容涉及
零件,并弄清楚他在数据工程领域扮演什么角色。 在本文中,我
我将简要介绍Hadoop中的各种文件格式。 快速简便
话题。 如果您想了解Hadoop的工作原理以及它在工作中所处的位置
数据工程师,在此处查看有关Hadoop的文章。
Hadoop文件格式分为两类:面向行和列
面向。
面向行:
一种类型的数据行存储在一起,形成连续的
存储:SequenceFile,MapFile,Avro Datafile。 因此,如有必要
整行只能访问一行中的少量数据
将被读入内存。 序列化延迟可以在某种程度上
缓解了这个问题,但是完全从读取整个数据行的开销中
驱动器将无法摆脱。 面向行的存储
适用于需要同时处理整条生产线的情况
数据。
面向列:
整个文件分为几个数据列和所有数据列
存储在一起:Parquet,RCFile,ORCFile。 面向列的格式(列
面向),允许您在读取数据时跳过不必要的列,
需要少量线路的情况。 但是这种读写形式
由于整个缓存行必须在内存中,因此需要更多的内存空间
(以获得多行的列)。 同时,它不适合
流式录制,因为录制失败后,当前文件将无法
恢复,并且线性数据可以重复使用
如果发生写入错误,则从最后一个同步点开始同步,因此,
例如,Flume使用面向行的存储格式。

图1(左)。 显示的逻辑表
图2(右)。 面向行的位置(序列文件)

图3.面向列的布局
如果您尚未完全了解列或行的方向,
不用担心 您可以单击此链接来了解两者之间的区别。
以下是Hadoop系统中广泛使用的一些文件格式:
序列文件
存储格式会根据存储是否被压缩而变化,
它使用写压缩还是块压缩:

图4.序列文件的内部结构,未压缩且具有记录压缩。
没有压缩:
按照与记录长度,键长度,度值,
键值和值值。 范围是字节数。 序列化
使用指定的执行。
记录压缩:
仅压缩值,并且压缩的编解码器存储在标头中。
块压缩:
压缩了多个记录,以便您可以使用
利用两个条目之间的相似性并节省空间。 标志
同步被添加到块的开始和结束。 最小块值
由o.seqfile.compress.blocksizeset属性设置。

图4.带有块压缩的序列文件的内部结构。
地图文件
映射文件是序列文件的一种。 将索引添加到
序列文件及其排序结果将生成一个映射文件。 索引存储为单独的
文件,通常包含128个条目中每个条目的索引。 指标可能是
加载到内存中以便快速检索,因为存储数据的文件,
按键指定的顺序排列。
映射文件条目必须按顺序排列。 否则我们
获取IOException。
派生地图文件类型:
- SetFile:一个特殊的映射文件,用于存储该类型的键序列
可写的 密钥以特定顺序写入。 - ArrayFile:键是一个整数,指示数组在其中的位置,值
键入可写。 - BloomMapFile:针对使用地图文件的get()方法进行了优化
动态布隆过滤器。 过滤器存储在内存中,常用方法
调用get()以仅在键值存在时读取
存在。
Hadoop系统上下面列出的文件包括RCFile,ORCFile和Parquet。
Avro的面向列的版本是Trevni。
RC文件
Hive的Record Columnar File ( 记录列文件) -这种类型的文件首先将数据分为几组行,
在行组中,数据存储在列中。 其结构如下
方式:

图5. RC文件数据在HDFS块中的位置。
与纯面向行和面向列的比较:

图6. HDFS块中逐行存储。

图7.按HDFS块中的列分组。
ORC文件
ORCFile(优化记录列文件)-是一种更有效的格式
文件而不是rcfile。 它在内部将数据分为250M条。
每个泳道都有一个索引,数据和页脚。 索引存储最小值和
每列的最大值,以及每行在列中的位置。

图8. ORC文件中的数据位置
Hive使用以下命令来使用.orc文件:
木地板
基于Google Dremel的面向列的通用存储格式。
特别适用于处理高度嵌套的数据。

图9. Parquet文件的内部结构。
实木复合地板将嵌套结构转换为扁柱存储,
由重复级别和定义级别(R和D)表示,并使用
元数据以恢复记录,而读取数据以恢复所有
文件。 接下来,您将看到R和D的示例:
AddressBook { contacts: { phoneNumber: “555 987 6543” } contacts: { } } AddressBook { }

仅此而已。 现在您知道了Hadoop中文件格式的差异。 如果
发现任何错误或不正确之处,请随时与我们联系
给我 您可以通过LinkedIn与我联系。