比较 Apache Hadoop 数据存储格式 - techwell


Apache Hadoop将数据存储在 Hadoop 分布式文件系统 (HDFS) 中。数据可以采用多种受支持的文件格式。 
要比较它们,请询问有关它们的属性的一些问题:

  1. 查询文件格式有多容易?查询时间不应产生太多延迟
  2. 序列化文件格式有多容易?数据序列化不应产生太多延迟
  3. 文件格式是否可拆分?数据在处理过程中被多次拆分
  4. 文件格式是否支持压缩? 

文本文件
文件被分成几行。行尾用回车 (\r) 或换行 (\n) 表示。键是文件中的位置,值是文本行。如果存储在 HDFS 中的数据需要以文本格式(例如电子邮件)易于访问,请使用文本文件。
文本文件是可拆分的。它们可能相对庞大,因为它们不支持块压缩,因此查询可能不如其他一些格式有效。对于压缩,请使用支持拆分的文件级压缩编解码器,例如 BZip2。
 
序列文件
序列文件将数据按行存储为二进制键/值对。二进制格式使其小于文本文件。序列文件是可拆分的。 
支持三种不同的序列文件格式:
  • 未压缩
  • 记录压缩——仅压缩值
  • 块压缩——键和值都被压缩

与文本格式相比的一个优点是序列文件格式支持块压缩,或单独压缩 HDFS 块,块是数据的最小单位。块压缩可以拆分 MapReduce 处理中使用的数据。 
 
Avro 文件
Avro 是一种紧凑、快速、基于行的二进制数据格式。Avro 适合存储复杂数据,因为它是一个基于模式的数据序列化系统。模式与数据一起编码,因此 Avro 数据是自描述的。 
序列文件可用于存储复杂数据,但它不是自描述的,数据的复杂性必须用数据标记,这使得序列文件的序列化和反序列化比 Avro 慢,用于复杂数据结构。单独的模式更容易编码和解码。
Avro 还支持块压缩以简化数据拆分。
 
Parquet文件
Parquet 是一种二进制列式存储格式。不是存储相邻的行,而是将相邻的数据列存储在一起,这在大多数查询都针对数据子集的情况下特别有用。仅获取所需的列数据,因此比必须扫描数据行以查找子集更有效。这也是一个优势,因为列数据是相似的数据,压缩相似的数据效率更高,存储空间更小。
Parquet 可能不适合 MapReduce 处理,因为它使用了完整的数据集。Parquet 适用于 Apache Hive 对数据子集的查询。
 
何时使用哪种文件格式
除了文本文件之外,所有常用的 Hadoop 存储格式都是二进制的。使用文本文件格式进行简单存储,例如 CSV 和电子邮件。对 MapReduce 处理的数据使用序列文件。将 Avro 用于复杂的数据结构。对子集查询的数据使用 Parquet,例如 Hive 中的数据仓库。