Avro与镶木地板


91

我计划为我的hadoop相关项目使用hadoop文件格式之一。我了解镶木地板对于基于列的查询和avro进行全面扫描或需要所有列数据都是有效的!

在继续选择一种文件格式之前,我想了解一种相对于另一种的缺点/缺点。有人可以简单地向我解释吗?

Answers:


53

如果您还没有决定,我将继续为您的数据编写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)中读取。

在一个项目中,我最终从Parquet转换为Avro容器,因为该模式过于广泛和嵌套(源自某些相当分层的面向对象的类),并导致了数千个Parquet列。反过来,我们的行组确实又宽又浅,这意味着要花很长时间才能在每个组的最后一列中处理少量的行。

我还没有太多机会使用Parquet来处理更规范化/合理的数据,但是我知道,如果使用得当,它可以显着提高性能。


2
Parquet也支持嵌套数据集/集合。
塔加尔

@Ruslan:是的,它确实在技术上支持嵌套结构。问题是由于数据的大量去规范化,导致列数非常大。它起作用了,但是非常慢。
steamer25年

4
是的,在镶木地板中写入数据更昂贵。读取是另一种方式,特别是如果您的查询通常读取列的子集时。
塔加

4
我认为Parquet适用于大多数用例,但同一列中的数据相差很大,并且几乎对所有列都进行了分析。
罗基·杨

Apache Arrow还不支持混合嵌套(带有字典的列表或带有列表的字典)。因此,如果您想在Parquet中处理复杂的嵌套,则会遇到Spark,Hive等问题,并且这类工具不依赖Arrow来读写Parquet。
约西亚

49

Avro是基于行的格式。如果要整体检索数据,可以使用Avro

实木复合地板是基于列的格式。如果您的数据包含很多列,但您对列的子集感兴趣,则可以使用Parquet

当涉及到频繁的数据更新时,HBase很有用。Avro的检索速度很快,Parquet的速度要快得多。


7
请在最后一段中修正最后2个句子。他们是完全不可理解的。
Cbhihe

39

阿夫罗

  • 广泛用作序列化平台
  • 基于行,提供紧凑而快速的二进制格式
  • 模式已编码在文件上,因此可以取消标记数据
  • 文件支持块压缩并且可拆分
  • 支持架构演变

木地板

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

选择HDFS数据存储格式-Avro vs.Parquet等


29

Avro和Parquet都是“自描述​​”的存储格式,这意味着在将数据存储在文件中时,它们都嵌入数据,元数据信息和架构。两种存储格式的使用取决于用例。您可以选择三个方面的依据,以选择适合您情况的最佳格式:

  1. 读/写操作:Parquet是基于列的文件格式。它支持索引。因此,它适用于一次写入和读取密集,复杂或分析性查询,低延迟数据查询。最终用户/数据科学家通常使用此方法。
    同时,Avro是基于行的文件格式,最适合用于写密集型操作。通常由数据工程师使用。两者都支持序列化和压缩格式,尽管它们以不同的方式进行。

  2. 工具:实木复合地板非常适合Impala。(Impala是一种大规模并行处理(MPP)RDBM SQL查询引擎,它知道如何对一个或几个外部存储引擎中的数据进行操作。)Parquet同样非常适合复杂/交互式查询和快速(低延迟) )输出HDFS中的数据。CDH(Cloudera Distribution Hadoop)支持此功能。Hadoop支持Apache的Optimized Row Columnar(ORC)格式(选择取决于Hadoop分布),而Avro最适合Spark处理。

  3. 模式演变:发展数据库计划意味着改变数据库的结构,从而改变其数据,从而改变其查询处理。
    Parquet和Avro都支持模式演变,但程度不同。
    Parquet对于“添加”操作(例如添加列)很有用,但不适用于重命名列,除非通过索引完成“读取”。
    与Parquet相比,Avro更适合于追加,删除列和通常的变异列。从历史上看,Avro提供了比Parquet更为丰富的模式演化可能性,尽管其模式演化能力趋于模糊,但与Parquet相比,Avro仍然在该领域大放异彩。


5
“工具”部分有点误导。Parquet被Spark,Presto,Hive等许多其他框架有效地使用。Avro并非特定于Spark,它被广泛用作HDFS存储格式和消息传递方案,例如在Kafka中。
ᐅdevrimbaris

2
Aakash Aggarwal:您能否用“ Avro最适合Spark处理”来解释第2段的含义?正如devrimbaris提到的,Parquet也很好地集成在Spark处理环境中。o_O?!?
Cbhihe

11

您的理解是正确的。实际上,在DWH中进行数据迁移时,我们遇到了类似的情况。我们选择Parquet而不是Avro,因为节省的磁盘几乎是AVro的两倍。而且,查询处理时间比Avro好得多。但是,是的,我们的查询基于聚合,基于列的操作等。因此,Parquet无疑是一个明显的赢家。

我们正在使用CDH发行版中的Hive 0.12。您提到您遇到了Hive + Parquet的问题,那是什么?我们没有遇到任何。


3

Silver Blaze通过一个示例用例很好地描述了产品,并描述了Parquet对他而言是最佳选择。根据您的要求,一个考虑另一个是有意义的。我还将对其他文件格式进行简要说明,并进行时空复杂度比较。希望能有所帮助。

您可以在Hive中使用一堆文件格式。值得注意的是AVRO,镶木地板。RCFile和ORC。如果您想比较这些文件格式的性能和空间利用率,可以在线参考一些好的文档。遵循一些有用的链接,这些链接将带您进入。

此博客文章

来自MapR的此链接[尽管他们不讨论Parquet]

这个链接来自Inquidia

以上给出的链接将带您进入。希望这个回答您的查询。

谢谢!


0

只是有关Parquet的描述,您可以在这里参考:http : //bigdata.devcodenote.com/2015/04/parquet-file-format.html

我打算很快写有关Avro的文章,以及两者之间的比较。完成后将在此处发布。


等待比较。目前,我为我的项目选择了Avro,因为镶木地板与蜂巢存在兼容性问题:)
Abhishek 2015年

1
@Abshinek,你可以提供兼容性问题的一些信息与蜂房,Avro公司
EB

@EB应该没有任何问题,如果有的话,请在cwiki.apache.org/confluence/display/Hive/AvroSerDe中
OneCricketeer
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.