網站首頁 編程語言 正文
1. Hudi表對應的Hive外部表介紹
Hudi源表對應一份HDFS數據,可以通過Spark,Flink 組件或者Hudi客戶端將Hudi表的數據映射為Hive外部表,基于該外部表, Hive可以方便的進行實時視圖,讀優化視圖以及增量視圖的查詢。
2. Hive對Hudi的集成
這里以Hive3.1.1、 Hudi 0.9.0為例, 其他版本類似
將hudi-hadoop-mr-bundle-0.9.0xxx.jar , hudi-hive-sync-bundle-0.9.0xx.jar 放到hiveserver 節點的lib目錄下
修改hive-site.xml找到hive.default.aux.jars.path 以及hive.aux.jars.path 這兩個配置項,將第一步中的jar包全路徑給配置上去: 配置后如下
<name>hive.default.aux.jars.path</name> <value>xxxx,jar,xxxx,jar,file:///mypath/hudi-hadoop-mr-bundle-0.9.0xxx.jar,file:///mypath/hudi-hive-sync-bundle-0.9.0xx.jar</value>
配置完后重啟hive-server
對于Hudi的bootstrap表(tez查詢),除了要添加hudi-hadoop-mr-bundle-0.9.0xxx.jar , hudi-hive-sync-bundle-0.9.0xx.jar這兩個jar包,還需把hbase-shaded-miscellaneous-xxx.jar, hbase-metric-api-xxx.jar,hbase-metrics-xxx.jar, hbase-protocol-shaded-xx.jar,hbase-shaded-protobuf-xxx.jar,htrce-core4-4.2.0xxxx.jar按上述步驟添加進去。
3. 創建Hudi表對應的hive外部表
一般來說Hudi表在用Spark或者Flink寫入數據時會自動同步到Hive外部表, 此時可以直接通過beeline查詢同步的外部表, 若寫入引擎沒有開啟自動同步,則需要手動利用hudi客戶端工具run_hive_sync_tool.sh 進行同步具體可以參考官網查看相關參數。
4. 查詢Hudi表對應的Hive外部表
4.1 操作前提
使用Hive查詢Hudi表前,需要通過set命令設置hive.input.format,否則會出現數據重復,查詢異常等錯誤,如下面這個報錯就是典型的沒有設置hive.input.format 導致的
java.lang.IllegalArgumentException: HoodieRealtimeReader can oly work on RealTimeSplit and not with xxxxxxxxxx
除此之外對于增量查詢,還需要set命令額外設置3個參數
set hoodie.mytableName.consume.mode=INCREMENTAL; set hoodie.mytableName.consume.max.commits=3; set hoodie.mytableName.consume.start.timestamp=commitTime;
注意這3個參數是表級別參數
參數名 | 描述 |
---|---|
hoodie.mytableName.consume.mode | Hudi表的查詢模式。 增量查詢 :INCREMENTAL非增量查詢:不設置或者設為SNAPSHOT |
hoodie.mytableName.consume.start.timestamp | Hudi表增量查詢起始時間 |
hoodie. mytableName.consume.max.commits | Hudi表基于hoodie.mytableName.consume.start.timestamp 之后要查詢的增量commit次數。提交次數,如設置為3時,代表增量查詢從指定的起始時間之后commit 3次的數據,設為-1時,增量查詢從指定的起始時間之后提交的所有數據 |
4.2 COW類型Hudi表的查詢
例如Hudi原表表名為hudicow,同步給hive之后hive表名hudicow
4.2.1 COW表實時視圖查詢
設置hive.input.format 為org.apache.hadoop.hive.ql.io.HiveInputFormat或者org.apache.hudi.hadoop.hive.HoodieCombineHiveInputFormat后,像普通的hive表一樣查詢即可
set hive.input.format= org.apache.hadoop.hive.ql.io.HiveInputFormat; select count(*) from hudicow;
4.2.2 COW表增量查詢
除了要設置hive.input.format,還需要設置上述的3個增量查詢參數,且增量查詢語句中的必須添加where 關鍵字并將_hoodie_commit_time
?> 'startCommitTime'作為過濾條件(這地方主要是hudi的小文件合并會把新舊commit的數據合并成新數據,hive是沒法直接從parquet文件知道哪些是新數據哪些是老數據)
set hive.input.format = org.apache.hadoop.hive.ql.io.HiveInputFormat; set hoodie.hudicow.consume.mode = INCREMENTAL; set hoodie.hudicow.consume.max.commits = 3; set hoodie.hudicow.consume.start.timestamp = xxxx; select count(*) from hudicow where `_hoodie_commit_time` > 'xxxx'
注意_hoodie_commit_time
?的引號是反引號(tab鍵上面那個)不是單引號, 'xxxx'是單引號
4.3 MOR類型Hudi表的查詢
例如mor類型Hudi源表的表名為hudimor,映射為兩張Hive外部表hudimor_ro(ro表)和hudimor_rt(rt表)
4.3.1 MOR表讀優化視圖
實際上就是讀 ro表,和cow表類似設置完hiveInputFormat 之后 和普通的hive表一樣查詢即可。
4.3.2 MOR表實時視圖
設置了hive.input.format之后,即可查詢到Hudi源表的最新數據
set hive.input.format = org.apache.hadoop.hive.ql.io.HiveInputFormat; select * from hudicow_rt;
4.3.3 MOR表增量查詢
這個增量查詢針對的rt表,不是ro表。通COW表的增量查詢類似
set hive.input.format = org.apache.hudi.hadoop.hive.HoodieCombineHiveInputFormat; // 這地方指定為HoodieCombineHiveInputFormat set hoodie.hudimor.consume.mode = INCREMENTAL;set hoodie.hudimor.consume.max.commits = -1; set hoodie.hudimor.consume.start.timestamp = xxxx; select * from hudimor_rt where `_hoodie_commit_time` > 'xxxx'; // 這個表名要是rt表
說明如下
set hive.input.format=org.apache.hudi.hadoop.hive.HoodieCombineHiveInputFormat;
最好只用于rt表的增量查詢,當然其他種類的查詢也可以設置為這個,這個參數會影響到普通的hive表查詢,因此在rt表增量查詢完成后,應該設置
set hive.input.format=org.apache.hadoop.hive.ql.io.HiveInputFormat;
或者改為默認值
set hive.input.format=org.apache.hadoop.hive.ql.io.CombineHiveInputFormat;
用于其他表的查詢。
set hoodie.mytableName.consume.mode=INCREMENTAL;
僅用于該表的增量查詢模式,若要對該表切換為其他查詢模式,應設置
set hoodie.hudisourcetablename.consume.mode=SNAPSHOT;
當前Hudi(0.9.0)對接Hive的一些問題,請使用master分支或即將發布的0.10.0版本
hive讀hudi表會將所有的數據給打印出來有嚴重的性能問題和數據安全問題。
MOR表的實時視圖讀取 請按需設置mapreduce.input.fileinputformat.split.maxsize的大小 禁止hive取切分讀取的文件,否則會出現數據重復。這個問題當前是無解的,spark讀hudi實時視圖的時候代碼直接寫死不會切分文件,hive需要手動設置。
如果碰到classNotFound, noSuchMethod等錯誤請檢查hive lib庫下面的jar包是否出現沖突。
5. Hive側源碼修改
為支持Hive查詢Hudi的純log文件需要對Hive側源碼進行修改。
具體修改org.apache.hadoop.hive.common.FileUtils 如下函數
public static final PathFilter HIDDEN_FILES_PATH_FILTER = new PathFilter() {? ? @Override? ? public boolean accept(Path p) {? ? ? String name = p.getName();? ? ? boolean isHudiMeta = name.startsWith(".hoodie");? ? ? boolean isHudiLog = false;? ? ? Pattern LOG_FILE_PATTERN = Pattern.compile("\\.(.*)_(.*)\\.(.*)\\.([0-9]*)(_(([0-9]*)-([0-9]*)-([0-9]*)))?");? ? ? Matcher matcher = LOG_FILE_PATTERN.matcher(name);? ? ? if (matcher.find()) {? ? ? ? isHudiLog = true;? ? ? }? ? ? boolean isHudiFile = isHudiLog || isHudiMeta;? ? ? return (!name.startsWith("_") && !name.startsWith(".")) || isHudiFile;? ? }? };
重新編譯hive, 把新編譯的hive-common-xxx.jar
,?hive-exec-xxx.jar
?替換到hive server的lib目錄下注意權限和名字和原來的jar包保持一致。
最后重啟hive-server即可。
原文鏈接:https://www.cnblogs.com/leesf456/p/15680891.html
相關推薦
- 2022-04-18 Python?字典(Dictionary)詳細介紹_python
- 2023-02-10 WPF實現圓形進度條的示例代碼_C#教程
- 2024-03-20 SpringBoot使用dynamic-datasource實現多數據源方案
- 2022-07-13 Docker的資源控制管理
- 2022-06-30 深度卷積神經網絡各種改進結構塊匯總_其它綜合
- 2022-08-15 Python利用Selenium實現自動化驗證登錄
- 2023-02-15 Python函數常見幾種return返回值類型_python
- 2023-05-16 pyinstaller打包遇到的問題解決_python
- 最近更新
-
- window11 系統安裝 yarn
- 超詳細win安裝深度學習環境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優雅實現加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發現-Nac
- Spring Security之基于HttpR
- Redis 底層數據結構-簡單動態字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支