镶木地板格式与其他格式相比有哪些优缺点?

时间:2016-04-24 10:59:30

标签: file hadoop hdfs avro parquet

Apache Parquet的特点是:

  • 自我描述
  • 列式格式
  • 语言无关

与Avro,序列文件,RC文件等相比。我想要了解格式的概述。我已经阅读过:How Impala Works with Hadoop File Formats,它提供了有关格式的一些见解,但我想知道如何访问数据&以这些格式中的每一种格式存储数据。木地板如何优于其他木纹?

4 个答案:

答案 0 :(得分:208)

我认为我能描述的主要区别与面向记录和面向列的格式有关。面向记录的格式是我们所习惯的 - 文本文件,CSV,TSV等分隔格式。 AVRO比那些稍微凉爽,因为它可以随时间改变模式,例如添加或删除记录中的列。各种格式的其他技巧(特别是包括压缩)涉及是否可以拆分格式 - 也就是说,您是否可以从数据集中的任何位置读取记录块并仍然知道它的架构?但是有关像Parquet这样的柱状格式的详细信息。

Parquet和其他列式格式可以非常有效地处理常见的Hadoop情况。通常情况下,表(数据集)的列数比设计良好的关系数据库中的列多得多 - 一百或两百列并不罕见。之所以如此,是因为我们经常使用Hadoop作为从关系格式中反演数据的地方 - 是的,你会得到很多重复的值,而且很多表都被压平成一个。但是查询变得更容易,因为所有连接都已解决。还有其他优点,例如保留状态及时数据。所以无论如何,在桌子上放置一大堆柱子是很常见的。

让我们说有132列,其中一些是非常长的文本字段,每个不同的列一个接着另一个,并且每个记录可能使用10K。

虽然从SQL角度来看查询这些表格很容易,但您通常希望根据这些百余列中的少数列来获取某些记录。例如,对于销售额为>的客户,您可能需要2月和3月的所有记录。 $ 500

要以行格式执行此操作,查询将需要扫描数据集的每个记录。读取第一行,将记录解析为字段(列)并获取日期和销售列,如果满足条件,则将其包含在结果中。重复。如果您有10年(120个月)的历史记录,那么您只需查看每个记录中的2个即可阅读每一条记录。当然,这是一个很好的机会,可以在年月和月份上使用分区,但即便如此,您还要阅读并解析这两个月的每个记录/行的10K,以确定客户的销售额是否为> $ 500

以柱状格式,记录的每个列(字段)与其他类型一起存储,遍布磁盘上的许多不同块 - 一年中的列,一起的列,一起用于客户员工手册的列(或其他长文本),以及使这些记录如此庞大的所有其他记录都在磁盘上各自独立的位置,当然还有一起销售的列。哎呀,日期和月份都是数字,销售也是如此 - 它们只是几个字节。如果我们只需要为每条记录读取几个字节来确定哪些记录与我们的查询相匹配,那会不会很好?柱状存储救援!

即使没有分区,扫描满足我们查询所需的小字段也非常快 - 它们全部按记录顺序排列,并且大小相同,因此磁盘搜索包含记录的数据检查要少得多。无需阅读该员工手册和其他长文本字段 - 只需忽略它们即可。因此,通过将列彼此分组而不是行,您几乎总能扫描较少的数据。赢了!

但等等,它变得更好。如果您的查询只需要了解这些值以及更多信息(让我们说132列中的10个)并且不关心该员工手册列,一旦它选择了正确的记录返回,它就会现在只需要回到渲染结果所需的10列,忽略我们数据集中132的其他122列。我们再次跳过很多阅读。

(注意:出于这个原因,在进行直接转换时,柱状格式是一个糟糕的选择,例如,如果您将所有两个表连接成一个大的(ger)结果集,而您正在保存作为一个新表,无论如何都会完全扫描源代码,因此读取性能不会带来很多好处,而且由于柱状格式需要更多地记住其中的内容,因此它们使用的内存比类似的行格式。)

柱状的另一个好处是:数据传播。要获得单个记录,您可以让132名工作人员从132个数据块上的132个不同位置读取(和写入)数据。是的并行化!

现在对于紧要关头:压缩算法在找到重复模式时效果更好。您可以将AABBBBBBCCCCCCCCCCCCCCCC压缩为2A6B16C,但ABCABCBCBCBCCCCCCCCCCCCCC不会变得那么小(实际上,在这种情况下,它会,但相信我:-))。所以再一次,少阅读。也写作。

因此,我们阅读了很少的数据来回答常见的查询,并行读取和写入的速度可能更快,压缩往往更好。

当输入端很大时,柱状很棒,输出是一个经过滤的子集:从大到小都很棒。当输入和输出大致相同时,效果不佳。

但在我们的案例中,Impala接受了我们在5,10,20或30分钟内运行的旧H​​ive查询,并在几秒钟或一分钟内完成了大部分查询。

希望这有助于回答至少部分问题!

答案 1 :(得分:34)

Avro是Hadoop的基于行的存储格式。

Parquet是Hadoop的基于列的存储格式。

如果您的用例通常扫描或检索每个查询中的一行中的所有字段,则Avro通常是最佳选择。

如果您的数据集包含许多列,并且您的用例通常涉及使用这些列的子集而不是整个记录,则Parquet会针对此类工作进行优化。

Source

答案 2 :(得分:18)

汤姆的答案非常详尽和详尽,但你可能也对this simple study感兴趣的关于Parquet vs Avro在Allstate保险公司完成的事情,总结如下:

“总的来说,Parquet在每次测试中都显示出相似或更好的结果[比Avro]。在Parquet中较大数据集的查询性能差异部分归因于压缩结果;在查询宽数据集时,Spark必须读取Parquet的数据比Avro少3.5倍。在处理整个数据集时,Avro表现不佳。“

答案 3 :(得分:3)

选择正确的文件格式对于构建高性能数据应用程序很重要。这篇文章中概述的概念将延续到Pandas,Dask,Spark和Presto / AWS Athena。

列修剪

列修剪是一项重大的性能改进,它可以用于基于列的文件格式(Parquet,ORC),而不能用于基于行的文件格式(CSV,Avro)。

假设您有一个包含100列的数据集,并想将其中两个读入DataFrame。如果数据存储在Parquet文件中,则可以使用Pandas执行此操作。

import pandas as pd

pd.read_parquet('some_file.parquet', columns = ['id', 'firstname'])

Parquet是一种列式文件格式,因此Pandas可以获取与查询相关的列,并可以跳过其他列。这是巨大的性能改进。

如果数据存储在CSV文件中,则可以这样读取数据:

import pandas as pd

pd.read_csv('some_file.csv', usecols = ['id', 'firstname'])

usecols不能跳过整个列,因为CSV文件格式的行性质。

Spark不需要用户明确列出将在查询中使用的列。 Spark会建立一个执行计划,并会在可能的情况下自动利用列修剪。当然,只有当基础文件格式是面向列的时,才可以进行列修剪。

受欢迎程度

Spark和Pandas具有用于CSV,JSON,ORC,Parquet和文本文件的内置读取器编写器。他们没有内置的Avro阅读器。

Avro在Hadoop生态系统中很流行。 Parquet在Hadoop生态系统之外获得了巨大的吸引力。例如,Delta Lake项目是基于Parquet文件构建的。

Arrow是一个重要的项目,可以轻松处理具有多种不同语言(C,C ++,Go,Java,JavaScript,MATLAB,Python,R,Ruby,Rust)的Parquet文件,但是不支持Avro。 Parquet文件更易于使用,因为它们受许多不同项目的支持。

架构

Parquet将文件架构存储在文件元数据中。 CSV文件不存储文件元数据,因此需要为读者提供模式,或者需要推断模式。提供模式很繁琐,而推导模式则容易出错/代价高昂。

Avro还将数据模式存储在文件本身中。在文件中包含模式是一个巨大的优势,并且是现代数据项目不应依赖JSON或CSV的原因之一。

列元数据

镶木地板也存储metadata statistics for each columnlets users add their own column metadata

最小/最大列值元数据允许Dask&Spark集群计算框架支持Parquet谓词下推过滤。

以下是使用PyArrow获取列统计信息的方法。

import pyarrow.parquet as pq

parquet_file = pq.ParquetFile('some_file.parquet')
print(parquet_file.metadata.row_group(0).column(1).statistics)
<pyarrow._parquet.Statistics object at 0x11ac17eb0>
  has_min_max: True
  min: 1
  max: 9
  null_count: 0
  distinct_count: 0
  num_values: 3
  physical_type: INT64
  logical_type: None
  converted_type (legacy): NONE

复杂的列类型

Parquet允许使用复杂的列类型,例如数组,字典和嵌套模式。没有可靠的方法以CSV等简单文件格式存储复杂类型。

压缩

列式文件格式将相关类型存储在行中,因此更易于压缩。该CSV文件相对难以压缩。

first_name,age
ken,30
felicia,36
mia,2

当相关类型存储在同一行中时,此数据更易于压缩:

ken,felicia,mia
30,36,2

最常用Snappy压缩算法压缩Parquet文件。 Snappy压缩文件是可拆分的,并且可以快速膨胀。大数据系统既要减少磁盘上的文件大小,又要使其迅速膨胀并运行分析查询。

文件的可变性质

实木复合地板文件不可更改,as described here。 CSV文件是可变的。

将行添加到CSV文件很容易。您无法轻松地将行添加到Parquet文件中。

数据湖

在大数据环境中,您将处理成百上千个Parquet文件。文件的磁盘分区,避免大文件和压缩小文件很重要。数据的最佳磁盘布局取决于您的查询模式。