Avro和Parquet的比较

130

我计划在我的Hadoop相关项目中使用一个Hadoop文件格式。 我了解到,parquet对基于列的查询高效,而avro适用于全扫描或需要所有列的数据时!

在我继续选择其中一个文件格式之前,我想了解其中一个比另一个的缺点/不足之处。 有人可以用简单的语言解释一下吗?

6个回答

71

Avro是一种基于行的格式。如果您希望以整体的形式检索数据,则可以使用Avro。

Parquet是一种基于列的格式。如果您的数据包含大量列但只对其中的一部分感兴趣,则可以使用Parquet。

HBase在涉及频繁更新数据时非常有用。 Avro在检索方面很快,而Parquet则更快。


Parquet以混合方式将数据存储在磁盘上。它对数据进行水平分区,并以列方式存储每个分区。 - ns15

69

如果您还没有决定,我建议您开始编写数据的Avro模式。一旦完成,选择使用Avro容器文件还是Parquet文件就像是简单地交换例如,

job.setOutputFormatClass(AvroKeyOutputFormat.class);
AvroJob.setOutputKeySchema(MyAvroType.getClassSchema());

为了

job.setOutputFormatClass(AvroParquetOutputFormat.class);
AvroParquetOutputFormat.setSchema(job, MyAvroType.getClassSchema());

Parquet格式在写入方面似乎要更加计算密集型--例如,需要RAM进行缓冲和CPU进行数据排序等,但它应该可以减少I/O、存储和传输成本,并且特别适用于类似SQL(例如Hive或SparkSQL)查询中只涉及一部分列的高效读取。

在一个项目中,由于架构太复杂并且嵌套层次过多(源自一些相当分层的面向对象类),导致了1000多个Parquet列,最终我放弃了Parquet转而使用Avro容器。进而,我们的行组变得非常宽而浅,这意味着在处理每个组的最后一列的少量行之前需要花费很长时间。

我还没有太多机会将Parquet用于更规范/合理的数据,但我了解到如果使用得当,它可以带来显着的性能改进。


2
Parquet也支持嵌套数据集/集合。 - Tagar
@Ruslan:是的,从技术上讲,它支持嵌套结构。问题在于由于数据的广泛去规范化而导致列数非常高。它可以工作,但速度非常慢。 - steamer25
4
是的,使用Parquet写入数据会更加昂贵。相反地,读取数据则更为高效,特别是当查询通常只涉及部分列时。 - Tagar
4
除了同一列中的数据变化很大且几乎在所有列上进行分析之外,我认为Parquet适用于大多数用例。 - Rockie Yang
Apache Arrow目前还不支持混合嵌套(列表与字典或字典与列表)。因此,如果您想在Parquet中处理复杂的嵌套结构,您只能使用Spark、Hive等工具,这些工具不依赖于Arrow来读写Parquet。 - josiah

59
Avro和Parquet都是“自描述”的存储格式,这意味着在将数据存储在文件中时,它们都会嵌入数据、元数据信息和模式(schema)。
使用这两种存储格式取决于具体情况。以下三个方面构成了您选择最佳格式所依据的基础:
1. 读/写操作: Parquet是一种基于列(column-based)的文件格式,支持索引,适用于只写一次且需要频繁读取、复杂或分析查询、低延迟数据查询等情况。通常由最终用户/数据科学家使用。Avro则是一种基于行(row-based)的文件格式,最适合写入密集型操作,通常由数据工程师使用。两者都支持序列化和压缩格式,但方式不同。
2. 工具: Parquet非常适合Impala(一种大规模并行处理(MPP)RDBM SQL查询引擎,能够操作存储在一个或几个外部存储引擎中的数据),适用于HDFS上数据的复杂/交互式查询和快速(低延迟)输出。CDH (Cloudera Distribution Hadoop)支持此功能。Hadoop支持Apache的Optimized Row Columnar (ORC)格式(选择取决于Hadoop版本),而Avro最适合Spark处理。
3. 模式演变: 演变数据库模式意味着改变数据库的结构,因此也影响其数据和查询处理。Parquet和Avro都支持模式演变,但程度不同。Parquet适用于“追加”操作,例如添加列,但重命名列除非通过索引进行“读取”,否则不适用。相比之下,Avro更适合追加、删除和一般性的列变更操作。从历史上看,与Parquet相比,Avro提供了更丰富的模式演变功能,尽管它们的模式演变能力趋于模糊,但在这方面,Avro仍然比Parquet表现得更出色。

9
“工具”部分有些误导性。Parquet 被很多其他框架高效地使用,比如 Spark、Presto、Hive 等等。而 Avro 不仅适用于 Spark,也广泛应用于 HDFS 存储格式和消息传递场景,比如在 Kafka 中。 - ᐅdevrimbaris
4
Aakash Aggarwal问:第二段中的“Avro最适合Spark处理”是什么意思?正如devrimbaris提到的那样,Parquet也非常适合在Spark处理环境中使用。 o_O ?!?回答:Avro是最适合Spark处理的数据格式,因为它可以很好地与Spark集成,并且支持动态架构演化。但是,像Parquet这样的其他数据格式也可以在Spark处理环境中很好地工作。 - Cbhihe

57

Avro

  • 广泛用作序列化平台
  • 基于行,提供紧凑和快速的二进制格式
  • 模式被编码到文件中,因此数据可以无需标记就能够解析
  • 文件支持块压缩并可分割
  • 支持模式演变

Parquet

  • 面向列的二进制文件格式
  • 使用Dremel论文中描述的记录分片和组装算法
  • 每个数据文件包含一组行的值
  • 在需要查询特定列时,磁盘I/O效率高

摘自 选择HDFS数据存储格式- Avro vs. Parquet以及更多


15

你的理解是正确的。实际上,在我们的数据仓库中进行数据迁移时,我们遇到了类似的情况。我们选择了Parquet而不是Avro,因为我们得到的磁盘节省量几乎是使用AVro得到的两倍。此外,查询处理时间比Avro快得多。但是,是的,我们的查询基于聚合、基于列的操作等,因此Parquet可预见地成为明显的赢家。

我们正在使用来自CDH发行版的Hive 0.12。你提到你在Hive+Parquet方面遇到了问题,是什么问题?我们没有遇到任何问题。


5
Silver Blaze用一个使用案例演示了Parquet为何是他的最佳选择,并给出了详细描述。根据您的需求考虑哪种格式更合适是有意义的。我将简要介绍其他文件格式及时间空间复杂度比较。希望这能帮到您。
在Hive中可以使用许多文件格式,其中著名的是AVRO、Parquet、RCFile和ORC。如果您想比较这些文件格式的性能和空间利用率,请参考一些在线文档。以下是一些有用的链接,可以让您开始工作。 这篇博客文章 MapR的此链接[虽然他们没有讨论Parquet] Inquidia的此链接 上面提供的链接将让您开始工作。我希望这回答了您的问题。

谢谢!


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接