文章目錄
- Hive 1.2.1
- 大資料體系概述
- Hive架構
- 資料倉庫
- Hive 是什么
- Hive的安裝
- 版本介紹
- 學習Hive
- 安裝主要流程
- Hive與傳統資料庫比較
- Hive的存盤格式
- TextFile
- RCFile
- ORCFile
- Parquet
- SEQUENCEFILE
- AVRO
- Hive的四大常用存盤格式存盤效率及執行速度對比
- Hive操作客戶端
- Hive的metastore
- Hive元資料表結構
- 1、存盤Hive版本的元資料表(VERSION)
- 2、Hive資料庫相關的元資料表(DBS、DATABASE_PARAMS)
- 3、Hive表和視圖相關的元資料表
- 4、Hive檔案存盤資訊相關的元資料表
- 5、Hive表欄位相關的元資料表
- 6、Hive表分磁區相關的元資料表
- 6、其他不常用的元資料表
Hive 1.2.1
大資料體系概述
Hive架構
資料倉庫
??很久很久以前,我們的世界分為:人族、矮人族、精靈、獸族…本來世界很和平,
??突然有一天,有一個人,有一個想法,這個想法很可怕,打破了這樣的平靜,他想統治整個世界,怎么做呢?
??他想了一個主意,他會魔法,他用他的魔法,打造出魔戒,然后他把這個魔戒分別送個各個種族的首領,方便各個首領更好的統治;
??然后他又偷偷的制造了一個至尊魔戒,這個至尊魔戒可以統治普通的魔戒,以此實作他的統一世界的夢想,,,,,,
??如果把世界上每一個生物當作一條記錄,那么魔戒就好比資料庫,而我們的至尊魔戒就是資料倉庫,
??資料倉庫(Data WareHouse) 實際上是為了公司能夠統一各種業務資料,將各個不同資料源中的資料融合,這些資料通常可以做資料分析、資料挖掘、報表,幫助公司做決策,
Hive 是什么
??Hive是建立在Hadoop上的資料倉庫基礎架構,它提供了一系列的工具,可以用來進行資料提取轉化加載( ETL ),這是一種可以存盤、查詢和分析存盤在 Hadoop 中的大規模資料的機制,Hive 定義了簡單的類 SQL 查詢語言,稱為 HQL ,它允許熟悉 SQL 的用戶查詢資料,同時,這個語言也允許熟悉 MapReduce 開發者的開發自定義的 mapper 和 reducer 來處理內建的 mapper 和 reducer 無法完成的復雜的分析作業,
??資料倉庫,英文名稱為Data Warehouse,可簡寫為DW或DWH,資料倉庫,是為企業所有級別的決策制定程序,提供所有型別資料支持的戰略集合,它出于分析性報告和決策支持目的而創建,為需要業務智能的企業,提供指導業務流程改進、監視時間、成本、質量以及控制,
??Hive是SQL決議引擎,它將SQL陳述句轉譯成M/R Job然后在Hadoop執行,
??Hive的表其實就是HDFS的目錄,按表名把檔案夾分開,如果是磁區表,則磁區值是子檔案夾,可以直接在M/R Job里使用這些資料,
?? Hive相當于hadoop的客戶端工具,部署時不一定放在集群管理節點中,可以放在某個節點上,
Hive的安裝
??Hive的詳細安裝程序請點擊下方靚仔原創博客鏈接:
??Hive資料倉庫——環境搭建及簡單使用
版本介紹
- Hive資料倉庫——環境搭建及簡單使用
- 1.2.1和1.2.2 穩定版本,為Hive2版本(主流版本)
- 1.2.1的程式只能連接hive1.2.1 的hiveserver2
學習Hive
- java 1.8.0_171
- hadoop 2.7.6
- hive 1.2.1
- mysql:5.7
自己使用的程序中一定嚴格按照這個版本去使用(版本兼容)
安裝主要流程
- 安裝MySQL服務
- 安裝hive包,解壓
- 修改組態檔,連接mysql,連接hadoop
- 啟動
??Hive的詳細安裝程序請點擊下方靚仔原創博客鏈接:
??Hive資料倉庫——環境搭建及簡單使用
Hive與傳統資料庫比較
| 查詢語言 | HiveQL | SQL |
|---|---|---|
| 資料存盤位置 | HDFS | Raw Device or 本地 FS |
| 資料格式 | 用戶定義 | 系統決定 |
| 資料更新 | 不支持(1.x以后版本支持) | 支持 |
| 索引 | 新版本有,但弱 | 有 |
| 執行 | MapReduce | Executor |
| 執行延遲 | 高 | 低 |
| 可擴展性 | 高 | 低 |
| 資料規模 | 大 | 小 |
- 查詢語言,類 SQL 的查詢語言 HQL,熟悉 SQL 開發的開發者可以很方便的使用 Hive 進行開發,
- 資料存盤位置,所有 Hive 的資料都是存盤在 HDFS 中的,而資料庫則可以將資料保存在塊設備或者本地檔案系統中,
- 資料格式,Hive 中沒有定義專門的資料格式,而在資料庫中,所有資料都會按照一定的組織存盤,因此,資料庫加載資料的程序會比較耗時,
- 資料更新,Hive 對資料的改寫和添加比較榷訓,0.14版本之后支持,需要啟動配置項,而資料庫中的資料通常是需要經常進行修改的,
- 索引,Hive 在加載資料的程序中不會對資料進行任何處理,因此訪問延遲較高,資料庫可以有很高的效率,較低的延遲,由于資料的訪問延遲較高,決定了 Hive 不適合在線資料查詢,
- 執行計算,Hive 中執行是通過 MapReduce 來實作的而資料庫通常有自己的執行引擎,
- 資料規模,由于 Hive 建立在集群上并可以利用 MapReduce 進行并行計算,因此可以支持很大規模的資料;對應的,資料庫可以支持的資料規模較小,
Hive的存盤格式
- Hive的資料存盤基于Hadoop HDFS,
- Hive沒有專門的資料檔案格式,常見的有以下幾種:
- TEXTFILE
- SEQUENCEFILE
- AVRO
- RCFILE
- ORCFILE
- PARQUET
TextFile
??TEXTFILE 即正常的文本格式,是Hive默認檔案存盤格式,因為大多數情況下源資料檔案都是以text檔案格式保存(便于查看驗數和防止亂碼),此種格式的表檔案在HDFS上是明文,可用hadoop fs -cat命令查看,從HDFS上get下來后也可以直接讀取,
??TEXTFILE 存盤檔案默認每一行就是一條記錄,可以指定任意的分隔符進行欄位間的分割,但這個格式無壓縮,需要的存盤空間很大,雖然可結合Gzip、Bzip2、Snappy等使用,使用這種方式,Hive不會對資料進行切分,從而無法對資料進行并行操作,
??一般只有與其他系統由資料互動的介面表采用TEXTFILE 格式,其他事實表和維度表都不建議使用,
RCFile
?? Record Columnar的縮寫,是Hadoop中第一個列檔案格式,能夠很好的壓縮和快速的查詢性能,通常寫操作比較慢,比非列形式的檔案格式需要更多的記憶體空間和計算量, RCFile是一種行列存盤相結合的存盤方式,首先,其將資料按行分塊,保證同一個record在一個塊上,避免讀一個記錄需要讀取多個block,其次,塊資料列式存盤,有利于資料壓縮和快速的列存取,
ORCFile
??Hive從0.11版本開始提供了ORC的檔案格式,ORC檔案不僅僅是一種列式檔案存盤格式,最重要的是有著很高的壓縮比,并且對于MapReduce來說是可切分 (Split) 的,因此,在Hive中使用ORC作為表的檔案存盤格式,不僅可以很大程度的節省HDFS存盤資源,而且對資料的查詢和處理性能有著非常大的提升,因為ORC較其他檔案格式壓縮比高,查詢任務的輸入資料量減少,使用的Task也就減少了,ORC能很大程度的節省存盤和計算資源,但它在讀寫時候需要消耗額外的CPU資源來壓縮和解壓縮,當然這部分的CPU消耗是非常少的,
Parquet
??通常我們使用關系資料庫存盤結構化資料,而關系資料庫中使用資料模型都是扁平式的,遇到諸如List、Map和自定義Struct的時候就需要用戶在應用層決議,但是在大資料環境下,通常資料的來源是服務端的埋點資料,很可能需要把程式中的某些物件內容作為輸出的一部分,而每一個物件都可能是嵌套的,所以如果能夠原生的支持這種資料,這樣在查詢的時候就不需要額外的決議便能獲得想要的結果,
??Parquet的靈感來自于2010年Google發表的Dremel論文,文中介紹了一種支持嵌套結構的存盤格式,并且使用了列式存盤的方式提升查詢性能,Parquet僅僅是一種存盤格式,它是語言、平臺無關的,并且不需要和任何一種資料處理框架系結,這也是parquet相較于orc的僅有優勢:支持嵌套結構,Parquet 沒有太多其他可圈可點的地方,比如他不支持update操作(資料寫成后不可修改),不支持ACID等,
SEQUENCEFILE
??SequenceFile是Hadoop API 提供的一種二進制檔案,它將資料以 <key,value> 的形式序列化到檔案中,這種二進制檔案內部使用Hadoop 的標準的Writable 介面實作序列化和反序列化,它與Hadoop API中的MapFile 是互相兼容的,Hive 中的SequenceFile 繼承自Hadoop API 的SequenceFile,不過它的key為空,使用value 存放實際的值, 這樣是為了避免MR 在運行map 階段的排序程序,
??SequenceFile支持三種壓縮選擇:NONE, RECORD, BLOCK, Record壓縮率低,一般建議使用BLOCK壓縮, SequenceFile最重要的優點就是Hadoop原生支持較好,有API,但除此之外平平無奇,實際生產中不會使用,
AVRO
??Avro是一種用于支持資料密集型的二進制檔案格式,它的檔案格式更為緊湊,若要讀取大量資料時,Avro能夠提供更好的序列化和反序列化性能,并且Avro資料檔案天生是帶Schema定義的,所以它不需要開發者在API 級別實作自己的Writable物件,Avro提供的機制使動態語言可以方便地處理Avro資料,最近多個Hadoop 子專案都支持Avro 資料格式,如Pig 、Hive、Flume、Sqoop 和 Hcatalog,
Hive的四大常用存盤格式存盤效率及執行速度對比
| 存盤格式 | 占用空間 | 壓縮率%(壓縮后:壓縮前) | sql編號 | 執行時間(s) |
|---|---|---|---|---|
| TextFile | 15.1 | 100.0 | 1 | 118 |
| 2 | 217 | |||
| ORC | 1.3 | 8.61 | 1 | 33 |
| 2 | 3 | |||
| Parquet | 4.3 | 28.48 | 1 | 40 |
| 2 | 71 | |||
| RCFile | 12.3 | 81.64 | 1 | 88 |
| 2 | 71 |
| 編號 | sql |
|---|---|
| 1 | select count(*) from table_test; |
| 2 | select name,sum(table_test.price) as nums from table_test group by name; |
| 3 | benchmark 其它很多增刪改的操作 |
結論:ORCFile存盤檔案讀操作效率最高
耗時比較:ORC<Parquet<RC<Text
結論:ORCFile存盤檔案占用空間少,壓縮效率高
占用空間:ORC<Parquet<RC<Text
Hive操作客戶端
常用的2個:CLI,JDBC/ODBC
- CLI,即Shell命令列
- JDBC/ODBC 是 Hive 的Java,與使用傳統資料庫JDBC的方式類似,
- Hive 將元資料存盤在資料庫中 (metastore) ,目前只支持 mysql、derby,
- Hive 中的元資料包括表的名字,表的列和磁區及其屬性,表的屬性(是否為外部表等),表的資料所在目錄等;由解釋器、編譯器、優化器完成 HQL 查詢陳述句從詞法分析、語法分析、編譯、優化以及查詢計劃 (plan) 的生成,生成的查詢計劃存盤在 HDFS 中,并在隨后由 MapReduce 呼叫執行,
- Hive 的資料存盤在 HDFS 中,大部分的查詢由 MapReduce 完成(包含 * 的查詢,比如 select * from table 不會生成 MapRedcue 任務)
Hive的metastore
- metastore是hive元資料的集中存放地,
- metastore默認使用內嵌的derby資料庫作為存盤引擎,
- Derby引擎的缺點:一次只能打開一個會話,
- 使用MySQL作為外置存盤引擎,多用戶同時訪問
- 元資料表結構
Hive元資料表結構
1、存盤Hive版本的元資料表(VERSION)
??該表比較簡單,但很重要,
| VER_ID | SCHEMA_VERSION | VERSION_COMMENT |
|---|---|---|
| ID主鍵 | Hive版本 | 版本說明 |
| 1 | 1.2.1 | Set by MetaStore |
??如果該表出現問題,根本進入不了Hive-Cli,比如該表不存在,當啟動Hive-Cli時候,就會報錯”Table ‘hive.version’ doesn’t exist”,
2、Hive資料庫相關的元資料表(DBS、DATABASE_PARAMS)
?? DBS:該表存盤Hive中所有資料庫的基本資訊,欄位如下:
| 表欄位 | 說明 | 示例資料 |
|---|---|---|
| DB_ID | 資料庫ID | 1 |
| DESC | 資料庫描述 | Default Hive database |
| DB_LOCATION_URI | 資料HDFS路徑 | hdfs://193.168.100.100:9000/test-warehouse |
| NAME | 資料庫名 | default |
| OWNER_NAME | 資料庫所有者用戶名 | public |
| OWNER_TYPE | 所有者角色 | ROLE |
??DATABASE_PARAMS:該表存盤資料庫的相關引數,在CREATE DATABASE時候用WITH
??DBPROPERTIES(property_name=property_value, …)指定的引數,
| 表欄位 | 說明 | 示例資料 |
|---|---|---|
| DB_ID | 資料庫ID | 1 |
| PARAM_KEY | 引數名 | createdby |
| PARAM_VALUE | 引數值 | root |
??DBS和DATABASE_PARAMS這兩張表通過DB_ID欄位關聯,
3、Hive表和視圖相關的元資料表
??主要有TBLS、TABLE_PARAMS、TBL_PRIVS,這三張表通過TBL_ID關聯,
?? TBLS:該表中存盤Hive表,視圖,索引表的基本資訊,
| 表欄位 | 說明 | 示例資料 |
|---|---|---|
| TBL_ID | 表ID | 21 |
| CREATE_TIME | 創建時間 | 1645194826 |
| DB_ID | 資料庫ID | 1 |
| LAST_ACCESS_TIME | 上次訪問時間 | 1645194826 |
| OWNER | 所有者 | root |
| RETENTION | 保留欄位 | 0 |
| SD_ID | 序列化配置資訊 | 41,對應SDS表中的SD_ID |
| TBL_NAME | 表名 | ex_detail_ufdr_30streaming |
| TBL_TYPE | 表型別 | EXTERNAL_TABLE |
| VIEW_EXPANDED_TEXT | 視圖的詳細HQL陳述句 | |
| VIEW_ORIGINAL_TEXT | 視圖的原始HQL陳述句 |
??TABLE_PARAMS:該表存盤表/視圖的屬性資訊
| 表欄位 | 說明 | 示例資料 |
|---|---|---|
| TBL_ID | 表ID | 1 |
| PARAM_KEY | 屬性名 | totalSize,numRows,EXTERNAL |
| PARAM_VALUE | 屬性值 | 970107336、21231028、TRUE |
?? TBL_PRIVS:該表存盤表/視圖的授權資訊
| 表欄位 | 說明 | 示例資料 |
|---|---|---|
| TBL_GRANT_ID | 授權ID | 1 |
| CREATE_TIME | 授權時間 | 1645194826 |
| GRANT_OPTION | 授與權限 | 0 |
| GRANTOR | 授權執行用戶 | root |
| GRANTOR_TYPE | 授權者型別 | USER |
| PRINCIPAL_NAME | 被授權用戶 | username |
| PRINCIPAL_TYPE | 被授權用戶型別 | USER |
| TBL_PRIV | 權限 | Select、Alter |
| TBL_ID | 表ID | 21,對應TBLS表的TBL_ID |
4、Hive檔案存盤資訊相關的元資料表
??主要涉及SDS、SD_PARAMS、SERDES、SERDE_PARAMS,由于HDFS支持的檔案格式很多,而建Hive表時候也可以指定各種檔案格式,Hive在將HQL決議成MapReduce時候,需要知道去哪里,使用哪種格式去讀寫HDFS檔案,而這些資訊就保存在這幾張表中,
??SDS:該表保存檔案存盤的基本資訊,如INPUT_FORMAT、OUTPUT_FORMAT、是否壓縮等,TBLS表中的SD_ID與該表關聯,可以獲取Hive表的存盤資訊,
| 表欄位 | 說明 | 示例資料 |
|---|---|---|
| SD_ID | 存盤資訊ID | 41 |
| CD_ID | 欄位資訊ID | 21,對應CDS表 |
| INPUT_FORMAT | 檔案輸入格式 | org.apache.hadoop.mapred.TextInputFormat |
| IS_COMPRESSED | 是否壓縮 | 0 |
| IS_STOREDASSUBDIRECTORIES | 是否以子目錄存盤 | 0 |
| LOCATION | HDFS路徑 | username |
| PRINCIPAL_TYPE | 被授權用戶型別 | hdfs://193.168.100.100:9000/detail_ufdr_streaming_test |
| NUM_BUCKETS | 分桶數量 | 0 |
| OUTPUT_FORMAT | 檔案輸出格式 | org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat |
| SERDE_ID | 序列化類ID | 41,對應SERDES表 |
??SD_PARAMS: 該表存盤Hive存盤的屬性資訊,在創建表時候使用STORED BY ‘storage.handler.class.name’ [WITH SERDEPROPERTIES (…)指定,
| 表欄位 | 說明 | 示例資料 |
|---|---|---|
| SD_ID | 存盤配置ID | 41 |
| PARAM_KEY | 存盤屬性名 | |
| PARAM_VALUE | 存盤屬性值 |
??SERDES:該表存盤序列化使用的類資訊
| 表欄位 | 說明 | 示例資料 |
|---|---|---|
| SERDE_ID | 序列化類配置ID | 41 |
| NAME | 序列化類別名 | NULL |
| SLIB | 序列化類 | org.apache.hadoop.hive.serde2.lazy.LazySimpleSerDe |
??SERDE_PARAMS:該表存盤序列化的一些屬性、格式資訊,比如:行、列分隔符
| 表欄位 | 說明 | 示例資料 |
|---|---|---|
| SERDE_ID | 序列化類配置ID | 41 |
| PARAM_KEY | 屬性名 | field.delim |
| PARAM_VALUE | 屬性值 | I |
5、Hive表欄位相關的元資料表
??要涉及COLUMNS_V2
??COLUMNS_V2:該表存盤表對應的欄位資訊
| 表欄位 | 說明 | 示例資料 |
|---|---|---|
| CD_ID | 欄位資訊ID | 21 |
| COMMENT | 欄位注釋 | NULL |
| COLUMN_NAME | 欄位名 | air_port_duration |
| TYPE_NAME | 欄位型別 | bigint |
| INTEGER_IDX | 欄位順序 | 119 |
6、Hive表分磁區相關的元資料表
??主要涉及PARTITIONS、PARTITION_KEYS、PARTITION_KEY_VALS、PARTITION_PARAMS
PARTITIONS:該表存盤表磁區的基本資訊
| 表欄位 | 說明 | 示例資料 |
|---|---|---|
| PART_ID | 磁區ID | 21 |
| CREATE_TIME | 磁區創建時間 | 1645194826 |
| LAST_ACCESS_TIME | 最后一次訪問時間 | 0 |
| PART_NAME | 磁區名 | hour=15/last_msisdn=0 |
| SD_ID | 磁區存盤ID | 43 |
| TBL_ID | 表ID | 22 |
| LINK_TARGET_ID | 鏈接模板ID | NULL |
??PARTITION_KEYS:該表存盤磁區的欄位資訊
| 表欄位 | 說明 | 示例資料 |
|---|---|---|
| TBL_ID | 表ID | 22 |
| PKEY_COMMENT | 磁區欄位說明 | NULL |
| PKEY_NAME | 磁區欄位名 | hour |
| PKEY_TYPE | 磁區欄位型別 | int |
| INTEGER_IDX | 磁區欄位順序ID | 0 |
??PARTITION_KEY_VALS:該表存盤磁區欄位值
| 表欄位 | 說明 | 示例資料 |
|---|---|---|
| PART_ID | 磁區ID | 21 |
| PART_KEY_VAL | 磁區欄位值 | 0 |
| INTEGER_IDX | 磁區欄位值順序 | 1 |
??PARTITION_PARAMS:該表存盤磁區的屬性資訊
| 表欄位 | 說明 | 示例資料 |
|---|---|---|
| PART_ID | 磁區ID | 21 |
| PARAM_KEY | 磁區屬性名 | 0 |
| INTEGER_IDX | 磁區欄位值順序 | numFiles,numRows |
| PARAM_VALUE | 磁區屬性值 | 1,502195 |
6、其他不常用的元資料表
- DB_PRIVS,資料庫權限資訊表,通過GRANT陳述句對資料庫授權后,將會在這里存盤,
- IDXS,索引表,存盤Hive索引相關的元資料,
- INDEX_PARAMS,索引相關的屬性資訊,
- TBL_COL_STATS,表欄位的統計資訊,使用ANALYZE陳述句對表欄位分析后記錄在這里,
- TBL_COL_PRIVS,表欄位的授權資訊,
- PART_PRIVS,磁區的授權資訊,
- PART_COL_PRIVS, 磁區欄位的權限資訊,
- PART_COL_STATS,磁區欄位的統計資訊,
- FUNCS,用戶注冊的函式資訊,
- FUNC_RU,用戶注冊函式的資源資訊,
到底啦!關注靚仔學習更多的大資料知識 (?′?`?)
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/428575.html
標籤:其他
下一篇:一篇決議論文MapReduce
