Apache ORC深度探索(上篇)

相信對Hadoop生態系統熟絡的大數據開發者對ORC都不會陌生,筆者也是,那麼ORC具體是什麼?有哪些應用呢?我們今天來看一看這個在Hadoop生態系統中具有舉足輕重地位的存儲格式 - Apache ORC

一、Apache ORC簡介

Apache ORC(optimizedRC File) 存儲源自於RC這種存儲格式,是一種列式存儲引擎,對schema的變更(修改schema需要重新生成數據)支持較差,主要是在壓縮編碼、查詢性能方面做了優化。

ORC最早創建於2013年1月份,起初是爲了提升Apache Hive數據在Apache Hadoop中的存儲效率,後來發展勢頭不錯,獨立成一個單獨的Apache項目。ORC是一種自描述列式文件格式,專門爲Hadoop生態設計,用於大批量流式讀取場景。以列的格式組織存儲數據使數據讀取、解壓縮和處理僅需要處理一小部分數據。由於ORC文件是類型敏感的,寫操作隨着文件在寫的過程中,會選擇爲對應類型創建最合適的內部索引。

很多大型的Hadoop用戶都在使用ORC,比如Facebook使用ORC節約了他們數據倉庫的大量空間並宣稱ORC存儲格式比RC和Parquet存儲格式要快很多。ORC發展到今天,已經具備一些非常高級的feature,比如:

  • 支持update操作
  • 支持ACID:包括ACID事務和快照隔離;
  • 支持複雜類型:當前支持所有的Hive類型,包括符合類型,如:structs、lists、maps和unions;
  • 支持內建索引:在每一列的查詢處理上,都可以使用包括最小、最大和布隆過濾的索引方式跳到對應的查詢數據上;

二、Apache ORC當前使用情況

Apache Hadoop

ORC文件支持Hadoop MapReduce的讀寫操作,從ORC 1.1.0版本開始不再需要Hive可執行jar包及其依賴的支持。OrcStruct當前也已經實現了MapReduce shuffle操作的可寫適配。

Apache Spark

Apache Spark當前已經提供ORC文件的讀寫支持,支持列存項目和謂詞下推。

Apache Arrow

Apache Arrow當前支持ORC格式文件的讀寫。

Apache Flink

Apache Flink使用Table API的方式提供ORC文件的讀寫支持。

Apache Iceberg

Apache Iceberg使用ORC表提供ORC格式的支持。

Apache Druid

Apache Druid通過ORC擴展的方式支持ORC數據格式。

Apache Hive

Apache Hive可以說是ORC的親爹了。ORC格式強壯的類型系統、壓縮、列存、謂詞下推和向量化支持,在Hive衆多的數據格式中可謂是性能優越、獨樹一幟。

Apache Gobblin

Apache Gobblin通過Hive的SerDe庫來支持寫數據到ORC文件。

Apache Nifi

Apache Nifi也增加了寫ORC文件的支持。

Apache Pig

Apache Pig從Pig 14.0開始提供ORC文件的讀寫支持。

EEL

EEL是一個Scala大數據API,支持包括ORC在內的各種文件格式和存儲系統。EEL支持ORC的謂詞和預測下推。有一個特殊的使用場景,可以講JDBC的數據抽取出來然後轉換成ORC文件存儲在HDFS中,或者直接存儲成ORC格式的Hive表。

Facebook

Facebook是一個早期的生產用戶,已經將超過300PB的數據存儲爲ORC格式。

LinkedIn

LinkedIn在使用Apache Iceberg元數據平臺和Apache Gobblin時,底層存儲使用ORC文件格式。

Trino(之前叫Presto SQL)

Trino團隊在集成ORC到他們的SQL引擎中付出了很多精力,當然他們也收到了很好的效果。

Vertica

HPE Vertica對ORC C++庫有巨大的貢獻。ORC是Vertica SQL-on-Hadoop(VSQLoH)的重要組成部分,通過使用ORC爲Vertica分析型數據庫的Hadoop生態系統帶來了性能、可靠性和標準適配的諸多優勢。

三、Apache ORC支持的數據類型

ORC文件屬於完全自描述格式,不依賴Hive Metastore和其他任何外部元數據。ORC文件包含所存儲對象的所有類型和編碼信息。由於其自描述性,想要正確理解文件內容並不依賴任何特定的用戶環境。

ORC提供豐富的數據類型,包括

  • Integer

    • boolean (1 bit)
    • tinyint (8 bit)
    • smallint (16 bit)
    • int (32 bit)
    • bigint (64 bit)
  • Floating point

    • float
    • double
  • String types

    • string
    • char
    • varchar
  • Binary blobs

    • binary
  • Date/time

    • timestamp
    • timestamp with local time zone
    • date
  • Compound types

    • struct
    • list
    • map
    • union

所有ORC文件按照相同的類型對象進行邏輯順序組合。Hive通常使用帶有頂級列信息的struct作爲根對象類型,但這並不是必要條件。ORC中的所有類型都可以包含null值。另外需要注意,因爲timestamp有兩種表示形式,所以在使用時一定要做好選擇,大多數情況下,建議優先使用timestamp with local time zone格式,除非你的應用確實是使用的UTC時間作爲標準。

下面給出一個Foobar表的定義示例,並給出了一個文件結構樹示意圖:

create table Foobar (
 myInt int,
 myMap map<string,
 struct<myString : string,
 myDouble: double>>,
 myTime timestamp
);

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章