您好,登錄后才能下訂單哦!
什么是hive:Hive是基于hadoop的一個數據倉庫工具,實質就是一款基于hdfs的MapReduce計算框架,對存儲在HDFS中的數據進行分析和管理。
hive的工作方式:把存放在hive中的數據都抽象成一張二維表格,提供了一個類似于sql語句的操作方式,這些sql語句最終被hive的底層翻譯成為MapReduce程序,最終在hadoop集群上運行,結果也會輸出在hdfs之中。(必須是結構化的數據)。在存儲的時候hive對數據不做校驗,在讀取的時候校驗。
hive的的優點:極大的簡化了分布式的計算程序的編程。使不會分布式編程的,其他工作人員都可以進行海量數據的統計分析。
hive的的缺點:不支持行級別的增刪改操作、hive的查詢延遲很嚴重、hive中不支持事務,主要用于做OLAP(聯機分析處理)。
hive的的適用場景:hive數據倉庫中的數據,主要是存儲,在進行ETL(數據清洗、抽取、轉換、裝載)操作之后的具有結構化的數據。但是數據的存儲的格式沒有特殊要求,可以使普通文件,也可以是溢寫壓縮文件等等。
hive的的與關系型數據庫的對比:
hive的架構中有四個部分組成:
用戶接口:
- CLI(command line interface),shell終端命令行,采用交互式使用hive命令行與hive進行交互,最常用(學習、生成、調試)
- Jdbc/odbc:是hive的基于jdbc操作提供的客戶端,用戶(開發、運維)通過這個鏈接hive server服務
- Web UI:通過瀏覽器訪問hive(基本不用)
Thrift Server:Thrift是facebook開發的一個軟件框架,可以用來進行可擴展且跨語言的服務的開發,hive集成了該服務,能讓不同的編程語言調用hive的接口。
底層四大組件:底層的四大組件完成hql查詢語句從詞法分析,語法分析,編譯,優化,以及生成邏輯執行計劃的生成。生成的邏輯執行計劃存儲在hdfs中,并隨后由MapReduce調用執行。
- 解釋器:解釋器的作用是將hiveSQL語句轉換成抽象語法數
- 編譯器:編譯器是將語法樹編譯成為邏輯執行計劃
- 優化器:優化器是對邏輯執行計劃進行優化
- 執行器:執行時調用底層的運行框架執行邏輯執行計劃
執行流程就是:hiveQL,通過命令或者客戶端提交,經過compiler編譯器,運用metastore中的元數據進行類型檢測和語法分析,生成一個邏輯方案,然后通過的優化處理,產生一個maptask程序。
元數據庫 :就是存儲在hive中的數據的描述信息,通常包括:表的名字、表的列和分區以及其屬性、表的屬性(內部表和外部表),表的數據所在目錄。而hive有兩種元數據的存儲方案:
- Metastore默認存儲在自帶的derby數據庫中。缺點是:不適合多用戶操作,并且數據存儲目錄不固定。數據庫跟著hive的進入目錄走,極度不方便管理。
- Hive和mysql之間通過Metastore服務交互(本地或者遠程)
hive的存儲特點:
- hive中所有的數據都存儲在hdfs中,沒有專門的數據存儲格式,因為hive是讀模式,可支持TezxtFile、SequenceFile(序列化)RCFile(行列結合)或者自定義格式等
- 只需要在創建表的時候,告訴hive數據中的列分隔符和行分隔符,hive就可以解析數據,默認的列分隔符是:(Ctrl + a 不可見字符: \x01),行分隔符是:(\n 換行符)
hive的存儲結構: hive的存儲結構:數據庫、表、視圖、分區和表數據等。數據庫、表、視圖、分區等等都對應hdfs上的一個目錄,表數據對應hdfs對應目錄下的文件。
例:
Hdfs://Hadoop01/user/hive/warehouse/myhive.db/student/student.txt
Hdfs://Hadoop01/user/hive/warehouse:表示hive的數據倉庫
Hdfs://Hadoop01/user/hive/warehouse/myhive.db: hive的一個數據庫
Hdfs://Hadoop01/user/hive/warehouse/myhive.db/student hive中的一個表
Hdfs://Hadoop01/user/hive/warehouse/myhive.db/student/student.txt 數據文件
注意:當我們在創建表的時候,首先會在hdfs上的相應的目錄下生成一個文件,同時在hive的元數據庫中會為這個新建的表生成一條記錄。
hive具體的存儲結構:
- 數據倉庫:在 HDFS 中表現為${hive.metastore.warehouse.dir}目錄下一個文件夾
-表:hive的表分為內部表、外部表、分區表、分桶表,表在hdfs中的表現形式也是目錄,但是不同的表之間的表現形式不同
- 視圖:物化,hive是不會進行物化,相當于給一個sql語句建立了一個快捷方式,保存的是一個視圖中的sql語句。只讀,基于基表創建。
- 數據文件 :表中的真實數據
內部表:又叫管理表,表的創建,和刪除都由hive自己決定。
外部表:表結構上同內部表,但是存儲的數據時自己定義的,外部表在刪除的時候只刪除元數據,原始數據時不能刪除的。
內部表和外部表的區別主要體現在兩個方面:
- 刪除:刪除內部表,刪除元數據和數據;刪除外部表,刪除元數據,保留數據。
- 使用:如果數據的所有處理都在 Hive 中進行,那么傾向于 選擇內部表,但是如果 Hive 和其他工具要針對相同的數據集進行處理,外部表更合適。使用外部表訪問存儲在hdfs上的數據,然后通過hive轉化數據并存儲到內部表中。
分區表: 原來的一個大表存儲的時候分成不同的數據目錄進行存儲。
如果說是單分區表,那么在表的目錄下就只有一級子目錄,如果說是多分區表,那么在表的目錄下有多少分區就有多少級子目錄。不管是單分區表,還是多分區表,在表的目錄下,和非最終分區目錄下是不能之間存儲數據文件的。
例:
單分區表:
Hdfs://Hadoop01/user/hive/warehouse/myhive.db/student/p0
多分區表:
Hdfs://Hadoop01/user/hive/warehouse/myhive.db/student/p0
Hdfs://Hadoop01/user/hive/warehouse/myhive.db/student/p1
Hdfs://Hadoop01/user/hive/warehouse/myhive.db/student/p2
Hdfs://Hadoop01/user/hive/warehouse/myhive.db/student/p1/p11
分桶表: 原理和hashpartitioner 一樣,將hive中的一張表的數據進行歸納分類的時候,歸納分類規則就是hashpartitioner。(需要指定分桶字段,指定分成多少桶)
bucket:在hdfs中表現為同一個表目錄或者分區目錄下根據某個字段的值進行Hash散列之后的多個文件,分桶的表現形式就是一個單獨的文件.
例:
Hdfs://Hadoop01/user/hive/warehouse/myhive.db/student/age>15
Hdfs://Hadoop01/user/hive/warehouse/myhive.db/student/age>20
Hdfs://Hadoop01/user/hive/warehouse/myhive.db/student/age>30
分區表和分桶的區別除了存儲的格式不同外,最主要的是作用:
- 分區表:細化數據管理,縮小mapreduce程序 需要掃描的數據量。
- 分桶表:提高join查詢的效率,在一份數據會被經常用來做連接查詢的時候建立分桶,分桶字段就是連接字段;提高采樣的效率。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。