介绍

对于数据湖,在Hadoop生态系统中,使用HDFS文件系统。但是,大多数云提供商已将其替换为自己的深度存储系统,例如S3GCS。使用深度存储时,选择正确的文件格式至关重要

这些文件系统或深度存储系统比数据库便宜,但仅提供基本存储,不提供强大的ACID保证。

您需要根据您的需要和预算为您的用例选择合适的存储.例如,如果预算允许,您可以使用数据库进行摄入,然后在数据转换之后,将其存储在数据湖中,以便进行OLAP分析。或者您可以将所有内容都存储在深度存储中,但是在快速存储系统(如关系数据库)中只存储一小部分热数据。

文件格式

请注意,深度存储系统将数据存储为文件,不同的文件格式和压缩算法为某些用例提供了好处。如何在数据湖中存储数据非常关键,您需要考虑格式、压缩,特别是如何对数据进行分区。

最常见的格式是CSV,JSON,AVRO,Protocol Buffers,,Parquet和ORC。




HDFS和YARN均是( )架构 hdfs orc文件_hdfs orc格式


选择格式时应考虑以下几点:
数据的结构:某些格式可以接受嵌套数据,例如JSON,Avro或Parquet,而其他格式则不能。 即使这样做,也可能不会对其进行高度优化。 Avro是嵌套数据的最有效格式,我建议不要使用Parquet嵌套类型,因为它们效率很低。 进程嵌套JSON也非常占用CPU。 通常,建议在摄取数据时将其放平。
性能:Avro和Parquet等某些格式的性能优于其他JSON。 即使在Avro和Parquet的不同用例之间,一个也会比其他更好。 例如,由于Parquet是基于列的格式,因此使用SQL查询数据湖非常有用,而Avro更适合ETL行级转换。
易于阅读:考虑是否需要人们阅读数据。 JSON或CSV是文本格式,并且易于阅读,而功能更强的格式例如镶木地板或Avro是二进制。
压缩:某些格式比其他格式提供更高的压缩率。
模式演变:在数据湖中添加或删除字段要比在数据库中复杂得多。 诸如Avro或Parquet之类的某些格式提供了某种程度的架构演变,使您可以更改数据架构并仍然查询数据。 诸如Delta Lake格式的工具甚至提供了更好的工具来处理模式中的更改。
兼容性:JSON或CSV被广泛采用并与几乎所有工具兼容,而性能更高的选项具有较少的集成点。

文件格式

CSV:兼容性,电子表格处理和人类可读数据的好选择。 数据必须是平坦的。 它效率不高,无法处理嵌套数据。 分隔符可能存在问题,可能导致数据质量问题。 使用此格式进行探索性分析,POC或小型数据集。

JSON:在API中大量使用。 嵌套格式。 它被广泛采用并且易于阅读,但是如果有很多嵌套字段,可能很难阅读。 非常适合小型数据集,着陆数据或API集成。 如果可能,请在处理大量数据之前转换为更有效的格式。

Avro:非常适合存储行数据,非常高效。 它具有模式并支持进化。 与Kafka的完美集成。 支持文件分割。 用于行级操作或在Kafka中。 写数据很棒,读起来慢。

proto buffer :非常适合API,尤其是gRPC。 支持架构,并且非常快。 用于API或机器学习。

Parquet:列式存储。 它具有架构支持。 它与Hive和Spark配合使用非常好,可以将列数据存储在使用SQL查询的深度存储中。 因为它将数据存储在列中,所以查询引擎将只读取具有选定列的文件,而不读取与Avro相反的整个数据集的文件。 将其用作报告层。

ORC:类似于Parquet,它提供了更好的压缩效果。 它还提供了更好的模式演化支持,但是不太流行。

文件压缩

最后,您还需要考虑如何压缩数据,考虑文件大小和CPU成本之间的权衡。有些压缩算法速度更快,但文件大小更大;有些压缩算法速度较慢,但压缩率更好。更多细节请看这篇文章。


HDFS和YARN均是( )架构 hdfs orc文件_数据_02


我建议使用快照来流式传输数据,因为它不需要太多的CPU能力。 对于批处理,bzip2是一个不错的选择。

结论

如我们所见,CSV和JSON易于使用,易于阅读和通用格式,但是缺乏其他格式的许多功能,因此它太慢而无法用于查询数据湖。 ORC和Parquet在Hadoop生态系统中被广泛用于查询数据,而Avro在Hadoop之外也被使用,尤其是与Kafka一起使用时,它对于行级ETL处理非常有用。 面向行的格式比面向列的格式具有更好的模式演化功能,这使它们成为数据提取的理想选择。