開源交流丨批流一體數據集成工具ChunJun同步Hive事務表原理詳解及實戰分享

来源:https://www.cnblogs.com/DTinsight/archive/2022/07/12/16471361.html
-Advertisement-
Play Games

原文鏈接:批流一體數據集成工具ChunJun同步Hive事務表原理詳解及實戰分享 課件獲取:關註公眾號__ “數棧研習社”,後臺私信 “ChengYing”__ 獲得直播課件 視頻回放:點擊這裡 ChengYing 開源項目地址:github 丨 gitee 喜歡我們的項目給我們點個__ STAR! ...


原文鏈接:批流一體數據集成工具ChunJun同步Hive事務表原理詳解及實戰分享

課件獲取:關註公眾號__ “數棧研習社”,後臺私信 “ChengYing”__ 獲得直播課件

視頻回放:點擊這裡

ChengYing 開源項目地址:github gitee 喜歡我們的項目給我們點個__ STAR!STAR!!STAR!!!(重要的事情說三遍)__

技術交流釘釘 qun:30537511

本期我們帶大家回顧一下無倦同學的直播分享《Chunjun同步Hive事務表詳解》

一、Hive事務表的結構及原理

Hive是基於Hadoop的一個數據倉庫工具,用來進行數據提取、轉化、載入,這是一種可以存儲、查詢和分析存儲在Hadoop中的大規模數據的機制。Hive數據倉庫工具能將結構化的數據文件映射為一張資料庫表,並提供SQL查詢功能,能將SQL語句轉變成MapReduce任務來執行。

在分享Hive事務表的具體內容前,我們先來瞭解下HIve 事務表在 HDFS 存儲上的一些限制。

Hive雖然支持了具有ACID語義的事務,但是沒有像在MySQL中使用那樣方便,有很多局限性,具體限制如下:

  • 尚不支持BEGIN,COMMIT和ROLLBACK,所有語言操作都是自動提交的

  • 僅支持ORC文件格式(STORED AS ORC)

  • 預設情況下事務配置為關閉,需要配置參數開啟使用

  • 表必須是分桶表(Bucketed)才可以使用事務功能

  • 表必須內部表,外部表無法創建事務表

  • 表參數transactional必須為true

  • 外部表不能成為ACID表,不允許從非ACID會話讀取/寫入ACID表

以下矩陣包括可以使用Hive創建的表的類型、是否支持ACID屬性、所需的存儲格式以及關鍵的SQL操作。

file

瞭解完Hive事務表的限制,現在我們具體瞭解下Hive事務表的內容。

1、事務表文件名字詳解

  • 基礎目錄:

$partition/base_$wid/$bucket

  • 增量目錄:

$partition/delta_$wid_$wid_$stid/$bucket

  • 參數目錄:

$partition/delete_delta_$wid_$wid_$stid/$bucket

file

2、事務表文件內容詳解

$ orc-tools data bucket_00000

{"operation":0,"originalTransaction":1,"bucket":536870912,"rowId":0,"currentTransaction":1,"row":{"id":1,"name":"Jerry","age":18}}

{"operation":0,"originalTransaction":1,"bucket":536870912,"rowId":1,"currentTransaction":1,"row":{"id":2,"name":"Tom","age":19}}

{"operation":0,"originalTransaction":1,"bucket":536870912,"rowId":2,"currentTransaction":1,"row":{"id":3,"name":"Kate","age":20}}

  • operation 0 表示插入、1 表示更新,2 表示刪除。由於使用了 split-update,UPDATE 是不會出現的。

  • originalTransaction是該條記錄的原始寫事務 ID:

a、對於 INSERT 操作,該值和 currentTransaction 是一致的;

b、對於 DELETE,則是該條記錄第一次插入時的寫事務 ID。

  • bucket 是一個 32 位整型,由 BucketCodec 編碼,各個二進位位的含義為:

a、1-3 位:編碼版本,當前是 001;

b、4 位:保留;

c、5-16 位:分桶 ID,由 0 開始。分桶 ID 是由 CLUSTERED BY 子句所指定的欄位、以及分桶的數量決定的。該值和 bucket_N 中的 N 一致;

d、17-20 位:保留;

e、21-32 位:語句 ID;

舉例來說,整型 536936448 的二進位格式為 00100000000000010000000000000000,即它是按版本 1 的格式編碼的,分桶 ID 為 1。

  • rowId 是一個自增的唯一 ID,在寫事務和分桶的組合中唯一;

  • currentTransaction 當前的寫事務 ID;

  • row 具體數據。對於 DELETE 語句,則為 null。

3、更新 Hive 事務表數據

UPDATE employee SET age = 21 WHERE id = 2;

這條語句會先查詢出所有符合條件的記錄,獲取它們的 row_id 信息,然後分別創建 delete 和 delta 目錄:

/user/hive/warehouse/employee/delta_0000001_0000001_0000/bucket_00000

/user/hive/warehouse/employee/delete_delta_0000002_0000002_0000/bucket_00000 (update)

/user/hive/warehouse/employee/delta_0000002_0000002_0000/bucket_00000 (update)

delete_delta_0000002_0000002_0000/bucket_00000

包含了刪除的記錄:

{"operation":2,"originalTransaction":1,"bucket":536870912,"rowId":1,"currentTransaction":2,"row":null}

delta_0000002_0000002_0000/bucket_00000

包含更新後的數據:

{"operation":0,"originalTransaction":2,"bucket":536870912,"rowId":0,"currentTransaction":2,"row":{"id":2,"name":"Tom","salary":21}}

4、Row_ID 信息怎麼查?

file

5、事務表壓縮(Compact)

隨著寫操作的積累,表中的 delta 和 delete 文件會越來越多,事務表的讀取過程中需要合併所有文件,數量一多勢必會影響效率,此外小文件對 HDFS 這樣的文件系統也不夠友好,因此Hive 引入了壓縮(Compaction)的概念,分為 Minor 和 Major 兩類。

● Minor

Minor Compaction 會將所有的 delta 文件壓縮為一個文件,delete 也壓縮為一個。壓縮後的結果文件名中會包含寫事務 ID 範圍,同時省略掉語句 ID。

壓縮過程是在 Hive Metastore 中運行的,會根據一定閾值自動觸發。我們也可以使用如下語句人工觸發:

ALTER TABLE dtstack COMPACT 'MINOR'。

● Major

Major Compaction 會將所有的 delta 文件,delete 文件壓縮到一個 base 文件。壓縮後的結果文件名中會包含所有寫事務 ID 的最大事務 ID。

壓縮過程是在 Hive Metastore 中運行的,會根據一定閾值自動觸發。我們也可以使用如下語句人工觸發:

ALTER TABLE dtstack COMPACT 'MAJOR'。

6、文件內容詳解

ALTER TABLE employee COMPACT 'minor';

語句執行前:

/user/hive/warehouse/employee/delta_0000001_0000001_0000

/user/hive/warehouse/employee/delta_0000002_0000002_0000 (insert 創建, mary的數據)

/user/hive/warehouse/employee/delete_delta_0000002_0000002_0001 (update)

/user/hive/warehouse/employee/delta_0000002_0000002_0001 (update)

語句執行後:

/user/hive/warehouse/employee/delete_delta_0000001_0000002

/user/hive/warehouse/employee/delta_0000001_0000002

7、讀 Hive 事務表

我們可以看到 ACID 事務表中會包含三類文件,分別是 base、delta、以及 delete。文件中的每一行數據都會以 row_id 作為標識併排序。從 ACID 事務表中讀取數據就是對這些文件進行合併,從而得到最新事務的結果。這一過程是在 OrcInputFormat 和 OrcRawRecordMerger 類中實現的,本質上是一個合併排序的演算法。

以下列文件為例,產生這些文件的操作為:

  1. 插入三條記錄

  2. 進行一次 Major Compaction

  3. 然後更新兩條記錄。

1-0-0-1 是對 originalTransaction - bucketId - rowId - currentTra

file

8、合併演算法

對所有數據行按照 (originalTransaction, bucketId, rowId) 正序排列,(currentTransaction) 倒序排列,即:

originalTransaction-bucketId-rowId-currentTransaction

(base_1)1-0-0-1

(delete_2)1-0-1-2# 被跳過(DELETE)

(base_1)1-0-1-1 # 被跳過(當前記錄的 row_id(1) 和上條數據一樣)

(delete_2)1-0-2-2 # 被跳過(DELETE)

(base_1)1-0-2-1 # 被跳過(當前記錄的 row_id(2) 和上條數據一樣)

(delta_2)2-0-0-2

(delta_2)2-0-1-2

獲取第一條記錄;

  1. 如果當前記錄的 row_id 和上條數據一樣,則跳過;

  2. 如果當前記錄的操作類型為 DELETE,也跳過;

通過以上兩條規則,對於 1-0-1-2 和 1-0-1-1,這條記錄會被跳過;

如果沒有跳過,記錄將被輸出給下游;

重覆以上過程。

合併過程是流式的,即 Hive 會將所有文件打開,預讀第一條記錄,並將 row_id 信息存入到 ReaderKey 類型中。

file

三、ChunJun讀寫Hive事務表實戰

瞭解完Hive事務表的基本原理後,我們來為大家分享如何在ChunJun中讀寫Hive事務表。

1、事務表數據準備

-- 創建事務表

create table dtstack(

id int,

name string,

age int

)

stored as orc

TBLPROPERTIES('transactional'='true');

-- 插入 10 條測試數據

insert into dtstack (id, name, age)

values (1, "aa", 11), (2, "bb", 12), (3, "cc", 13), (4, "dd", 14), (5, "ee", 15),

   (6, "ff", 16), (7, "gg", 17), (8, "hh", 18), (9, "ii", 19), (10, "jj", 20);

2、配置 ChunJun json 腳本

file

file

file

3、提交任務(讀寫事務表)

啟動 Session

/root/wujuan/flink-1.12.7/bin/yarn-session.sh -t $ChunJun_HOME -d

提交 Yarn Session 任務

讀取事務表

/root/wujuan/ChunJun/bin/ChunJun-yarn-session.sh -job /root/wujuan/ChunJun/ChunJun-examples/json/hive3/hive3_transaction_stream.json -confProp {"yarn.application.id":"application_1650792512832_0134"}

寫入事務表

/root/wujuan/ChunJun/bin/ChunJun-yarn-session.sh -job /root/wujuan/ChunJun/ChunJun-examples/json/hive3/stream_hive3_transaction.json -confProp {"yarn.application.id":"application_1650792512832_0134"}

根據上一行結果替換 yarn.application.id

三、ChunJun 讀寫Hive事務表源碼分析

壓縮器是在 Metastore 境內運行的一組後臺程式,用於支持 ACID 系統。它由 Initiator、 Worker、 Cleaner、 AcidHouseKeeperService 和其他一些組成。

1、Compactor

● Delta File Compaction

在不斷的對錶修改中,會創建越來越多的delta文件,需要這些文件需要被壓縮以保證性能。有兩種類型的壓縮,即(minor)小壓縮和(major)大壓縮:

minor 需要一組現有的delta文件,並將它們重寫為每個桶的一個delta文件

major 需要一個或多個delta文件和桶的基礎文件,並將它們改寫成每個桶的新基礎文件。major 需要更久,但是效果更好

所有的壓縮工作都是在後臺進行的,並不妨礙對數據的併發讀寫。在壓縮之後系統會等待,直到所有舊文件的讀都結束,然後刪除舊文件。

●Initiator

這個模塊負責發現哪些表或分區要進行壓縮。這應該在元存儲中使用hive.compactor.initiator.on來啟用。 每個 Compact 任務處理一個分區(如果表是未分區的,則處理整個表)。如果某個分區的連續壓實失敗次數超過 hive.compactor.initiator.failed.compacts.threshold,這個分區的自動壓縮調度將停止。

● Worker

每個Worker處理一個壓縮任務。 一個壓縮是一個MapReduce作業,其名稱為以下形式。-compactor-.

.。 每個Worker將作業提交給集群(如果定義了hive.compactor.job.queue),並等待作業完成。hive.compactor.worker.threads決定了每個Metastore中Worker的數量。 Hive倉庫中的Worker總數決定了併發壓縮的最大數量。

● Cleaner

這個進程是在壓縮後,在確定不再需要delta文件後,將其刪除。

● AcidHouseKeeperService

這個進程尋找那些在hive.txn.timeout時間內沒有心跳的事務並中止它們。系統假定發起交易的客戶端停止心跳後崩潰了,它鎖定的資源應該被釋放。

● SHOW COMPACTIONS

該命令顯示當前運行的壓實和最近的壓實歷史(可配置保留期)的信息。這個歷史顯示從HIVE-12353開始可用。

● Compact 重點配置

file

2、如何 debug Hive

  1. debug hive client

hive --debug

  1. debug hive metastore

hive --service metastore --debug:port=8881,mainSuspend=y,childSuspend=n --hiveconf hive.root.logger=DEBUG,console

file

  1. debug hive mr 任務

file

3、讀寫過濾和CompactorMR排序的關鍵代碼

file

file

4、Minor&Major 合併源碼(CompactorMR Map 類)

file

四、ChunJun 文件系統未來規劃

最後為大家介紹ChunJun 文件系統未來規劃:

● 基於 FLIP-27 優化文件系統

批流統一實現,簡單的線程模型,分片和讀數據分離。

● Hive 的分片優化

分片更精細化,粒度更細,充分發揮併發能力

● 完善 Exactly Once 語義

加強異常情況健壯性。

● HDFS 文件系統的斷點續傳

根據分區,文件個數,文件行數等確定端點位置,狀態存儲在 checkpoint 裡面。

● 實時採集文件

實時監控目錄下的多個追加文件。

● 文件系統格式的通用性

JSON、CSV、Text、XM、EXCELL 統一抽取公共包。

袋鼠雲開源框架釘釘技術交流qun(30537511),歡迎對大數據開源項目有興趣的同學加入交流最新技術信息,開源項目庫地址:https://github.com/DTStack


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 為大家帶來一款適用於MacOS的應用加密軟體Cisdem AppCrypt Mac,只需設置密碼並將應用程式和網站添加到鎖定列表中,沒有人能夠在沒有正確密碼的情況下訪問受保護的應用程式和網站,在假期孩子們需要使用電腦上網課的時候,也可以使用它防止孩子自製力不好瀏覽其他應用或網站的情況。 詳情:Cis ...
  • Screenflow mac是一款優秀的屏幕錄像軟體,使用它不僅可以完成Mac電腦桌面操作的視頻錄製,還可以根據自己的需求進行後期剪輯處理,可以進行視頻分割、添加背景音樂、文字,改變視頻播放速率等操作,功能強大,使用非常方便。 詳情:ScreenFlow for mac(屏幕錄像軟體) 新增特性 1 ...
  • 鏡像下載、功能變數名稱解析、時間同步請點擊 阿裡雲開源鏡像站 問題:搭建私庫認證不通過x509: certificate signed by unknown authority 首先確保配置harbor私庫地址 [root@master harbor]# grep hostname harbor.cfg # ...
  • 一 Linux操作系統和Shell 簡介 操作系統(Operating Systems, OS)實際上是一種用於電腦的軟、硬體資源管理調度的系統級軟體,它的主體是內核(Kernel),其主要負責進程管理、記憶體管理、文件管理和外設管理等功能,而它也向外界提供了內核的介面即系統調用(System Ca ...
  • 讀了 @SnailMann大佬【MySQL筆記】正確的理解MySQL的MVCC及實現原理 收益頗豐,非常感謝! 但對其中如何判斷事務是否可見性還是不太理解,於是作了本文,在原博客基礎上,舉例畫圖論證、理解了**Read View**的可見性判斷。 引用 @SnailMann大佬【MySQL筆記】正確 ...
  • redis 憑藉著強大的功能和可靠的穩定性,應用場景越來越廣。逐漸成為軟體開發工程師必備的技能之一。 本篇文章,暫不做基本功能的介紹。直接教大家如何部署redis集群。 集群演進主要分為2部分。 ##一、主從備份機制 一個redis 主服務可以擁有多個從服務;一個從伺服器,只可擁有一個主服務。從服務 ...
  • ClickHouse集群的搭建和部署和單機的部署是類似的,主要在於配置的不一致,如果需要瞭解ClickHouse單機的安裝設部署,可以看看這篇文章,ClickHouse(03)ClickHouse怎麼安裝和部署。 ClickHouse集群部署流程大概如下: 環境準備 在每台機器上安裝單機版Click ...
  • MySQL 高級 1、約束 1.1、約束介紹 什麼是約束 對錶中的數據進行限定,保證數據的正確性、有效性、完整性 約束類型 | 約束 | 說明 | | : : | : : | | PRIMARY KEY | 主鍵約束 | | UNIQUE | 唯一約束 | | NOT NULL | 非空約束 | | ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...