大數(shù)據(jù)之?dāng)?shù)據(jù)湖---flink 整合hudi

1.hudi 簡(jiǎn)介

    Huid支持流式的讀寫(xiě)操作,流數(shù)據(jù)可以通過(guò)Huid的增量來(lái)進(jìn)行數(shù)據(jù)追加,精準(zhǔn)的保存Index位置,如果一旦寫(xiě)入或者讀出的時(shí)候出現(xiàn)問(wèn)題,可以進(jìn)行索引回滾數(shù)據(jù),因?yàn)樵贖udi寫(xiě)入和寫(xiě)出的時(shí)候他是要記錄元數(shù)據(jù)信息的。
    Hudi最大的特點(diǎn)就是會(huì)進(jìn)行預(yù)寫(xiě)日志功能,也就是把所有的操作都先預(yù)寫(xiě),然后一旦發(fā)生問(wèn)題就會(huì)先找預(yù)寫(xiě)日志Log,進(jìn)行回滾或者其他操作,所以你會(huì)發(fā)現(xiàn)在Hudi中,它會(huì)寫(xiě)很多Log日志。
三大特點(diǎn):流式讀寫(xiě)、自我管理、萬(wàn)物皆日志

2.hudi 應(yīng)用

在這里插入圖片描述

2.1 特性

1.快速u(mài)psert,可插入索引
2.以原子方式操作數(shù)據(jù)并具有回滾功能
3.寫(xiě)入器之和查詢之間的快照隔離
4.savepoint用戶數(shù)據(jù)恢復(fù)的保存點(diǎn)
5.管理文件大小,使用統(tǒng)計(jì)數(shù)據(jù)布局
6.異步壓縮行列數(shù)據(jù)
7.具有時(shí)間線來(lái)追蹤元數(shù)據(jù)血統(tǒng)
8.通過(guò)聚類(lèi)優(yōu)化數(shù)據(jù)集

2.2 Timeline

hudi的核心是維護(hù)在不同時(shí)刻在表上執(zhí)行的所有操作的時(shí)間表,提供表的即時(shí)視圖,同時(shí)還有效地支持按時(shí)間順序檢索數(shù)據(jù)。
Hudi的時(shí)刻由以下組件組成:
    (1)Instant action: 在表上執(zhí)行的操作類(lèi)型
    (2)Instant time: 即時(shí)時(shí)間,通常是一個(gè)時(shí)間戳,它安裝action的開(kāi)始時(shí)間單調(diào)遞增
    (3)State: 時(shí)刻的當(dāng)前狀態(tài)
Hudi在時(shí)間線上的操作都是基于即時(shí)時(shí)間的, 兩者的時(shí)間保持一致并且是原子性的。

acion操作包括:

1. commits: 表示將一批數(shù)據(jù)原子寫(xiě)入表中
2. cleans: 清除表中不在需要的舊版本文件的后臺(tái)活動(dòng)。
3. delta_commit:增量提交是指將一批數(shù)據(jù)原子性寫(xiě)入MergeOnRead類(lèi)型的表中,其中部分或者所有數(shù)據(jù)可以寫(xiě)入增量日志中。
4. compaction: 協(xié)調(diào)hudi中差異數(shù)據(jù)結(jié)構(gòu)的后臺(tái)活動(dòng),例如:將更新從基于行的日志文件變成列格式。在內(nèi)部,壓縮的表現(xiàn)為時(shí)間軸上的特殊提交。
5. rollback:表示提交操作不成功且已經(jīng)回滾,會(huì)刪除在寫(xiě)入過(guò)程中產(chǎn)生的數(shù)據(jù)

savepoint:將某些文件標(biāo)記為“已保存”,以便清理程序時(shí)不會(huì)被清楚。在需要數(shù)據(jù) 恢復(fù)的情況下,有助于將數(shù)據(jù)集還原到時(shí)間軸上某個(gè)點(diǎn)。
任何時(shí)刻都會(huì)處于以下state:

1. requested:表示一個(gè)動(dòng)作已被安排,但尚未啟動(dòng)
2. inflight:表是當(dāng)前正在執(zhí)行操作
3.completed:表是在時(shí)間線上完成了操作
在這里插入圖片描述

2.3 File Layout

Hudi會(huì)在DFS分布式文件系統(tǒng)上的basepath基本路徑下組織成目錄結(jié)構(gòu)。每張對(duì)應(yīng)的表都會(huì)成多個(gè)分區(qū),這些分區(qū)是包含該分區(qū)的數(shù)據(jù)文件的文件夾,與hive的目錄結(jié)構(gòu)非常相似。
在每個(gè)分區(qū)內(nèi),文件被組織成文件組,文件id為唯一標(biāo)識(shí)。每個(gè)文件組包含多個(gè)切片,其中每個(gè)切片包含在某個(gè)提交/壓縮即時(shí)時(shí)間生成的基本列文件(parquet文件),以及自生成基本文件以來(lái)對(duì)基本文件的插入/更新的一組日志文件(*.log)。Hudi采用MVCC設(shè)計(jì),其中壓縮操作會(huì)將日志和基本文件合并成新的文件片,清理操作會(huì)將未使用/較舊的文件片刪除來(lái)回收DFS上的空間。

MVCC(Multi-Version Concurrency Control):多版本并行發(fā)控制機(jī)制
Multi-Versioning:產(chǎn)生多版本的數(shù)據(jù)內(nèi)容,使得讀寫(xiě)可以不互相阻塞
Concurrency Control:并發(fā)控制,使得并行執(zhí)行的內(nèi)容能保持串行化結(jié)果 

2.4 Index

Hudi通過(guò)索引機(jī)制將映射的給定的hoodie key(record key+partition path)映射到文件id(唯一標(biāo)示),從而提供高效的upsert操作。記錄鍵和文件組/文件ID之間的這種映射,一旦記錄的第一個(gè)版本寫(xiě)入文件就永遠(yuǎn)不會(huì)改變。

2.5 Table Types& Queries

Hudi表類(lèi)型定義了如何在DFS上對(duì)數(shù)據(jù)進(jìn)行索引和布局,以及如何在此類(lèi)組織上實(shí)現(xiàn)上述操作和時(shí)間軸活動(dòng)(即如何寫(xiě)入數(shù)據(jù))。同樣,查詢類(lèi)型定義了底層數(shù)據(jù)如何暴露給查詢(即如何讀取數(shù)據(jù))。
|Table Type| Supported Query types |
|--|--|--|
| Copy on Write (寫(xiě)時(shí)復(fù)制) | 快照查詢+增量查詢 |
| Merge on Read (讀時(shí)合并) | 快照查詢+增量查詢+讀取優(yōu)化查詢(近實(shí)時(shí)) |

2.6 Table Types:

1. Copy on Write:使用列式存儲(chǔ)來(lái)存儲(chǔ)數(shù)據(jù)(例如:parquet),通過(guò)在寫(xiě)入期間執(zhí)行同步合并來(lái)簡(jiǎn)單地更新和重現(xiàn)文件
2. Merge on Read:使用列式存儲(chǔ)(parquet)+行式文件(arvo)組合存儲(chǔ)數(shù)據(jù)。更新記錄到增量文件中,然后進(jìn)行同步或異步壓縮來(lái)生成新版本的列式文件。

2.7 總結(jié)了兩種表類(lèi)型之間的權(quán)衡

權(quán)衡 CopyOnWrite MergeOnRead
數(shù)據(jù)延遲
查詢延遲
Update(I/O) 更新成本 高(重寫(xiě)整個(gè)Parquet文件) 低(追加到增量日志)
Parquet File Size 低(更新成本I/O高) 較大(低更新成本)
Write Amplification(WA寫(xiě)入放大) 低(取決于壓縮策略)

2.7 Query Types:

1. Snapshot Queries:快照查詢,在此視圖上的查詢將看到某個(gè)提交和壓縮操作的最新快照。對(duì)于merge on read的表,它通過(guò)即時(shí)合并最新文件切片的基本文件和增量文件來(lái)展示近乎實(shí)時(shí)的數(shù)據(jù)(幾分鐘)。對(duì)于copy on write的表,它提供了對(duì)現(xiàn)有parquet表的直接替代,同時(shí)提供了upsert/delete和其他寫(xiě)入功能。
2.Incremental Queries:增量查詢,該視圖智能看到從某個(gè)提交/壓縮寫(xiě)入數(shù)據(jù)集的新數(shù)據(jù)。該視圖有效地提供了chang stream,來(lái)支持增量視圖
3.Read Optimized Queries:讀優(yōu)化視圖,在此視圖上的查詢將查看到給定提交或壓縮操作中的最新快照。該視圖將最新文件切片的列暴露個(gè)查詢,并保證與非hudi列式數(shù)據(jù)集相比,具有相同列式查詢功能。

總結(jié)了兩種查詢的權(quán)衡

權(quán)衡 Snapshot Read Optimized
數(shù)據(jù)延遲 數(shù)據(jù)延遲
查詢延遲 高(合并列式基礎(chǔ)文件+行式增量日志文件) 低(原始列式數(shù)據(jù))

2.8Copy on Write Table

Copy on Write表中的文件切片僅包含基本/列文件,并且每次提交都會(huì)生成新版本的基本文件。換句話說(shuō),每次提交操作都會(huì)被壓縮,以便存儲(chǔ)列式數(shù)據(jù),因此Write Amplification寫(xiě)入放大非常高(即使只有一個(gè)字節(jié)的數(shù)據(jù)被提交修改,我們也需要重寫(xiě)整個(gè)列數(shù)據(jù)文件),而讀取數(shù)據(jù)成本則沒(méi)有增加,所以這種表適合于做分析工作,讀取密集型的操作。

下圖說(shuō)明了copy on write的表是如何工作的


在這里插入圖片描述

隨著數(shù)據(jù)被寫(xiě)入,對(duì)現(xiàn)有文件組的更新會(huì)為該文件組生成一個(gè)帶有提交即時(shí)間標(biāo)記的新切片,而插入分配一個(gè)新文件組并寫(xiě)入該文件組第一個(gè)切片。這些切片和提交即時(shí)時(shí)間在上圖用同一顏色標(biāo)識(shí)。針對(duì)圖上右側(cè)sql查詢,首先檢查時(shí)間軸上的最新提交并過(guò)濾掉之前的舊數(shù)據(jù)(根據(jù)時(shí)間查詢最新數(shù)據(jù)),如上圖所示粉色數(shù)據(jù)在10:10被提交,第一次查詢是在10:10之前,所以出現(xiàn)不到粉色數(shù)據(jù),第二次查詢時(shí)間在10:10之后,可以查詢到粉色數(shù)據(jù)(以被提交的數(shù)據(jù))。
Copy on Write表從根本上改進(jìn)表的管理方式

(1)在原有文件上進(jìn)行自動(dòng)更新數(shù)據(jù),而不是重新刷新整個(gè)表/分區(qū)
(2)能夠只讀取修改部分的數(shù)據(jù),而不是浪費(fèi)查詢無(wú)效數(shù)據(jù)
(3)嚴(yán)格控制文件大小來(lái)保證查詢性能(小文件會(huì)顯著降低查詢性能)

2.9 Merge on Read Table

Merge on Read表是copy on write的超集,它仍然支持通過(guò)僅向用戶公開(kāi)最新的文件切片中的基本/列來(lái)對(duì)表進(jìn)行查詢優(yōu)化。用戶每次對(duì)表文件的upsert操作都會(huì)以增量日志的形式進(jìn)行存儲(chǔ),增量日志會(huì)對(duì)應(yīng)每個(gè)文件最新的ID來(lái)幫助用戶完成快照查詢。因此這種表類(lèi)型,能夠智能平衡讀取和寫(xiě)放大(wa),提供近乎實(shí)時(shí)的數(shù)據(jù)。這種表最重要的是壓縮器,它用來(lái)選擇將對(duì)應(yīng)增量日志數(shù)據(jù)壓縮到表的基本文件中,來(lái)保持查詢時(shí)的性能(較大的增量日志文件會(huì)影響合并時(shí)間和查詢時(shí)間)
下圖說(shuō)明了該表的工作原理,并顯示兩種查詢類(lèi)型:快照查詢和讀取優(yōu)化查詢

在這里插入圖片描述
(1)如上圖所示,現(xiàn)在每一分鐘提交一次,這種操作是在別的表里(copy on write table)無(wú)法做到的
(2)現(xiàn)在有一個(gè)增量日志文件,它保存對(duì)基本列文件中記錄的傳入更新(對(duì)表的修改),在圖中,增量日志文件包含從10:05到10:10的所有數(shù)據(jù)?;玖形募匀皇褂胏ommit來(lái)進(jìn)行版本控制,因此如果只看基本列文件,那么表的表的布局就像copy on write表一樣。
(3)定期壓縮過(guò)程會(huì)協(xié)調(diào)增量日志文件和基本列文件進(jìn)行合并,并生成新版本的基本列文件,就如圖中10:05所發(fā)生的情況一樣。
(4)查詢表的方式有兩種,Read Optimized query和Snapshot query,取決于我們選擇是要查詢性能還是數(shù)據(jù)新鮮度
(5)如上圖所示,Read Optimized query查詢不到10:05之后的數(shù)據(jù)(查詢不到增量日志里的數(shù)據(jù)),而Snapshot query則可以查詢到全量數(shù)據(jù)(基本列數(shù)據(jù)+行式的增量日志數(shù)據(jù))。
(6)壓縮觸發(fā)是解決所有難題的關(guān)鍵,通過(guò)實(shí)施壓縮策略,會(huì)快速縮新分區(qū)數(shù)據(jù),來(lái)保證用戶使用Read Optimized query可以查詢到X分鐘內(nèi)的數(shù)據(jù)
   Merge on Read Table是直接在DFS上啟用近實(shí)時(shí)(near real-time)處理,而不是將數(shù)據(jù)復(fù)制到外部專(zhuān)用系統(tǒng)中。該表還有些次要的好處,例如通過(guò)避免數(shù)據(jù)的同步合并來(lái)減少寫(xiě)入放大(WA)

2.10 版本

0.9.0 適配 flink 1.12.2
0.10.0 適配 flink 1.13.1

3. 官網(wǎng)

https://hudi.apache.org/cn/

4.下載編譯

4.1 修改flink 版本和hive 的版本

 <properties>
    <maven-jar-plugin.version>2.6</maven-jar-plugin.version>
    <maven-surefire-plugin.version>3.0.0-M4</maven-surefire-plugin.version>
    <maven-failsafe-plugin.version>3.0.0-M4</maven-failsafe-plugin.version>
    <maven-shade-plugin.version>3.1.1</maven-shade-plugin.version>
    <maven-javadoc-plugin.version>3.1.1</maven-javadoc-plugin.version>
    <maven-compiler-plugin.version>3.8.0</maven-compiler-plugin.version>
    <maven-deploy-plugin.version>2.4</maven-deploy-plugin.version>
    <genjavadoc-plugin.version>0.15</genjavadoc-plugin.version>
    <build-helper-maven-plugin.version>1.7</build-helper-maven-plugin.version>
    <maven-enforcer-plugin.version>3.0.0-M1</maven-enforcer-plugin.version>

    <java.version>1.8</java.version>
    <fasterxml.version>2.6.7</fasterxml.version>
    <fasterxml.jackson.databind.version>2.6.7.3</fasterxml.jackson.databind.version>
    <fasterxml.jackson.module.scala.version>2.6.7.1</fasterxml.jackson.module.scala.version>
    <fasterxml.jackson.dataformat.yaml.version>2.7.4</fasterxml.jackson.dataformat.yaml.version>
    <fasterxml.spark3.version>2.10.0</fasterxml.spark3.version>
    <kafka.version>2.0.0</kafka.version>
    <confluent.version>5.3.4</confluent.version>
    <glassfish.version>2.17</glassfish.version>
    <parquet.version>1.10.1</parquet.version>
    <junit.jupiter.version>5.7.0-M1</junit.jupiter.version>
    <junit.vintage.version>5.7.0-M1</junit.vintage.version>
    <junit.platform.version>1.7.0-M1</junit.platform.version>
    <mockito.jupiter.version>3.3.3</mockito.jupiter.version>
    <log4j.version>1.2.17</log4j.version>
    <slf4j.version>1.7.15</slf4j.version>
    <joda.version>2.9.9</joda.version>
    <hadoop.version>3.1.1</hadoop.version>
    <hive.groupid>org.apache.hive</hive.groupid>
    <hive.version>3.1.0</hive.version>
    <hive.exec.classifier>core</hive.exec.classifier>
    <metrics.version>4.1.1</metrics.version>
    <orc.version>1.6.0</orc.version>
    <airlift.version>0.16</airlift.version>
    <prometheus.version>0.8.0</prometheus.version>
    <http.version>4.4.1</http.version>
    <spark.version>${spark2.version}</spark.version>
    <sparkbundle.version>${spark2bundle.version}</sparkbundle.version>
    <flink.version>1.12.2</flink.version>
    <spark2.version>2.4.4</spark2.version>
    <spark3.version>3.0.0</spark3.version>
    <spark2bundle.version></spark2bundle.version>
    <spark3bundle.version>3</spark3bundle.version>
    <hudi.spark.module>hudi-spark2</hudi.spark.module>
    <avro.version>1.8.2</avro.version>
    <scala11.version>2.11.12</scala11.version>
    <scala12.version>2.12.10</scala12.version>
    <scala.version>${scala11.version}</scala.version>
    <scala.binary.version>2.11</scala.binary.version>
    <apache-rat-plugin.version>0.12</apache-rat-plugin.version>
    <scala-maven-plugin.version>3.3.1</scala-maven-plugin.version>
    <scalatest.version>3.0.1</scalatest.version>
    <surefire-log4j.file>file://${project.basedir}/src/test/resources/log4j-surefire.properties</surefire-log4j.file>
    <thrift.version>0.12.0</thrift.version>
    <jetty.version>9.4.15.v20190215</jetty.version>
    <htrace.version>3.1.0-incubating</htrace.version>
    <hbase.version>1.2.3</hbase.version>
    <codehaus-jackson.version>1.9.13</codehaus-jackson.version>
    <h2.version>1.4.199</h2.version>
    <awaitility.version>3.1.2</awaitility.version>
    <skipTests>false</skipTests>
    <skipUTs>${skipTests}</skipUTs>
    <skipFTs>${skipTests}</skipFTs>
    <skipITs>${skipTests}</skipITs>
    <skip.hudi-spark2.unit.tests>${skipTests}</skip.hudi-spark2.unit.tests>
    <skip.hudi-spark3.unit.tests>${skipTests}</skip.hudi-spark3.unit.tests>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    <main.basedir>${project.basedir}</main.basedir>
    <spark.bundle.hive.scope>provided</spark.bundle.hive.scope>
    <spark.bundle.hive.shade.prefix />
    <spark.bundle.avro.scope>compile</spark.bundle.avro.scope>
    <spark.bundle.spark.shade.prefix>org.apache.hudi.spark.</spark.bundle.spark.shade.prefix>
    <utilities.bundle.hive.scope>provided</utilities.bundle.hive.scope>
    <utilities.bundle.hive.shade.prefix />
    <argLine>-Xmx2g</argLine>
    <jacoco.version>0.8.5</jacoco.version>
    <presto.bundle.bootstrap.scope>compile</presto.bundle.bootstrap.scope>
    <presto.bundle.bootstrap.shade.prefix>org.apache.hudi.</presto.bundle.bootstrap.shade.prefix>
    <shadeSources>true</shadeSources>
    <zk-curator.version>2.7.1</zk-curator.version>
    <antlr.version>4.7</antlr.version>
    <aws.sdk.version>1.12.22</aws.sdk.version>
  </properties>

4.2 編譯

git clone https://github.com/apache/hudi.git 
mvn clean package -DskipTests
[INFO] Dependency-reduced POM written at: /opt/module/hudi/hudi0.9/Hudi/packaging/hudi-flink-bundle/target/dependency-reduced-pom.xml
[INFO] ------------------------------------------------------------------------
[INFO] Reactor Summary for Hudi 0.9.0:
[INFO] 
[INFO] Hudi ............................................... SUCCESS [  7.475 s]
[INFO] hudi-common ........................................ SUCCESS [ 32.991 s]
[INFO] hudi-timeline-service .............................. SUCCESS [  4.414 s]
[INFO] hudi-client ........................................ SUCCESS [  0.178 s]
[INFO] hudi-client-common ................................. SUCCESS [ 16.918 s]
[INFO] hudi-hadoop-mr ..................................... SUCCESS [ 10.067 s]
[INFO] hudi-spark-client .................................. SUCCESS [ 36.746 s]
[INFO] hudi-sync-common ................................... SUCCESS [  1.850 s]
[INFO] hudi-hive-sync ..................................... SUCCESS [  8.815 s]
[INFO] hudi-spark-datasource .............................. SUCCESS [  0.144 s]
[INFO] hudi-spark-common_2.11 ............................. SUCCESS [ 18.074 s]
[INFO] hudi-spark2_2.11 ................................... SUCCESS [ 24.700 s]
[INFO] hudi-spark_2.11 .................................... SUCCESS [01:11 min]
[INFO] hudi-utilities_2.11 ................................ SUCCESS [ 15.554 s]
[INFO] hudi-utilities-bundle_2.11 ......................... SUCCESS [ 20.892 s]
[INFO] hudi-cli ........................................... SUCCESS [ 23.277 s]
[INFO] hudi-java-client ................................... SUCCESS [  4.321 s]
[INFO] hudi-flink-client .................................. SUCCESS [  9.971 s]
[INFO] hudi-spark3_2.12 ................................... SUCCESS [ 16.785 s]
[INFO] hudi-dla-sync ...................................... SUCCESS [  2.176 s]
[INFO] hudi-sync .......................................... SUCCESS [  0.101 s]
[INFO] hudi-hadoop-mr-bundle .............................. SUCCESS [  6.277 s]
[INFO] hudi-hive-sync-bundle .............................. SUCCESS [  3.464 s]
[INFO] hudi-spark-bundle_2.11 ............................. SUCCESS [ 12.308 s]
[INFO] hudi-presto-bundle ................................. SUCCESS [  6.020 s]
[INFO] hudi-timeline-server-bundle ........................ SUCCESS [  5.296 s]
[INFO] hudi-hadoop-docker ................................. SUCCESS [  2.008 s]
[INFO] hudi-hadoop-base-docker ............................ SUCCESS [  1.146 s]
[INFO] hudi-hadoop-namenode-docker ........................ SUCCESS [  0.976 s]
[INFO] hudi-hadoop-datanode-docker ........................ SUCCESS [  1.237 s]
[INFO] hudi-hadoop-history-docker ......................... SUCCESS [  1.817 s]
[INFO] hudi-hadoop-hive-docker ............................ SUCCESS [  1.973 s]
[INFO] hudi-hadoop-sparkbase-docker ....................... SUCCESS [  1.756 s]
[INFO] hudi-hadoop-sparkmaster-docker ..................... SUCCESS [  1.120 s]
[INFO] hudi-hadoop-sparkworker-docker ..................... SUCCESS [  1.020 s]
[INFO] hudi-hadoop-sparkadhoc-docker ...................... SUCCESS [  0.924 s]
[INFO] hudi-hadoop-presto-docker .......................... SUCCESS [  0.974 s]
[INFO] hudi-integ-test .................................... SUCCESS [ 15.944 s]
[INFO] hudi-integ-test-bundle ............................. SUCCESS [ 41.721 s]
[INFO] hudi-examples ...................................... SUCCESS [ 11.811 s]
[INFO] hudi-flink_2.11 .................................... SUCCESS [  8.756 s]
[INFO] hudi-flink-bundle_2.11 ............................. SUCCESS [ 27.942 s]
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time:  08:02 min
[INFO] Finished at: 2021-10-04T23:33:08+08:00
[INFO] ------------------------------------------------------------------------
[root@basenode Hudi]# 


注意:默認(rèn)是用scala-2.11編譯的
如果我們用的是flink1.12.2-2.12版本,可以自己編譯成scala-2.12版本的
mvn clean package -DskipTests -Dscala-2.12
包的路徑在packaging/hudi-flink-bundle/target/hudi-flink-bundle_2.12-*.*.*-SNAPSHOT.jar

4.3 需要拷貝

編譯好的jar 都在

[root@basenode Hudi]# cd packaging/
[root@basenode packaging]# ll
總用量 4
drwxr-xr-x 4 root root   46 10月  4 23:32 hudi-flink-bundle
drwxr-xr-x 4 root root   46 10月  4 23:30 hudi-hadoop-mr-bundle
drwxr-xr-x 4 root root   46 10月  4 23:30 hudi-hive-sync-bundle
drwxr-xr-x 4 root root   46 10月  4 23:31 hudi-integ-test-bundle
drwxr-xr-x 4 root root   46 10月  4 23:30 hudi-presto-bundle
drwxr-xr-x 4 root root   46 10月  4 23:30 hudi-spark-bundle
drwxr-xr-x 4 root root  101 10月  5 12:10 hudi-timeline-server-bundle
drwxr-xr-x 4 root root   46 10月  4 23:29 hudi-utilities-bundle
-rw-r--r-- 1 root root 2206 10月  4 22:55 README.md
[root@basenode packaging]# pwd
/opt/module/hudi/hudi0.9/Hudi/packaging
[root@basenode packaging]# 

1.需要將  hudi-flink-bundle (hudi-flink-bundle_2.11-0.9.0.jar)和
         hudi-hadoop-mr-bundle  (hudi-hadoop-mr-bundle-0.9.0.jar)  拷貝到flink lib 中

5. flink jar

[root@node01 flink-1.12.2]# cd lib/
[root@node01 lib]# ll
總用量 386336
-rw-r--r-- 1 root root    197325 10月  5 11:40 flink-connector-jdbc_2.11-1.12.3.jar
-rw-r--r-- 1 root root     91744 10月  5 01:54 flink-csv-1.12.2.jar
-rw-r--r-- 1 root root 120338377 10月  5 02:16 flink-dist_2.11-1.12.2.jar
-rw-r--r-- 1 root root     81363 10月  5 11:38 flink-hadoop-compatibility_2.12-1.12.0.jar
-rw-r--r-- 1 root root    137004 10月  5 01:54 flink-json-1.12.2.jar
-rw-r--r-- 1 root root  43317025 10月  5 11:37 flink-shaded-hadoop-2-uber-2.8.3-10.0.jar
-rw-r--r-- 1 root root   7709741 10月  5 01:16 flink-shaded-zookeeper-3.4.14.jar
-rw-r--r-- 1 root root  38101480 10月  5 11:37 flink-sql-connector-hive-2.3.6_2.11-1.11.0.jar
-rw-r--r-- 1 root root  36150119 10月  5 01:51 flink-table_2.11-1.12.2.jar
-rw-r--r-- 1 root root  40316477 10月  5 01:54 flink-table-blink_2.11-1.12.2.jar
-rw-r--r-- 1 root root  52111789 10月  5 11:40 hudi-flink-bundle_2.11-0.9.0.jar
-rw-r--r-- 1 root root  17409553 10月  5 11:40 hudi-hadoop-mr-bundle-0.9.0.jar
-rw-r--r-- 1 root root  36563462 10月  5 11:40 hudi-timeline-server-bundle-0.9.0.jar
-rw-r--r-- 1 root root     67114 10月  5 00:55 log4j-1.2-api-2.12.1.jar
-rw-r--r-- 1 root root    276771 10月  5 00:55 log4j-api-2.12.1.jar
-rw-r--r-- 1 root root   1674433 10月  5 00:55 log4j-core-2.12.1.jar
-rw-r--r-- 1 root root     23518 10月  5 00:55 log4j-slf4j-impl-2.12.1.jar
-rw-r--r-- 1 root root   1007502 10月  5 11:37 mysql-connector-java-5.1.47.jar
[root@node01 lib]# pwd
/opt/module/flink/flink12.2/flink-1.12.2/lib
[root@node01 lib]# 

6.啟動(dòng)flink 連接flink

[root@node01 bin]# ./sql-client.sh embedded
Setting HADOOP_CONF_DIR=/etc/hadoop/conf because no HADOOP_CONF_DIR or HADOOP_CLASSPATH was set.
Setting HBASE_CONF_DIR=/etc/hbase/conf because no HBASE_CONF_DIR was set.
No default environment specified.
Searching for '/opt/module/flink/flink12.2/flink-1.12.2/conf/sql-client-defaults.yaml'...found.
Reading default environment from: file:/opt/module/flink/flink12.2/flink-1.12.2/conf/sql-client-defaults.yaml
No session environment specified.

Command history file path: /root/.flink-sql-history
                                   ?▓██▓██?
                               ▓████??█▓?▓███▓?
                            ▓███▓??        ???▓██?  ?
                          ?██?   ??▓▓█▓▓??      ?████
                          ██?         ??▓███?    ?█?█?
                            ?▓█            ███   ▓??██
                              ▓█       ?????▓██▓???▓▓█
                            █? █   ???       ███▓▓█ ?█???
                            ████?   ?▓█▓      ██??? ▓███?
                         ??█▓▓██       ▓█?    ▓█?▓██▓ ?█?
                   ▓??▓████? ██         ?█    █▓??█???█?
                  ███▓?██▓  ▓█           █   █▓ ?▓█▓▓█?
                ?██▓  ?█?            █  █? ?█████▓? ██▓??
               ███? ? █?          ▓ ?█ █████???    ?█?▓  ▓?
              ██▓█ ??▓?          ▓███████▓?       ?█? ?▓ ▓██▓
           ?██▓ ▓█ █▓█       ??█████▓▓??         ██??  █ ?  ▓█?
           ▓█▓  ▓█ ██▓ ?▓▓▓▓▓▓▓?              ?██▓           ?█?
           ▓█    █ ▓███▓??              ?▓▓▓███▓          ??? ▓█
           ██▓    ██?    ??▓▓███▓▓▓▓▓██████▓?            ▓███  █
          ▓███? ███   ?▓▓???   ?▓████▓?                  ??▓?  █▓
          █▓??▓▓██  ??????????▓██▓?                            █▓
          ██ ▓??█   ▓▓▓▓???  ?█▓       ?▓▓██▓    ▓?          ??▓
          ▓█▓ ▓?█  █▓?  ??▓▓██?            ?▓█?   ??????▓█████?
           ██? ▓█?█?  ?▓▓?  ▓█                █?      ????   ?█?
           ▓█   ?█▓   ?     █?                ?█              █▓
            █▓   ██         █?                 ▓▓        ?█▓▓▓?█?
             █▓ ?▓██?       ▓?                  ▓█▓?????▓█?    ?█
              ██   ▓█▓?      ?                    ??█?██?      ▓▓
               ▓█?   ?█▓??                         ?? █?█▓?????██
                ?██?    ?▓▓?                     ▓██▓?█? ?▓▓▓▓?█▓
                  ?▓██?                          ▓?  ?█▓█  ?????
                      ?▓▓▓▓▓?????????????????????????▓▓  ▓??█?
          
    ______ _ _       _       _____  ____  _         _____ _ _            _  BETA   
   |  ____| (_)     | |     / ____|/ __ \| |       / ____| (_)          | |  
   | |__  | |_ _ __ | | __ | (___ | |  | | |      | |    | |_  ___ _ __ | |_ 
   |  __| | | | '_ \| |/ /  \___ \| |  | | |      | |    | | |/ _ \ '_ \| __|
   | |    | | | | | |   <   ____) | |__| | |____  | |____| | |  __/ | | | |_ 
   |_|    |_|_|_| |_|_|\_\ |_____/ \___\_\______|  \_____|_|_|\___|_| |_|\__|
          
        Welcome! Enter 'HELP;' to list all available commands. 'QUIT;' to exit.

6.1 創(chuàng)建表插入數(shù)據(jù)

創(chuàng)建表

Flink SQL> CREATE TABLE t6(
>   uuid VARCHAR(20),
>   name VARCHAR(10),
>   age INT,
>   ts TIMESTAMP(3),
>   `partition` VARCHAR(20)
> )
> PARTITIONED BY (`partition`)
> WITH (
>   'connector' = 'hudi',
>   'path' = 'hdfs://192.168.1.161:8020/hudi/t6',
>   'table.type' = 'MERGE_ON_READ'
> );

插入數(shù)據(jù)

Flink SQL> INSERT INTO t6 VALUES
>   ('id11','Danny',23,TIMESTAMP '1970-01-01 00:00:01','par1'),
>   ('id12','Stephen',33,TIMESTAMP '1970-01-01 00:00:02','par1'),
>   ('id13','Julian',53,TIMESTAMP '1970-01-01 00:00:03','par2'),
>   ('id14','Fabian',31,TIMESTAMP '1970-01-01 00:00:04','par2'),
>   ('id15','Sophia',18,TIMESTAMP '1970-01-01 00:00:05','par3'),
>   ('id16','Emma',20,TIMESTAMP '1970-01-01 00:00:06','par3'),
>   ('id17','Bob',44,TIMESTAMP '1970-01-01 00:00:07','par4'),
>   ('id18','Han',56,TIMESTAMP '1970-01-01 00:00:08','par4'); 
[INFO] Submitting SQL update statement to the cluster...
[INFO] Table update statement has been successfully submitted to the cluster:
Job ID: 855442379d4a88701372ff0570a1a1db

6.2 查看flink 日志

在這里插入圖片描述

6.3 查看hdfs 中的

[root@node01 module]# hdfs dfs -ls /hudi/t6
Found 6 items
drwxr-xr-x   - root hdfs          0 2021-10-05 03:24 /hudi/t6/.hoodie
drwxr-xr-x   - root hdfs          0 2021-10-05 03:24 /hudi/t6/par1
drwxr-xr-x   - root hdfs          0 2021-10-05 02:58 /hudi/t6/par2
drwxr-xr-x   - root hdfs          0 2021-10-05 03:11 /hudi/t6/par3
drwxr-xr-x   - root hdfs          0 2021-10-05 02:58 /hudi/t6/par4
drwxr-xr-x   - root hdfs          0 2021-10-05 03:24 /hudi/t6/par5
[root@node01 module]# 

在分區(qū)中的數(shù)據(jù)

[root@node01 module]# hdfs dfs -ls /hudi/t1/par1/
Found 9 items
-rw-r--r--   3 root hdfs       1074 2021-10-05 02:58 /hudi/t6/par1/.cad14418-3e18-42f7-a0a1-6e2145ca228c_20211005025818.log.1_0-4-0
-rw-r--r--   3 root hdfs        960 2021-10-05 02:59 /hudi/t6/par1/.cad14418-3e18-42f7-a0a1-6e2145ca228c_20211005025818.log.2_0-4-0
-rw-r--r--   3 root hdfs        960 2021-10-05 03:03 /hudi/t6/par1/.cad14418-3e18-42f7-a0a1-6e2145ca228c_20211005025818.log.3_0-4-0
-rw-r--r--   3 root hdfs        965 2021-10-05 03:04 /hudi/t6/par1/.cad14418-3e18-42f7-a0a1-6e2145ca228c_20211005025818.log.4_0-4-0
-rw-r--r--   3 root hdfs        969 2021-10-05 03:06 /hudi/t6/par1/.cad14418-3e18-42f7-a0a1-6e2145ca228c_20211005025818.log.5_0-4-0
-rw-r--r--   3 root hdfs       1078 2021-10-05 03:11 /hudi/t6/par1/.cad14418-3e18-42f7-a0a1-6e2145ca228c_20211005025818.log.6_0-4-0
-rw-r--r--   3 root hdfs       1079 2021-10-05 03:12 /hudi/t6/par1/.cad14418-3e18-42f7-a0a1-6e2145ca228c_20211005025818.log.7_0-4-0
-rw-r--r--   3 root hdfs        961 2021-10-05 03:24 /hudi/t6/par1/.cad14418-3e18-42f7-a0a1-6e2145ca228c_20211005025818.log.8_0-4-0
-rw-r--r--   3 root hdfs         93 2021-10-05 02:58 /hudi/t6/par1/.hoodie_partition_metadata
[root@node01 module]# 

7查看數(shù)據(jù)

Flink SQL> select * from t6;

                                                                          SQL Query Result (Table)                                                                          
 Table program finished.                                                      Page: Last of 1                                                         Updated: 11:56:09.865 

                      uuid                      name                       age                        ts                 partition
                      id13                    Julian                        53       1970-01-01T00:00:03                      par2
                      id14                    Fabian                        31       1970-01-01T00:00:04                      par2
                       id1                     Danny                        19       1970-01-01T00:00:01                      par1
                      id11                     Danny                        23       1970-01-01T00:00:01                      par1
                      id12                   Stephen                        33       1970-01-01T00:00:02                      par1
                      id16                      Emma                        20       1970-01-01T00:00:06                      par3
                      id15                    Sophia                        18       1970-01-01T00:00:05                      par3
                      id17                       Bob                        44       1970-01-01T00:00:07                      par4
                      id18                       Han                        56       1970-01-01T00:00:08                      par4


7.1 在插入一條數(shù)據(jù)有點(diǎn)

Flink SQL> INSERT INTO t6 VALUES ('id1','Danny',33,TIMESTAMP '1970-01-01 00:00:01','par1');
[INFO] Submitting SQL update statement to the cluster...
[INFO] Table update statement has been successfully submitted to the cluster:
Job ID: 465e6db08a26348926226edfd796ea8c

遇到個(gè)問(wèn)題:插入成功后,日志也沒(méi)有報(bào)錯(cuò)日志


在這里插入圖片描述

7.2 查詢 出來(lái)還是沒(méi)有更新, 不知道哪個(gè)環(huán)節(jié)出問(wèn)題了。

Flink SQL> INSERT INTO t6 VALUES ('id1','Danny',33,TIMESTAMP '1970-01-01 00:00:01','par1');
[INFO] Submitting SQL update statement to the cluster...
[INFO] Table update statement has been successfully submitted to the cluster:
Job ID: 465e6db08a26348926226edfd796ea8c


Flink SQL> select * from t6;

                                                                          SQL Query Result (Table)                                                                          
 Table program finished.                                                      Page: Last of 1                                                         Updated: 11:56:09.865 

                      uuid                      name                       age                        ts                 partition
                      id13                    Julian                        53       1970-01-01T00:00:03                      par2
                      id14                    Fabian                        31       1970-01-01T00:00:04                      par2
                       id1                     Danny                        19       1970-01-01T00:00:01                      par1
                      id11                     Danny                        23       1970-01-01T00:00:01                      par1
                      id12                   Stephen                        33       1970-01-01T00:00:02                      par1
                      id16                      Emma                        20       1970-01-01T00:00:06                      par3
                      id15                    Sophia                        18       1970-01-01T00:00:05                      par3
                      id17                       Bob                        44       1970-01-01T00:00:07                      par4
                      id18                       Han                        56       1970-01-01T00:00:08                      par4



?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 16宿命:用概率思維提高你的勝算 以前的我是風(fēng)險(xiǎn)厭惡者,不喜歡去冒險(xiǎn),但是人生放棄了冒險(xiǎn),也就放棄了無(wú)數(shù)的可能。 ...
    yichen大刀閱讀 7,882評(píng)論 0 4
  • 公元:2019年11月28日19時(shí)42分農(nóng)歷:二零一九年 十一月 初三日 戌時(shí)干支:己亥乙亥己巳甲戌當(dāng)月節(jié)氣:立冬...
    石放閱讀 7,462評(píng)論 0 2

友情鏈接更多精彩內(nèi)容