Parquet vs ORC vs Snappy的ORC


87

我正在对Hive可用的存储格式进行一些测试,并使用Parquet和ORC作为主要选项。我将ORC包含一次默认压缩,一次包含Snappy。

我已经阅读了许多文档,这些文档指出Parquet在时间/空间复杂度上比ORC更好,但是我的测试与我通过的文档相反。

跟随我的数据的一些细节。

Table A- Text File Format- 2.5GB

Table B - ORC - 652MB

Table C - ORC with Snappy - 802MB

Table D - Parquet - 1.9 GB

就我桌子的压缩而言,实木复合地板最糟糕。

我对以上表格的测试得出以下结果。

行计数操作

Text Format Cumulative CPU - 123.33 sec

Parquet Format Cumulative CPU - 204.92 sec

ORC Format Cumulative CPU - 119.99 sec 

ORC with SNAPPY Cumulative CPU - 107.05 sec

列运算的总和

Text Format Cumulative CPU - 127.85 sec   

Parquet Format Cumulative CPU - 255.2 sec   

ORC Format Cumulative CPU - 120.48 sec   

ORC with SNAPPY Cumulative CPU - 98.27 sec

列操作的平均值

Text Format Cumulative CPU - 128.79 sec

Parquet Format Cumulative CPU - 211.73 sec    

ORC Format Cumulative CPU - 165.5 sec   

ORC with SNAPPY Cumulative CPU - 135.45 sec 

使用where子句从给定范围中选择4列

Text Format Cumulative CPU -  72.48 sec 

Parquet Format Cumulative CPU - 136.4 sec       

ORC Format Cumulative CPU - 96.63 sec 

ORC with SNAPPY Cumulative CPU - 82.05 sec 

这是否意味着ORC比Parquet更快?还是我可以做些什么来使其在查询响应时间和压缩率上更好地工作?

谢谢!


1
您可以共享用于该实验的通用算法吗?不过,必须使用相同的数据。但是共享其他所有内容以使用不同的数据集完成相同的结果可能对提供更好的答案或证明您有很好的观点并永远改变世界非常有用。
麦斯特圣

使用orc vs parquet,您有火花vs tez结果吗?从我所看到的来看,使用orc格式时好像tez更快(快3倍)。
David H

+1是您不错的基准测试概述。无论如何,由于幕后某些技术方面已发生变化(例如,如@jonathanChap的答案中所述),您是否有机会提供更新版本?
Markus

Answers:


52

我要说的是,这两种格式都有自己的优势。

如果您具有高度嵌套的数据,则Parquet可能会更好,因为它像Google Dremel一样将其元素存储为树(请参阅此处)。
如果将文件结构展平,则Apache ORC可能会更好。

据我所知,镶木地板尚不支持索引。ORC带有轻量级索引,并且自Hive 0.14起提供了额外的Bloom Filter,这可能有助于改善查询响应时间,尤其是在求和操作时。

Parquet的默认压缩为SNAPPY。表A-B-C和D是否拥有相同的数据集?如果是,当它仅压缩到1.9 GB时,看起来好像有一些阴影


2
表A-文本文件格式-不压缩.........表B-带ZLIB压缩的ORC文件格式..................表C-带Snappy的ORC ....表D-Snappy实木复合地板.....我在另一个具有〜150列和〜160 GB大小的表上工作,检查文件格式在那里的表现。Parquet花费了35 GB来存储160GB数据,而带快照的ORC则花费了39GB……与有问题的测试相比,Parquet的压缩方式看起来更好,但是性能再次表现出相似的水平。比ORC + SNAPPY组合具有更好的性能。
拉胡尔2015年

1
我的用例的数据结构比较平坦,没有任何嵌套。我同意您对Parquet vs ORC的索引意见,实际上确实有所作为。两者的性能比较是否有任何可分享的结果?这可能有助于平息我正确实施格式的良心。:)
Rahul

我从未在Parquet上测试过我的数据集,因为索引是必要条件,而且我们的数据结构也平坦,没有嵌套信息。我发现的是,根据存储文件的位置,您需要不同的条带和文件大小才能获得最佳效果。当您将文件永久存储在HDFS上时,最好有较大的文件和条带。“ set mapred.max.split.size = 4096000000”是我用来影响文件大小的参数,并将条带大小保留为其默认值。通过此设置,它使我的查询和压缩率提高了约94%。
PhanThomas

如果要将文件作为冷存储存储在Amazon S3上,则较小的文件和条带大小会给我带来更好的结果。我使用了40-60MB的文件,其中包含一个Stripe。
PhanThomas

44

您看到此消息是因为:

  • Hive具有矢量化的ORC读取器,但没有矢量化的实木复合地板读取器。

  • Spark具有矢量化实木复合地板读取器,而没有矢量化ORC读取器。

  • Spark在镶木地板上表现最佳,蜂巢在ORC上表现最佳。

当运行带有Spark的ORC和Parquet时,我已经看到了类似的差异。

向量化意味着对行进行批量解码,从而显着提高了内存局部性和缓存利用率。

(自Hive 2.0和Spark 2.1起正确)


18
截至2.3.0,火花:有一个矢量ORC读者issues.apache.org/jira/browse/SPARK-16060
斯蒂恩

6
Hive 2.3.0已对Parquet阅读器进行矢量化处理-issue.apache.org/jira/browse/HIVE-14815
ruhong

从Spark 2.3开始,Spark支持矢量化ORC读取器spark.apache.org/docs/latest/sql-data-sources-orc.html
Anurag Sharma,

10

Parquet和ORC都有各自的优点和缺点。但我只是尝试遵循一个简单的经验法则- “您的数据嵌套多少,其中有多少列”。如果您遵循Google Dremel,则可以找到镶木地板的设计方式。他们使用分层的树状结构来存储数据。嵌套越深,树越深。

但是ORC是为扁平化文件存储设计的。因此,如果使用较少的列将数据展平,则可以使用ORC,否则,镶木地板将很适合您。在ORC中,对扁平化数据的压缩效果惊人。

我们使用更大的扁平化文件进行了一些基准测试,将其转换为spark Dataframe并将其存储为S3中的镶木地板和ORC格式,并使用** Redshift-Spectrum **进行了查询。

Size of the file in parquet: ~7.5 GB and took 7 minutes to write
Size of the file in ORC: ~7.1. GB and took 6 minutes to write
Query seems faster in ORC files.

不久我们将对嵌套数据进行一些基准测试,并在此处更新结果。


6

我们做了一些基准测试,比较了不同用例中的不同文件格式(Avro,JSON,ORC和Parquet)。

https://www.slideshare.net/oom65/file-format-benchmarks-avro-json-orc-parquet

数据都是公开可用的,并且基准代码都是开源的,位于:

https://github.com/apache/orc/tree/branch-1.4/java/bench


5
这确实很有用,但是应该声明@Owen是Horton Works的作品,该作品最初开发的是ORC文件格式
Daniel Kats '18

1
谢谢!但是第二个链接断开了。您能否将其从答案中修复或删除?
Danilo Gomes

3

他们两个都有自己的优势。我们将Parquet与Hive和Impala一起使用,但只想指出ORC相对于Parquet的一些优势:在长时间执行的查询中,当Hive查询ORC表时,GC的调用频率降低了大约10倍。对于许多项目而言可能无济于事,但对其他项目可能至关重要。

当您只需要从表中选择几列时,ORC所花费的时间也少得多。由于矢量化查询的执行,某些其他查询(尤其是带有联接的查询)所花费的时间也更少,这不适用于Parquet

而且,ORC压缩有时会有点随机,而Parquet压缩则更加一致。看起来当ORC表具有许多数字列时-它也不会压缩。它会影响zlib和snappy压缩

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.