1. 程式人生 > >大資料----hive

大資料----hive

1.Hive 是基於 Hadoop 的一個數據倉庫工具,可以將結構化的資料檔案 對映為一張資料庫表,並提供類 SQL 查詢功能。本質是將 SQL 轉換為 MapReduce 程式。主要用途:用來做離線資料分析,比直接用 MapReduce 開發效率更高

2.離線專案在使用hive的前後區別

之前用 Hadoop MapReduce 人員學習成本高,MapReduce 實現複雜查詢邏輯開發難度太大

之後使用hive:操作介面採用類 SQL 語法,提供快速開發的能力避免了去寫 MapReduce,減少開發人員的學習成本功能擴充套件很方便

3.Hive與hadoop

Hive利用HDFS儲存資料,利用MapReduce查詢分析資料。使用hive首先在hdfs上要有結構化資料,然後把結構化資料對映成我們hive的表,hive封裝了sql語法解析器和mr程式模板庫,就可以用hsql生成mr程式操作資料,

4.hive架構:

5.hive元件:使用者介面:包括 CLI、JDBC/ODBC、WebGUI。其中,CLI(command lineinterface)為 shell 命令列;JDBC/ODBC 是 Hive 的 JAVA 實現,與傳統資料庫JDBC 類似;WebGUI 是通過瀏覽器訪問 Hive。

元資料儲存:通常是儲存在關係資料庫如 mysql/derby 中。Hive 將元資料儲存在資料庫中。Hive 中的元資料包括表的名字,表的列和分割槽及其屬性,表的屬性(是否為外部表等),表的資料所在目錄等。

直譯器、編譯器、優化器、執行器:完成 HQL 查詢語句從詞法分析、語法分析、編譯、優化以及查詢計劃的生成。生成的查詢計劃儲存在 HDFS 中,並在隨後有 MapReduce 呼叫執行。

6.Hive安裝與部署

Hive 安裝前需要安裝好 JDK 和 Hadoop。配置好環境變數。

根據元資料儲存的介質不同,分為下面兩個版本,其中 derby 屬於內嵌模式。實際生產環境中則使用 mysql 來進行元資料的儲存

內建derby版:

解壓hive安裝包

bin/hive啟動即可使用

缺點:不同路徑啟動hive,每一個hive擁有一套自己的元資料,無法共享

mysql版:

解壓、修改配置檔案

vi conf/hive-site.xml

配置 Mysql 元資料庫資訊

7.Hive的使用方式

平時自己學習可以用hive互動shell的方式啟動hive:bin/hive

開發模式中是將hive啟動為一個伺服器,來對外提供服務,操作是通過服務來遠端連線的,這種模式的操作是在hive節點伺服器操作bin/hiveserver2命令,這是會一直處於等待模式,執行的程序多了一個RunJar,

然後在我們可操作的節點用beeline去連線,

命令:bin/beeline -u jdbc:hive2://(hive節點:埠號) -n root

或者:bin/beeline

! Connect jdbc:hive2://(hive節點:埠號)

這樣就可以操作了,而且前提我們配置了源資料的儲存資料庫(例如mysql)後,在任何節點操作hive,都是操作同一個源資料的hive,不會出現不同節點不同目錄操作不同hive源資料的情況。

8.Hive與結構化資料的對映

建立hive資料庫與資料表都會在hdfs產生相應的目錄(hive/warehouse)我們建立表的時候欄位應該與結構化資料的列對應上,並且建表時規定分隔符,最後結構化資料複製到相應的目錄(hive/warehouse)就可以完成對映。對映成功以後就可以通過sql來操作分析結構化資料(注意實質底層還是生成了mr程式)。

9.建表語法

CREATE [EXTERNAL] TABLE [IF NOT EXISTS] table_name

[(col_name data_type [COMMENT col_comment], ...)]

[COMMENT table_comment]

[PARTITIONED BY (col_name data_type [COMMENT col_comment], ...)]

[CLUSTERED BY (col_name, col_name, ...)

[SORTED BY (col_name [ASC|DESC], ...)] INTO num_buckets BUCKETS]

[ROW FORMAT row_format]

[STORED AS file_format]

[LOCATION hdfs_path]

    9.1CREATE TABLE 建立一個指定名字的表。如果相同名字的表已經存在,則丟擲異常;使用者可以用  IF NOT EXISTS S 選項來忽略這個異常。

    9.2EXTERNAL關鍵字可以讓使用者建立一個外部表,在建表的同時指定一個指向實際資料的路徑( LOCATION)。Hive 建立內部表時,會將資料移動到資料倉庫指向的路徑;若建立外部表,僅記錄資料所在的路徑,不對資料的位置做任何改變。在刪除表的時候,內部表的元資料和資料會被一起刪除,而外部表只刪除元資料,不刪除資料。

    9.3LIKE 允許使用者複製現有的表結構,但是不復制資料。CREATE [EXTERNAL] TABLE [IF NOT EXISTS] [db_name.]table_name LIKE existing_table;

    9.4ROW FORMAT  DELIMITED

[FIELDS TERMINATED BY char]

[COLLECTION ITEMS TERMINATED BY char]

[MAP KEYS TERMINATED BY char]

[LINES TERMINATED BY char] | SERDE serde_name

[WITH SERDEPROPERTIES

(property_name=property_value, property_name=property_value,...)]

hive 建表的時候預設的分割符是'\001',若在建表的時候沒有指明分隔符,load 檔案的時候檔案的分隔符需要是'\001';若檔案分隔符不是'001',程式不會

報錯,但表查詢的結果會全部為'null';

用 vi 編輯器 Ctrl+v 然後 Ctrl+a 即可輸入'\001' -----------> ^A

SerDe 是 Serialize/Deserilize 的簡稱,目的是用於序列化和反序列化。

Hive 讀取檔案機制:首先呼叫 InputFormat(預設 TextInputFormat),返回一條一條記錄(預設是一行對應一條記錄)。然後呼叫SerDe (預設LazySimpleSerDe)的 Deserializer,將一條記錄切分為各個欄位(預設'\001')。

Hive 寫檔案機制:將 Row 寫入檔案時,主要呼叫 OutputFormat、SerDe 的Seriliazer,順序與讀取相反。

可通過 desc formatted 表名;進行相關資訊檢視。

當我們的資料格式比較特殊的時候,可以自定義 SerDe。

    9.5PARTITIONED BY

在 hive Select 查詢中一般會掃描整個表內容,會消耗很多時間做沒必要的工作。有時候只需要掃描表中關心的一部分資料,因此建表時引入了 partition  分割槽概念。

分割槽表指的是在建立表時指定的 partition 的分割槽空間。一個表可以擁有一個或者多個分割槽,每個分割槽以資料夾的形式單獨存在表文件夾的目錄下。表和列名不區分大小寫。分割槽是以欄位的形式在表結構中存在,通過 describe table 命令可以檢視到欄位存在,但是該欄位不存放實際的資料內容,僅僅是分割槽的表示。

分割槽表是為了房子查詢的時候全表掃描浪費資源與時間。

分割槽表就是在建表hdfs目錄下多了一級或者多級目錄,資料夾名字就是分割槽值。

分割槽欄位在查詢的時候會顯示出來,但是是虛擬出來用於標識檔案的,真實的結構化資料是沒有這個欄位的。並且分割槽欄位一定不與表中欄位重複,一樣會出現問題。

    9.6CLUSTERED BY INTO num_buckets BUCKETS

對於每一個表(table)或者分,Hive 可以進一步組織成桶,也就是說桶是更為細粒度的資料範圍劃分。Hive 也是針對某一列進行桶的組織。Hive 採用對列值雜湊,然後除以桶的個數求餘的方式決定該條記錄存放在哪個桶當中。

預設是不開啟,需要自己手動設定,分成幾桶也是自己設定,分成幾桶底層就劃分幾個reducetask,

分桶的實質是對錶中已經存在的欄位進行劃分,插入語句比較特殊,用insert+select語句。

分桶主要的優點,在多表聯查的時候,join查詢會根據笛卡爾積原則,當資料量大的時候,就會大大的影響效率,分桶之後,相同欄位不同內容分桶就會把這個問題解決

10.Load

我們把結構化資料與表進行對映需要load操作,但是注意如果資料在hdfs上用load是把資料移動到指定的hdfs建表文件夾下,如果是在結構化資料Linux下,我們load操作會複製到指定的hdfs建表文件夾下

但是外部表可以不用移動/複製結構化資料,因為在建立外部表的時候就指定了結構化資料的地址,還不會再刪除表的時候僅僅刪除對應表資料,不會刪除hdfs的檔案,所以在實際開發過程中用外部表的情況更多。

11.Insert

Hive 中 insert 主要是結合 select 查詢語句使用,將查詢結果插入到表中

Insert還可以用來動態分割槽,多重插入,我們的表分割槽也可以是動態的,用一個表查詢的結果做為另一個表分割槽的插入,例如:INSERT OVERWRITE TABLE tablename PARTITION (partcol1[=val1], partcol2[=val2] ...)select_statement FROM from_statement

匯出表資料,insert可用來匯出表的資料到hdfs也可以到出到本地Linux上。

12 hive的自定義函式UDF

Hive自己有一些函式用草操作欄位與資料,我們直接呼叫即可,可網上搜索hive函式,這裡不做說明,那麼有時hive自帶函式不能解決問題的時候就需要我們自定義函式UDF來解決。

自定義函式程式設計流程:

12.1 新建java maven專案,新增依賴,寫一個 java 類,繼承UDF,並重載evaluate方法

12.2 打成 jar 包上傳到伺服器

12.3 將 jar 包新增到 hive 的 classpath 執行命令:hive>add JAR /home/hadoop/udf.jar;

12.4 建立臨時函式與開發好的 java class 關聯

12.5 即可在 hql 中使用自定義的函式