天天看點

Hive

hive是基于hadoop的數倉解決方案。簡單來說hive就是在hadoop上接了一個sql接口。将sql翻譯成mapreduce程式去執行,節約成本。

hive架構圖:

Hive
Hive

如圖中所示,hive通過給使用者提供的一系列互動接口,接收到使用者的指令(sql),使用自己的driver,結合中繼資料(metastore),将這些指令翻譯成mapreduce,送出到hadoop中執行,最後,将執行傳回的結果輸出到使用者互動接口。

hive元件包括ui元件、driver元件(complier,optimizer和executor)、metastore元件、cli(command line interface, 指令行接口)、jdbc/odbc、thrift server和hive web interface(hwi)等。

driver元件:核心元件,整個hive的核心,該元件包括complier(編譯)、optimizer(優化器)和executor(執行器),它們的作用是對hive sql語句進行解析、編譯優化,生成執行計劃,然後調用底層的mapreduce計算架構。

metastore元件:中繼資料服務元件,這個元件存儲hive的中繼資料。hive的中繼資料存儲在關系資料庫裡,hive支援的關系資料庫有derby和mysql。預設情況下,hive中繼資料儲存在内嵌的derby資料庫中,隻能允許一個會話連結,隻适合簡單的測試。實際生産中不适用,為了支援多使用者會話,需要一個獨立的中繼資料庫(如mysql),hive内部對mysql提供了很好的支援。

cli:指令行接口。

thrift server:提供jdbc和odbc接入的能力,用來進行可擴充且跨語言 的服務開發。hive內建了該服務,能讓不同的程式設計 語言調用hive的接口。

hive web interface(hwi):hive用戶端提供了一個通過網頁方式通路hive所提供的服務,這個接口對應hive的hwi元件。

在使用過程中,隻需要将hive看做是一個資料庫就行,本身hive也具備了資料庫的很多特性和功能。

hive可以使用hql(hive sql)很友善的完成對海量資料的統計彙總,即席查詢和分析,除了很多内置的函數,還支援開發人員使用其他程式設計語言和腳本語言來自定義函數。

但是,由于hadoop本身是一個批處理,高延遲的計算架構,hive使用hadoop作為執行引擎,自然也就有了批處理,高延遲的特點,在資料量很小的時候,hive執行也需要消耗較長時間來完成,這時候,就顯示不出它與oracle,mysql等傳統資料庫的優勢。hive不能提供資料排序和查詢緩存功能,也不提供線上事務處理、更不提供實時的查詢和記錄級的更新,但它能很好的處理不變的大規模資料集,當然這是 和其根植于hadoop近似線性的可擴充性分不開的。

此外,hive對事物的支援不夠好,原因是hdfs本身就設計為一次寫入,多次讀取的分布式存儲系統,是以,不能使用hive來完成諸如delete、update等線上事務處理的需求。

是以,hive擅長的是非實時的、離線的、對響應及時性要求不高的海量資料批量計算,即席查詢,統計分析。

資料單元:

databases:資料庫。概念等同于關系型資料庫的schema,不多解釋;

tables:表。概念等同于關系型資料庫的表,不多解釋;

partitions:分區。概念類似于關系型資料庫的表分區,沒有那麼多分區類型,隻支援固定分區,将同一組資料存放至一個固定的分區中。

buckets (or clusters):分桶。同一個分區内的資料還可以細分,将相同的key再劃分至一個桶中,這個有點類似于hash分區,隻不過這裡是hash分桶,也有點類似子分區吧。

原始資料類型:

整型

tinyint — 微整型,隻占用1個位元組,隻能存儲0-255的整數。

smallint– 小整型,占用2個位元組,存儲範圍–32768 到 32767。

int– 整型,占用4個位元組,存儲範圍-2147483648到2147483647。

bigint– 長整型,占用8個位元組,存儲範圍-263到263-1。

布爾型

boolean — true/false

浮點型

float– 單精度浮點數。

double– 雙精度浮點數。

字元串型

string– 不設定長度。

複合資料類型:

structs:一組由任意資料類型組成的結構。比如,定義一個字段c的類型為struct {a int; b string},則可以使用a和c.b來擷取其中的元素值;

maps:和java中的map沒什麼差別,就是存儲k-v對的;

arrays:數組;

hivesql:

hive sql是hive使用者使用hive的主要工具。hive sql是類似于ansi sql标準的sql語言,但兩者又不完全相同。hive sql和mysql的sql方言最為接近,但兩者之前也存在顯著差異,比如hive不支援行級資料插入、更新和删除,也不支援事務等。

hive資料庫:hive中的資料庫從本質上來說僅僅是一個目錄或命名空間,但是對于具有很多使用者群組的叢集來說,這個概念非常有用。首先,這樣可以避免表命名沖突;其次,它等同于資料型資料庫在的資料庫概念呢,是一組表或表的邏輯組,非常容易了解。

hive表:hive中的表(table)和關系資料庫中的table在概念上是類似的,每個table在hive在都有一個對應的目錄存儲資料,如果麼有指定表的資料庫,那麼hive會通過{hive_home}/conf/hive-site.xml配置檔案中的hive.metastore.warehouse.dir屬性來使用預設值(一般是 /user/hive/warehouse, 也可以根據實際的情況來修改這個配置),所有的table資料(不包括外部表)都儲存在這個目錄。

hive分為兩類,即内部表和外部表。所謂内部表(managed table)即hive管理的表,hive内部表的管理既包含邏輯以及文法上的,也包含實際實體意義上的,即建立hive内部表時,資料将真實存在于表所在的目錄内,删除内部表時,實體資料和檔案也一并删除。外部表(external table )則不然,其管理僅僅是在邏輯和文法意義上的,即建立表僅僅是指向一個外部目錄而已。同樣,删除時也不實體删除外部目錄,而僅僅是将引用和定義删除。

分區和桶:hive 将表劃分為分區(partition),partition根據分區字段進行。分區可以讓資料的部分查詢變得更快。表或者分區可以進一步被劃分為桶(bucket)。桶通常在原始資料中加入一些額外的結構,這些結構可以用于高效查詢。例如,基于使用者id的分桶可以使用基于使用者的查詢非常快。

分區:假設日志資料中,每條記錄都帶有時間戳。如果根據時間來分區,那麼同一天的資料将被劃分到同一個分區中。針對某一天或某幾天資料的查詢将會變得很高效,因為隻需要掃描對應分區的檔案。分區并不會導緻跨度的的查詢變得低效。

https://www.jianshu.com/p/199cb5b76692

下一篇: HIVE

繼續閱讀