Apache开源列式存储引擎Parquet和ORC比较
?
相比傳統(tǒng)的行式存儲引擎,列式存儲引擎具有更高的壓縮比,更少的IO操作而備受青睞(注:列式存儲不是萬能高效的,很多場景下行式存儲仍更加高效),尤其是在數(shù)據(jù)列(column)數(shù)很多,但每次操作僅針對若干列的情景,列式存儲引擎的性價比更高。在互聯(lián)網(wǎng)大數(shù)據(jù)應(yīng)用場景下,大部分情況下,數(shù)據(jù)量很大且數(shù)據(jù)字段數(shù)目很多,但每次查詢數(shù)據(jù)只針對其中的少數(shù)幾行,這時候列式存儲是極佳的選擇,目前在開源實現(xiàn)中,最有名的列式存儲引擎是Parquet和ORC,在最近一年內(nèi),它們都晉升為Apache頂級項目,可見它們的重要性。本文嘗試比較這兩種存儲引擎。
Apache Parquet
源自于google Dremel系統(tǒng)(可下載論文參閱),Parquet相當(dāng)于Google Dremel中的數(shù)據(jù)存儲引擎,而Apache頂級開源項目Drill正是Dremel的開源實現(xiàn)。
Apache Parquet 最初的設(shè)計動機是存儲嵌套式數(shù)據(jù),比如Protocolbuffer,thrift,json等,將這類數(shù)據(jù)存儲成列式格式,以方便對其高效壓縮和編碼,且使用更少的IO操作取出需要的數(shù)據(jù),這也是Parquet相比于ORC的優(yōu)勢,它能夠透明地將Protobuf和thrift類型的數(shù)據(jù)進行列式存儲,在Protobuf和thrift被廣泛使用的今天,與parquet進行集成,是一件非容易和自然的事情。 除了上述優(yōu)勢外,相比于ORC, Parquet沒有太多其他可圈可點的地方,比如它不支持update操作(數(shù)據(jù)寫成后不可修改),不支持ACID等。
Apache ORC
ORC(OptimizedRC File)存儲源自于RC(RecordColumnar File)這種存儲格式,RC是一種列式存儲引擎,對schema演化(修改schema需要重新生成數(shù)據(jù))支持較差,而ORC是對RC改進,但它仍對schema演化支持較差,主要是在壓縮編碼,查詢性能方面做了優(yōu)化。RC/ORC最初是在Hive中得到使用,最后發(fā)展勢頭不錯,獨立成一個單獨的項目。Hive 1.x版本對事務(wù)和update操作的支持,便是基于ORC實現(xiàn)的(其他存儲格式暫不支持)。ORC發(fā)展到今天,已經(jīng)具備一些非常高級的feature,比如支持update操作,支持ACID,支持struct,array復(fù)雜類型。你可以使用復(fù)雜類型構(gòu)建一個類似于parquet的嵌套式數(shù)據(jù)架構(gòu),但當(dāng)層數(shù)非常多時,寫起來非常麻煩和復(fù)雜,而parquet提供的schema表達方式更容易表示出多級嵌套的數(shù)據(jù)類型。
Parquet與ORC對比
總結(jié)
目前在互聯(lián)網(wǎng)領(lǐng)域,列式存儲已經(jīng)逐步被用于各種產(chǎn)品線中,比如twitter已經(jīng)將部分數(shù)據(jù)格式轉(zhuǎn)換為parquet,所占空間和查詢時間減少了約1/3(來源:https://adtmag.com/articles/20 ... .aspx?)。在Twitter,日志格式使用thrift描述,使用Parquet存儲,下圖是一個典型的數(shù)據(jù)格式描述,共有87個字段,7層嵌套關(guān)系。
?
總結(jié)
以上是生活随笔為你收集整理的Apache开源列式存储引擎Parquet和ORC比较的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: android poi使用教程,poi的
- 下一篇: K_A16_003 基于STM32等单片