我們?cè)谑褂貌煌囊孢M(jìn)行大數(shù)據(jù)計(jì)算時(shí),需要將數(shù)據(jù)根據(jù)計(jì)算引擎進(jìn)行適配。這是一個(gè)相當(dāng)棘手的問題,為此出現(xiàn)了一種新的解決方案:介于上層計(jì)算引擎和底層存儲(chǔ)格式之間的一個(gè)中間層。這個(gè)中間層不是數(shù)據(jù)存儲(chǔ)的方式,只是定義了數(shù)據(jù)的元數(shù)據(jù)組織方式,并向計(jì)算引擎提供統(tǒng)一的類似傳統(tǒng)數(shù)據(jù)庫中 “表” 的語義。它的底層仍然是 Parquet、ORC 等存儲(chǔ)格式。
基于此,Netflix 開發(fā)了 Iceberg,目前已經(jīng)是 Apache 的頂級(jí)項(xiàng)目,https://iceberg.apache.org/。
1.數(shù)據(jù)湖的解決方案 - Iceberg
1.1 Iceberg 是什么
Apache Iceberg is an open table format for huge analytic datasets. Iceberg adds tables to compute engines including Flink Trino Spark and Hive using a high-performance table format that works just like a SQL table.
Iceberg 是一種開放的數(shù)據(jù)湖表格式。可以簡單理解為是基于計(jì)算層(Flink、Spark)和存儲(chǔ)層(ORC,Parquet,Avro)的一個(gè)中間層,用 Flink 或者 Spark 將數(shù)據(jù)寫入 Iceberg,然后再通過其他方式來讀取這個(gè)表,比如 Spark,F(xiàn)link,Presto 等。
在文件 Format(Parquet
/ Avro
/ ORC
等)之上實(shí)現(xiàn) Table 語義:
- 支持定義和變更 Schema
- 支持 Hidden Partition 和 Partition 變更
- ACID 語義
- 歷史版本回溯
- 借助 Partition 和 Columns 統(tǒng)計(jì)信息實(shí)現(xiàn)分區(qū)裁剪
- 不綁定任何存儲(chǔ)引擎,可拓展到
HDFS
/S3
/OSS
等 - 容許多個(gè)
writer
并發(fā)寫入,樂觀鎖機(jī)制解決沖突
1.2 Iceberg 的 Table Format 介紹
Iceberg 是為分析海量數(shù)據(jù)而設(shè)計(jì)的,被定義為 Table Format,Table Format 介于計(jì)算層和存儲(chǔ)層之間。
Table Format 向下管理在存儲(chǔ)系統(tǒng)上的文件,向上為計(jì)算層提供豐富的接口。存儲(chǔ)系統(tǒng)上的文件存儲(chǔ)都會(huì)采用一定的組織形式,譬如讀一張 Hive 表的時(shí)候,HDFS 文件系統(tǒng)會(huì)帶一些 Partition、數(shù)據(jù)存儲(chǔ)格式、數(shù)據(jù)壓縮格式、數(shù)據(jù)存儲(chǔ) HDFS 目錄的信息等,這些信息都存在 Metastore 上,Metastore 就可以稱之為一種文件組織格式。
一個(gè)優(yōu)秀的 文件組織格式,如 Iceberg,可以更高效的支持上層的計(jì)算層訪問磁盤上的文件,做一些 list
、rename
或者查找等操作。
表和表格式是兩個(gè)概念。表是一個(gè)具象的概念,應(yīng)用層面的概念,我們天天說的表是簡單的行和列的組合。而 表格式 是數(shù)據(jù)庫系統(tǒng)實(shí)現(xiàn)層面一個(gè)抽象的概念,它定義了一個(gè)表的 Scheme 定義:包含哪些字段,表下面文件的組織形式(Partition 方式)、元數(shù)據(jù)信息(表相關(guān)的統(tǒng)計(jì)信息,表索引信息以及表的讀寫 API),如下圖左側(cè)所示:
上圖右側(cè)是 Iceberg 在數(shù)據(jù)倉庫生態(tài)中的位置,和它差不多相當(dāng)?shù)囊粋€(gè)組件是 Metastore。不過 Metastore 是一個(gè)服務(wù),而 Iceberg 就是一系列 jar
包。對(duì)于 Table Format,我認(rèn)為主要包含
4
4
4 個(gè)層面的含義,分別是 表 Schema 定義(是否支持復(fù)雜數(shù)據(jù)類型),表中文件的組織形式,表相關(guān)統(tǒng)計(jì)信息、表索引信息以及表的讀寫 API 信息。
- 表 Schema 定義了一個(gè)表支持字段類型,比如
int
、string
、long
以及復(fù)雜數(shù)據(jù)類型等。 - 表中文件組織形式最典型的是 Partition 模式,是 Range Partition 還是 Hash Partition。
- Metadata 數(shù)據(jù)統(tǒng)計(jì)信息。
- 表的讀寫 API。上層引擎通過對(duì)應(yīng)的 API 讀取或者寫入表中的數(shù)據(jù)。
1.3 Iceberg 的核心思想
Iceberg 的核心思想,就是 在時(shí)間軸上跟蹤表的所有變化:
- 快照 表示表數(shù)據(jù)文件的一個(gè)完整集合。
- 每次更新操作會(huì)生成一個(gè)新的快照。
1.4 Iceberg 的元數(shù)據(jù)管理
從圖中可以看到 Iceberg 將數(shù)據(jù)進(jìn)行分層管理,主要分為 元數(shù)據(jù)管理層 和 數(shù)據(jù)存儲(chǔ)層。元數(shù)據(jù)管理層又可以細(xì)分為三層:
- Metadata File
- Snapshot
- Manifest
Metadata File 存儲(chǔ)當(dāng)前版本的元數(shù)據(jù)信息(所有 Snapshot 信息);Snapshot 表示當(dāng)前操作的一個(gè)快照,每次 commit
都會(huì)生成一個(gè)快照,一個(gè)快照中包含多個(gè) Manifest。每個(gè) Manifest 中記錄了當(dāng)前操作生成數(shù)據(jù)所對(duì)應(yīng)的文件地址,也就是 data files 的地址?;?Snapshot 的管理方式,Iceberg 能夠進(jìn)行 time travel
(歷史版本讀取以及增量讀取),并且提供了 serializable isolation
。
數(shù)據(jù)存儲(chǔ)層支持不同的文件格式,目前支持 Parquet、ORC、AVRO。
1.5 Iceberg 的重要特性
Apache Iceberg 設(shè)計(jì)初衷是 為了解決 Hive 離線數(shù)倉計(jì)算慢的問題,經(jīng)過多年迭代已經(jīng)發(fā)展成為構(gòu)建數(shù)據(jù)湖服務(wù)的表格式標(biāo)準(zhǔn)。關(guān)于 Apache Iceberg 的更多介紹,請(qǐng)參見 Apache Iceberg 官網(wǎng)。
目前 Iceberg 提供以下核心能力:
1.5.1 豐富的計(jì)算引擎
- 優(yōu)秀的內(nèi)核抽象使之不綁定特定引擎,目前在支持的有 Spark、Flink、Presto、Hive。
- Iceberg 提供了 Java Native API,不用特定引擎也可以訪問 Iceberg 表。
1.5.2 靈活的文件組織形式
- 提供了 基于流式的增量計(jì)算模型 和 基于批處理的全量表計(jì)算模型,批任務(wù)和流任務(wù)可以使用相同的存儲(chǔ)模型(HDFS、OZONE),數(shù)據(jù)不再孤立,以構(gòu)建低成本的輕量級(jí)數(shù)據(jù)湖存儲(chǔ)服務(wù)。
- Iceberg 支持隱藏分區(qū)(
Hidden Partitioning
)和分區(qū)布局變更(Partition Evolution
),方便業(yè)務(wù)進(jìn)行數(shù)據(jù)分區(qū)策略更新。 - 支持 Parquet、ORC、Avro 等存儲(chǔ)格式。
1.5.3 優(yōu)化數(shù)據(jù)入湖流程
- Iceberg 提供 ACID 事務(wù)能力,上游數(shù)據(jù)寫入即可見,不影響當(dāng)前數(shù)據(jù)處理任務(wù),這大大簡化了 ETL。
- Iceberg 提供
Upsert
/Merge Into
行級(jí)別數(shù)據(jù)變更,可以極大地縮小數(shù)據(jù)入庫延遲。
1.5.4 增量讀取處理能力
- Iceberg 支持通過流式方式讀取增量數(shù)據(jù),實(shí)現(xiàn)主流開源計(jì)算引擎入湖和分析場(chǎng)景的完善對(duì)接。
- 支持 Spark Structed Streaming。
- 支持 Flink Table Source。
- 支持歷史版本回溯。
1.6 數(shù)據(jù)文件結(jié)構(gòu)
我們先了解一下 Iceberg 在文件系統(tǒng)中的布局,總體來講 Iceberg 分為兩部分?jǐn)?shù)據(jù)。
- 第一部分是 數(shù)據(jù)文件,如下圖中的
.parquet
文件。 - 第二部分是 表元數(shù)據(jù)文件(Metadata 文件),包含 Snapshot 文件(
snap-*.avro
)、Manifest 文件(.avro
)、TableMetadata 文件(*.json
)等。
1.6.1 元數(shù)據(jù)文件
其中 Metadata 目錄存放元數(shù)據(jù)管理層的數(shù)據(jù),表的元數(shù)據(jù)是不可修改的,并且始終向前迭代;當(dāng)前的快照可以回退。
1.6.1.1 Table Metadata
version[number].metadata.json
:存儲(chǔ)每個(gè)版本的數(shù)據(jù)更改項(xiàng)。
1.6.1.2 快照(Snapshot)
snap-[snapshotID]-[attemptID]-[commitUUID].avro
:存儲(chǔ)快照 Snapshot 文件。
快照代表一張 Iceberg 表在某一時(shí)刻的狀態(tài),也被稱為 清單列表(Manifest List
),里面存儲(chǔ)的是清單文件列表,每個(gè)清單文件占用一行數(shù)據(jù)。清單列表文件以 snap
開頭,以 avro
后綴結(jié)尾,每次更新都產(chǎn)生一個(gè)清單列表文件。每行中存儲(chǔ)了清單文件的路徑。
清單文件(Manifest Files
)里面存儲(chǔ)數(shù)據(jù)文件的分區(qū)范圍、增加了幾個(gè)數(shù)據(jù)文件、刪除了幾個(gè)數(shù)據(jù)文件等信息。數(shù)據(jù)文件(Data Files)存儲(chǔ)在不同的 Manifest Files 里面,Manifest Files 存儲(chǔ)在一個(gè) Manifest List 文件里面,而一個(gè) Manifest List 文件代表一個(gè)快照。
1.6.1.3 清單文件(Manifest File)
[commitUUID]-[attemptID]-[manifestCount].avro
:Manifest 文件。
清單文件是以 avro
格式進(jìn)行存儲(chǔ)的,以 avro
后綴結(jié)尾,每次更新操作都會(huì)產(chǎn)生多個(gè)清單文件。其里面列出了組成某個(gè)快照(Snapshot)的數(shù)據(jù)文件列表。每行都是每個(gè)數(shù)據(jù)文件的詳細(xì)描述,包括 數(shù)據(jù)文件的狀態(tài)、文件路徑、分區(qū)信息、列級(jí)別的統(tǒng)計(jì)信息(比如每列的最大最小值、空值數(shù)等)、文件的大小 以及 文件里面數(shù)據(jù)的行數(shù) 等信息。其中列級(jí)別的統(tǒng)計(jì)信息在 Scan 的時(shí)候可以為算子下推提供數(shù)據(jù),以便可以過濾掉不必要的文件。
1.6.2 數(shù)據(jù)文件
data
目錄組織形式類似于 Hive,都是以分區(qū)進(jìn)行目錄組織(圖中 dt
為分區(qū)列)。
Iceberg 的數(shù)據(jù)文件通常存放在 data
目錄下。一共有三種存儲(chǔ)格式(Avro、ORC 和 Parquet),主要是看你選擇哪種存儲(chǔ)格式,后綴分別對(duì)應(yīng) avro
、orc
或者 parquet
。在一個(gè)目錄,通常會(huì)產(chǎn)生多個(gè)數(shù)據(jù)文件。
2.Apache Iceberg 的實(shí)現(xiàn)細(xì)節(jié)
2.1 快照設(shè)計(jì)方式
2.1.1 快照隔離
- 讀操作僅適用當(dāng)前已生成快照。
- 寫操作會(huì)生成新的隔離快照,并在寫完成后原子性提交。
如下圖所示,虛線框(Snapshot-1)表示正在進(jìn)行寫操作,但是還沒有發(fā)生 commit
操作,這時(shí)候 Snapshot-1 是不可讀的,用戶只能讀取已經(jīng) commit
之后的 Snapshot。同理,Snapshot-2,Snapshot-3 表示已經(jīng)可讀。
可以支持并發(fā)讀,例如可以同時(shí)讀取 S1、S2、S3 的快照數(shù)據(jù),同時(shí),可以回溯到 Snapshot-2 或者 Snapshot-3。在 Snapshot-4 commit
完成之后,這時(shí)候 Snapshot-4 已經(jīng)變成實(shí)線,就可以讀取數(shù)據(jù)了。
例如,現(xiàn)在 Current Snapshot
的指針移到 S3,用戶對(duì)一張表的讀操作,都是讀 Current Snapshot
指針?biāo)赶虻?Snapshot,但不會(huì)影響前面的 Snapshot 的讀操作。
當(dāng)一切準(zhǔn)備完畢之后,會(huì)以原子操作的方式 commit
這個(gè) Metadata 文件,這樣一次 Iceberg 的數(shù)據(jù)寫入就完成了。隨著每次的寫入,Iceberg 就生成了下圖這樣的一個(gè)文件組織模式。
2.1.2 增量讀取數(shù)據(jù)
Iceberg 的每個(gè) Snapshot 都包含前一個(gè) Snapshot 的所有數(shù)據(jù),每次都相當(dāng)于全量讀取數(shù)據(jù),對(duì)于整個(gè)鏈路來說,讀取數(shù)據(jù)的代價(jià)是非常高的。
如果我們只想讀取當(dāng)前時(shí)刻的增量數(shù)據(jù),就可以根據(jù) Iceberg 中 Snapshot 的回溯機(jī)制來實(shí)現(xiàn),僅讀取 Snapshot-1 到 Snapshot-2 的增量數(shù)據(jù),也就是下圖中的紫色數(shù)據(jù)部分。
同理,S3 也可以只讀取紅色部分的增量數(shù)據(jù),也可以讀取 S1 - S3 的增量數(shù)據(jù)。
Iceberg 支持讀寫分離,也就是說可以支持并發(fā)讀和增量讀。
2.1.3 原子性操作
對(duì)于文件列表的所有修改都是原子操作。
- 在分區(qū)中追加數(shù)據(jù)。
- 合并或是重寫分區(qū)。
- Iceberg 是以 文件 為粒度提交事務(wù)的,所以就沒有辦法做到以秒為單位提交事務(wù),否則會(huì)造成文件數(shù)據(jù)量膨脹。
- 比如 Flink 是以 CheckPoint 為寫入單位,物理數(shù)據(jù)在寫入 Iceberg 之后并不能被直接查詢,只有當(dāng)觸發(fā)了 CheckPoint 時(shí)才會(huì)寫 Metadata,這時(shí)數(shù)據(jù)才會(huì)由不可見變成可見。而每次 CheckPoint 執(zhí)行也需要一定的時(shí)間。
2.2 事務(wù)性提交
2.2.1 寫操作要求
原子性替換保證了線性的歷史。原子性替換需要依靠以下操作來保證:
- 記錄當(dāng)前元數(shù)據(jù)的版本
base version
。 - 創(chuàng)建新的元數(shù)據(jù)以及 Manifest 文件。
- 原子性的將
base version
替換為新的版本。
2.2.2 沖突解決 - 樂觀鎖
- 假定當(dāng)前沒有其他的寫操作。
- 遇到?jīng)_突則基于當(dāng)前最新的元數(shù)據(jù)進(jìn)行重試。
- 元數(shù)據(jù)管理器所提供的能力。
- HDFS 或是本地文件系統(tǒng)所提供的原子化的
rename
能力。
3.Iceberg 結(jié)合 Flink 場(chǎng)景分享
3.1 構(gòu)建近實(shí)時(shí) Data Pipeline
Iceberg 可以做到分鐘級(jí)別的準(zhǔn)實(shí)時(shí)數(shù)據(jù)拉取。
首先,F(xiàn)link Iceberg 最經(jīng)典的一個(gè)場(chǎng)景就是 構(gòu)建實(shí)時(shí)的 Data Pipeline。業(yè)務(wù)端產(chǎn)生的大量日志數(shù)據(jù),被導(dǎo)入到 Kafka 這樣的消息隊(duì)列。運(yùn)用 Flink 流計(jì)算引擎執(zhí)行 ETL 后,導(dǎo)入到 Apache Iceberg 原始表中。有一些業(yè)務(wù)場(chǎng)景需要直接跑分析作業(yè)來分析原始表的數(shù)據(jù),而另外一些業(yè)務(wù)需要對(duì)數(shù)據(jù)做進(jìn)一步的提純。那么我們可以再新起一個(gè) Flink 作業(yè)從 Apache Iceberg 表中消費(fèi)增量數(shù)據(jù),經(jīng)過處理之后寫入到提純之后的 Iceberg 表中。此時(shí),可能還有業(yè)務(wù)需要對(duì)數(shù)據(jù)做進(jìn)一步的聚合,那么我們繼續(xù)在 Iceberg 表上啟動(dòng)增量 Flink 作業(yè),將聚合之后的數(shù)據(jù)結(jié)果寫入到聚合表中。
有人會(huì)想,這個(gè)場(chǎng)景好像通過 Flink Hive 也能實(shí)現(xiàn)。 Flink Hive 的確可以實(shí)現(xiàn),但寫入到 Hive 的數(shù)據(jù)更多地是為了實(shí)現(xiàn)數(shù)倉的數(shù)據(jù)分析,而不是為了做增量拉取。一般來說,Hive 的增量寫入以 Partition 為單位,時(shí)間是 15 m i n 15min 15min 以上,F(xiàn)link 長期高頻率地寫入會(huì)造成 Partition 膨脹。而 Iceberg 容許實(shí)現(xiàn) 1 m i n 1min 1min 甚至 30 s 30s 30s 的增量寫入,這樣就可以大大提高了端到端數(shù)據(jù)的實(shí)時(shí)性,上層的分析作業(yè)可以看到更新的數(shù)據(jù),下游的增量作業(yè)可以讀取到更新的數(shù)據(jù)。
3.2 CDC 數(shù)據(jù)實(shí)時(shí)攝入攝出
Flink CDC(Change Data Capture
)增量數(shù)據(jù)寫入 Iceberg。
- 支持準(zhǔn)實(shí)時(shí)的數(shù)據(jù)入湖和數(shù)據(jù)分析。
- 計(jì)算引擎原生支持 CDC,無需添加額外的組件。
- 采用統(tǒng)一的數(shù)據(jù)湖存儲(chǔ)方案,并支持多種數(shù)據(jù)分析引擎。
- 支持增量數(shù)據(jù)讀取。
可以用 Flink Iceberg 來分析來自 MySQL 等關(guān)系型數(shù)據(jù)庫的 binlog
等。一方面,Apache Flink 已經(jīng)原生地支持 CDC 數(shù)據(jù)解析,一條 binlog
數(shù)據(jù)通過 ververica flink-cdc-connector
拉取之后,自動(dòng)轉(zhuǎn)換成 Flink Runtime 能識(shí)別的 INSERT
、DELETE
、UPDATE_BEFORE
、UPDATE_AFTER
四種消息,供用戶做進(jìn)一步的實(shí)時(shí)計(jì)算。
此外,CDC 數(shù)據(jù)成功入湖 Iceberg 之后,我們還會(huì)打通常見的計(jì)算引擎,例如 Presto、Spark、Hive 等,他們都可以實(shí)時(shí)地讀取到 Iceberg 表中的最新數(shù)據(jù)。
MySQL Binlog 是二進(jìn)制格式的日志文件,但是不能把
binlog
文件等同于 OS 系統(tǒng)某目錄下的具體文件,這是狹隘的。Binlog 是用來記錄 MySQL 內(nèi)部對(duì)數(shù)據(jù)庫的改動(dòng)(只記錄對(duì)數(shù)據(jù)的修改操作),主要用于數(shù)據(jù)庫的主從復(fù)制以及增量恢復(fù)。
3.3 從 Iceberg 歷史數(shù)據(jù)啟動(dòng) Flink 任務(wù)
上面的架構(gòu)是采用 Iceberg 全量數(shù)據(jù)和 Kafka 的增量數(shù)據(jù)來驅(qū)動(dòng)新的 Flink 作業(yè)。如果需要過去很長時(shí)間例如一年的數(shù)據(jù),可以采用常見的 Lambda 架構(gòu),離線鏈路通過 Kafka → Flink → Iceberg
同步寫入到數(shù)據(jù)湖,由于 Kafka 成本較高,保留最近
7
7
7 天數(shù)據(jù)即可,Iceberg 存儲(chǔ)成本較低,可以存儲(chǔ)全量的歷史數(shù)據(jù),啟動(dòng)新 Flink 作業(yè)的時(shí)候,只需要去拉 Iceberg 的數(shù)據(jù),跑完之后平滑地對(duì)接到 Kafka 數(shù)據(jù)即可。
3.4 通過 Iceberg 數(shù)據(jù)來修正實(shí)時(shí)聚合結(jié)果
同樣是在 Lambda 架構(gòu)下,實(shí)時(shí)鏈路由于事件丟失或者到達(dá)順序的問題,可能導(dǎo)致流計(jì)算端結(jié)果不一定完全準(zhǔn)確,這時(shí)候一般都需要全量的歷史數(shù)據(jù)來訂正實(shí)時(shí)計(jì)算的結(jié)果。而我們的 Iceberg 可以很好地充當(dāng)這個(gè)角色,因?yàn)樗梢愿咝詢r(jià)比地管理好歷史數(shù)據(jù)。
4.Iceberg 0.11.1 源代碼編譯
4.1 編譯 Iceberg
構(gòu)建 Iceberg 需要 Grade 5.6 5.6 5.6 和 Java 8 8 8 的環(huán)境。
4.1.1 下載 Iceberg 0.11.1 軟件包
下載地址:
- https://github.com/apache/iceberg/releases/tag/apache-iceberg-0.11.1
- https://www.apache.org/dyn/closer.cgi/iceberg/apache-iceberg-0.11.0/apache-iceberg-0.11.0.tar.gz
4.1.2 解壓 Iceberg 0.11.1 軟件包
[bigdata@bigdata185 software]$ tar -zxvf iceberg-apache-iceberg-0.11.1.tar.gz -C /opt/module/
[bigdata@bigdata185 software]$ cd /opt/module/iceberg-apache-iceberg-0.11.1/
4.1.3 修改對(duì)應(yīng)的版本
我們選擇最穩(wěn)定的版本進(jìn)行編譯,Hadoop 2.7.7 2.7.7 2.7.7、Hive 2.3.9 2.3.9 2.3.9、Flink 1.11.6 1.11.6 1.11.6、Spark 3.0.3 3.0.3 3.0.3。
org.apache.flink:* = 1.11.6
org.apache.hadoop:* = 2.7.7
org.apache.hive:hive-metastore = 2.3.9
org.apache.hive:hive-serde = 2.3.9
org.apache.spark:spark-hive_2.12 = 3.0.3
4.1.4 編輯 build.gradle 文件,添加國內(nèi)源
(1)在 buildscript
的 repositories
中添加:
maven { url 'https://mirrors.huaweicloud.com/repository/maven/' }
添加后如下所示:
buildscript {
repositories {
jcenter()
gradlePluginPortal()
maven { url 'https://mirrors.huaweicloud.com/repository/maven/' }
}
dependencies {
classpath 'com.github.jengelman.gradle.plugins:shadow:5.0.0'
classpath 'com.palantir.baseline:gradle-baseline-java:3.36.2'
classpath 'com.palantir.gradle.gitversion:gradle-git-version:0.12.3'
classpath 'com.diffplug.spotless:spotless-plugin-gradle:3.14.0'
classpath 'gradle.plugin.org.inferred:gradle-processors:2.1.0'
classpath 'me.champeau.gradle:jmh-gradle-plugin:0.4.8'
}
}
(2)allprojects
中添加:
maven { url 'https://mirrors.huaweicloud.com/repository/maven/' }
添加后如下所示
allprojects {
group = "org.apache.iceberg"
version = getProjectVersion()
repositories {
maven { url 'https://mirrors.huaweicloud.com/repository/maven/' }
mavenCentral()
mavenLocal()
}
}
4.1.5 下載依賴(可選)
進(jìn)入項(xiàng)目根目錄,執(zhí)行腳本:
[bigdata@bigdata185 iceberg-apache-iceberg-0.11.1]$ ./gradlew dependencies
4.1.6 正式編譯
(1)進(jìn)入項(xiàng)目根目錄,執(zhí)行:
[bigdata@bigdata185 iceberg-apache-iceberg-0.11.1]$ ./gradlew build
(2)上述命令會(huì)執(zhí)行代碼里的單元測(cè)試,如果不需要,則執(zhí)行以下命令:
[bigdata@bigdata185 iceberg-apache-iceberg-0.11.1]$ ./gradlew build -x test -x scalaStyle
4.1.7 生成的目錄
文章來源:http://www.zghlxwxcb.cn/news/detail-697091.html
4.2 Iceberg 環(huán)境部署
在后面的章節(jié)中,我們分別介紹如何集成 Iceberg 0.11.1
和 Flink 1.11.6
、Spark 3.0.3
、Hive 2.3.9
。文章來源地址http://www.zghlxwxcb.cn/news/detail-697091.html
5.總結(jié)
- 數(shù)據(jù)湖的解決方案 Iceberg 介紹。
- Apache Iceberg 的技術(shù)實(shí)現(xiàn)細(xì)節(jié)。
- Iceberg 結(jié)合 Flink 場(chǎng)景分享。
- Iceberg 0.11.1 0.11.1 0.11.1 源碼編譯。
到了這里,關(guān)于【大數(shù)據(jù)】Apache Iceberg 概述和源代碼的構(gòu)建的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!