我打算在hadoop相关项目中使用其中一种hadoop文件格式。我了解实木复合地板对于基于列的查询是有效的,而avro用于完全扫描或当我们需要所有列数据时!
在我继续选择其中一种文件格式之前,我想了解一种文件格式的缺点/缺点。任何人都可以用简单的语言向我解释一下吗?
答案 0 :(得分:46)
如果您还没有决定,我会继续为您的数据编写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容器,因为模式过于广泛和嵌套(从一些相当分层的面向对象的类派生)并导致1000个Parquet列。反过来,我们的行组实际上是宽而浅的,这意味着我们在每组的最后一列中处理少量行之前需要花费很长时间。
我还没有多少机会使用Parquet获得更多标准化/合理的数据,但据我所知,如果使用得当,它可以显着提升性能。
答案 1 :(得分:39)
Avro是一种基于行的格式。如果您想要整体检索数据,可以使用Avro
Parquet是基于列的格式。如果您的数据包含很多列,但您对列的子集感兴趣,那么您可以使用Parquet
当您经常更新数据时,HBase非常有用。 Avro的检索速度很快,Parquet的速度要快得多。
答案 2 :(得分:24)
阿夫罗
木地板
答案 3 :(得分:14)
两种格式的使用取决于用例。根据3个因素,我们可以选择在我们的案例中选择哪种格式:
读/写操作:Parquet是基于列的文件格式,因此支持索引,因此适用于读取密集型,复杂或分析性查询,低延迟数据。这通常由最终用户/数据科学家使用。而AVRO是一种基于行的文件格式,最适合写入密集型操作。这通常由数据工程师使用。 两者都支持序列化和压缩格式。
工具:Parquet最适合Impala(拥有MPP引擎),因为它负责复杂/交互式查询和低延迟输出。这得到了CDH的支持。像这样HDP支持ORC格式(选择也取决于hadoop分布)。鉴于Avro最适合Spark处理。
架构演变:意味着在转换和处理过程中更改数据架构。 Parquet和Avro都支持模式演变,但在某种程度上。相比之下,Avro提供了更丰富的Schema演变。当我们进行一些追加操作(如添加列)时,Parquet很好,但Avro适用于追加,删除和修改操作。与Parquet相比,Avro在这方面更加出色。
答案 4 :(得分:8)
您的理解是正确的。实际上,我们在DWH中的数据迁移过程中遇到了类似的情况。我们选择Parquet over Avro,因为我们获得的磁盘节省几乎是我们用AVro获得的两倍。此外,查询处理时间比Avro好得多。但是,是的,我们的查询基于聚合,基于列的操作等。因此,Parquet可以说是一个明显的赢家。
我们正在使用CDH发行版的Hive 0.12。你提到你遇到了Hive + Parquet的问题,那是什么?我们没有遇到任何。
答案 5 :(得分:3)
Silver Blaze很好地描述了一个示例用例,并描述了Parquet如何成为他的最佳选择。根据您的要求考虑一个在另一个上是有意义的。我正在简要介绍不同的其他文件格式以及时间空间复杂性比较。希望有所帮助。
您可以在Hive中使用一堆文件格式。值得一提的是AVRO,Parquet。 RCFile& ORC。如果要比较这些文件格式的性能和空间利用率,可以参考一些在线可用的好文档。遵循一些有用的链接,可以帮助您。
This link from MapR [They don't discuss Parquet though]
上面给出的链接可以帮到你。我希望这能回答你的问题。
谢谢!
答案 6 :(得分:0)
只是有关Parquet的说明,您可以参考:http://bigdata.devcodenote.com/2015/04/parquet-file-format.html
我打算很快写一篇关于Avro的文章,以及两者之间的比较。一旦完成就会在这里发布。