相信對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是一個早期的生產用戶,已經將超過300PB的數據存儲爲ORC格式。
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
);