寄木細工vsORC vs ORC with Snappy


88

Hiveで利用可能なストレージ形式でいくつかのテストを実行し、主要なオプションとしてParquetとORCを使用しています。ORCをデフォルトの圧縮で1回、Snappyで1回含めました。

私は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が寄木細工より速いことを意味しますか?または、クエリの応答時間と圧縮率を改善するためにできることはありますか?

ありがとう!


1
その実験を行うために使用される一般的なアルゴリズムを共有できますか?ただし、同じデータを使用する必要があります。しかし、他のすべてを共有して異なるデータセットで同じ結果を達成することは、より良い答えを与えたり、非常に良い点があることを証明したり、世界を永遠に変えたりするのに非常に役立つ場合があります。
メストレサン2016

orc vs parquetを使用したsparkvs tezの結果はありますか?私が見たところ、orc形式を使用するとtezの方が速い(3倍速い)ようです。
David H

+1は、ベンチマークの概要を示しています。とにかく、舞台裏のいくつかの技術的側面が変更されたので(たとえば、@ jonathanChapの回答で説明されているように)、更新されたバージョンを提供できる可能性はありますか?
マルクス

回答:


52

これらのフォーマットには両方とも独自の利点があると思います。

寄木細工は、Google Dremelのように要素をツリーとして格納するため、高度にネストされたデータがある場合に適している可能性があります(ここを参照)。
ファイル構造がフラット化されている場合は、ApacheORCの方が適している可能性があります。

そして、私が知る限り、寄木細工はまだインデックスをサポートしていません。ORCには軽量のインデックスが付属しており、Hive 0.14以降、追加のブルームフィルターが追加されています。これは、特に合計演算に関して、クエリの応答時間を改善するのに役立つ可能性があります。

Parquetのデフォルトの圧縮はSNAPPYです。表A-B-CとDは同じデータセットを保持していますか?はいの場合、1.9 GBにしか圧縮されないのに、何か怪しげなことがあるように見えます


2
表A-テキストファイル形式-圧縮なし.........表B-ZLIB圧縮を使用したORCファイル形式.........表C-Snappyを使用したORC .......表D-Snappyを使用した寄木細工.....ファイル形式がそこでどのように機能するかを確認するために、最大150列および最大160GBのサイズの別のテーブルで作業しました。Parquetはその160GBのデータを保存するのに35GBを要し、snappyを使用したORCは39GBを要しました......問題のテストと比較してParquetの圧縮ははるかに優れていましたが、パフォーマンスは再び同様のラインでした。ORCはここでも輝いていました。 ORC + SNAPPYの組み合わせよりも優れたパフォーマンス。
Rahul 2015

1
私のユースケースのデータ構造は、ネストなしでよりフラットでした。Parquet vs ORCに関するあなたの索引付けコメントに同意しますが、それは実際に違いを生みます。両方のパフォーマンス比較から共有する結果はありますか?それは私がフォーマットを正しく実装しているという私の良心を落ち着かせるのに役立つかもしれません。:)
Rahul 2015

インデックスが必要な要件であり、ネストされた情報のないフラットなデータ構造もあるため、Parquetでデータセットをテストしたことはありません。私が理解したのは、ファイルを保存する場所に応じて、最良の結果を得るには異なるストライプとファイルサイズが必要であるということです。ファイルをHDFSに永続的に保存する場合は、ファイルとストライプを大きくすることをお勧めします。「setmapred.max.split.size = 4096000000」は、ファイルサイズに影響を与えるために使用したパラメーターであり、ストライプサイズをデフォルト値のままにしました。この設定では、クエリと圧縮率が約94%向上しました。
PhanThomas 2015

ファイルをAmazonS3にコールドストレージとして保存する場合は、ファイルとストライプサイズを小さくすると、はるかに良い結果が得られます。単一のストライプを含む40〜60MBのサイズのファイルを使用しました。
PhanThomas 2015

44

あなたはこれを見ています:

  • Hiveにはベクトル化されたORCリーダーがありますが、ベクトル化された寄木細工のリーダーはありません。

  • Sparkには、ベクトル化された寄木細工のリーダーがあり、ベクトル化されたORCリーダーはありません。

  • Sparkは寄木細工で最高のパフォーマンスを発揮し、hiveはORCで最高のパフォーマンスを発揮します。

ORCとParquetwith Sparkを実行すると、同様の違いが見られます。

ベクトル化とは、行がバッチでデコードされることを意味し、メモリの局所性とキャッシュ使用率を劇的に改善します。

(Hive2.0およびSpark2.1の時点で正しい)


18
2.3.0の時点で、sparkにベクトル化されたORCリーダーがあります:issues.apache.org/jira/browse/SPARK-16060
Steen

6
ハイブ2.3.0は寄せ木リーダーをベクトル化している- issues.apache.org/jira/browse/HIVE-14815を
ruhong

スパーク2.3以来、スパークは、ベクトル化ORCリーダーのサポートspark.apache.org/docs/latest/sql-data-sources-orc.html
アヌラッグ・シャーマ

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は元々ORCファイル形式を開発したHortonWorksで機能するという免責事項があります
Daniel Kats 2018

1
ありがとう!しかし、2番目のリンクは壊れています。修正するか、回答から削除していただけますか?
Danilo Gomes 2018

3

どちらにも利点があります。私たちはHiveとImpalaと一緒にParquetを使用していますが、Parquetに対するORCのいくつかの利点を指摘したいと思います。長時間実行されるクエリ中に、HiveがORCテーブルGCを呼び出す頻度が約10分の1になります。多くのプロジェクトにとっては何の役にも立たないかもしれませんが、他のプロジェクトにとっては重要かもしれません。

また、テーブルから数列だけを選択する必要がある場合、ORCの所要時間ははるかに短くなります。他のいくつかのクエリ、特に結合を使用する場合も、Parquetでは使用できないベクトル化されたクエリの実行により、時間がかかりません。

また、ORC圧縮は少しランダムな場合がありますが、Parquet圧縮の方がはるかに一貫性があります。ORCテーブルに多数の数値列がある場合のように見えます-圧縮もされません。zlibとsnappy圧縮の両方に影響します

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.