天天看點

【Hive】基于hadoop的大資料倉庫

     Hive被稱為是”Hadoop的資料倉庫架構”。 Hive定義了類SQL查詢語言Hive SQL,學習成本低。可通過類SQL語句快速實作簡單的MR統計 ,可被用來執行專門的海量資料 集查詢和資料彙總,以及執行海量資料分析,十分适合資料倉庫的統計分析 。

Hive與關系型資料庫

     Hive的指令行接口和操作關系型資料庫相像,但是和關系資料庫依然有很大的差別:

●Hive和關系資料庫存儲檔案的系統不同,Hive基于Hadoop的hdfs,關系資料庫則是伺服器本地的檔案系統;

●Hive使用的計算模型是Mapreduce,而關系資料庫則是自身的計算模型;

●關系資料庫都是為實時查詢的業務進行設計的,而Hive則是為海量資料做資料挖掘設計的,實時性很差;實時性的差別導緻Hive的應用場景和關系資料庫有很大的不同;

●Hive不适合用于小資料集分析和互動式查詢;

●Hive很容易擴充自己的存儲能力和計算能力,這個是繼承Hadoop的,而關系資料庫在這個方面要比資料庫差很多。

●Hive并不支援事件或行級資料更新

Hive的架構

     下面列出了hive的主要架構,hive通過用戶端發出資料操縱請求,該請求會被驅動引擎解釋、編譯、優化、執行,在執行的時候,會在關系型資料庫中取得請求操縱資料在hdfs上的映射關系。通過映射關系向hdfs拿資料進行操縱,hive儲存的是資料及資料操縱的映射的關系,本身不裝資料。

     Hive 的核心是驅動引擎,驅動引擎由四部分組成:

• 解釋器:解釋器的作用是将HiveSQL 語句轉換為文法樹(AST)。

• 編譯器:編譯器是将文法樹編譯為邏輯執行計劃。

• 優化器:優化器是對邏輯執行計劃進行優化。

• 執行器:執行器是調用底層的計算架構執行邏輯執行計劃。

     SQL轉化為MapReduce,Hive是将SQL 轉化為MapReduce任務的編譯過程分為六個階段:

•AntIr定義SQL的文法規則,完成SQL詞法,文法解析,将SQl轉化為抽象文法樹AST Tree

•周遊AST Tree,抽象出查詢的基本組成單元QueryBlock

•周遊QueryBlock,翻譯為執行操作樹OperatorTree

•邏輯層優化器進行OperatorTree變換,合并不必要的ReduceSinkOperator,減少shuffle資料量

•周遊OperatorTree,翻譯為MapReduce任務

• 實體層優化器進行MapReduce任務的變換, 生成最終的執行計劃: .

     Hive 的底層存儲:

• Hive的資料是存儲在HDFS上的。

• Hive中的庫和表可以看做是對HDFS上資料做的一個映射。

     Hive的中繼資料存儲:

• Hive的中繼資料是一般是存儲在MySQL這種關系型資料庫上的,Hive和MySQL之 間通過MetaStore服務互動。

• Hive支援的關系資料庫有derby和mysql

• 中繼資料對于Hive十分重要,是以Hive支援把metastore服務獨立出來,安裝到 遠端的伺服器叢集裡,進而解耦Hive服務和metastore服務,保證Hive運作的 健壯性;

     Hive支援多種用戶端:

• 指令行用戶端(CLI):采用互動視窗,用hive指令行和Hive進行通信。

• HiveServer2用戶端:用Thrift協定進行通信,提供安全的遠端通路以及ODBC 和JDBC連接配接去通路Hive。

• HWI用戶端:Hive用戶端提供了一種通過網頁的方式通路hive所提供的服務。 這個接口對應Hive的hwi元件(hive web interface),使用前要啟動hwi服務。但 是hwi比較粗糙,一般不用。

• HUE用戶端:通過Web頁面來和Hive進行互動。

• Ambari

• WebHCat: http://hadoop/templeton/v1/resource. curl -s ‘http://localhost:50111/templeton/v1/ddl/database?user.name=hduser’

     執行引擎:

• MapReduce

• Tez(運作在Hadoop上的預設執行引擎)

• Spark

Hive 實戰

    隻要掌握sql語句,hive簡單易學。這裡列舉了部分HiveSql語句,可以看到和SQL非常相似。但我們依舊要注意hive與關系型資料的不同之處,比如内部表和外部表的概念,hive的優化設計等。

筆者自己總結的hivesql語句全集:

https://pan.baidu.com/s/1xdVuEElT2P_sgn9ZekeGpg 提取碼:d6d5

-- 檢視已有資料庫
-- show databases;

-- 檢視資料庫屬性
-- desc database test_databases;

-- 調用資料庫
-- use test_database;

-- 檢視資料庫下的表
-- show tables;
-- show tables in test_database;

-- 删除資料表
-- drop table test_table;

-- 删除内容,保留表結構
--truncate table table_name;

-- 删除資料庫
-- drop database test_database;
-- 級聯删除資料庫
-- drop database test_database cascade;

-- 建立内部表
-- create table test(id int , name string ) row format delimited fields terminated by '\t';
-- 内部表容易損壞hdfs檔案,使用要謹慎
-- 建立外部表
-- create external table  test(id int , name string ) row format delimited fields terminated by '\t' location '/home/path';
-- 建立外部表不需要加載資料,直接映射hdfs檔案系統資料
-- 注意将本地資料上傳至hdfs檔案系統下

-- 建立外部表 + 添加預設設定
-- create external table pricewatch(
        recordid string,
        jclb string,
        jcmc string,
        bqjg decimal(10,3),
        sqjg decimal(10,3),
        tb decimal(10,3),
        hb decimal(10,3)
) 
row format delimited 
fields terminated by ',' 
location '/hive_data/p'
TBLPROPERTIES ('serialization.null.format' = '','skip.header.line.count' = '1');

-- 檢視完整建表語句
-- show create table pricewatch;

-- 檢視表結構
-- desc test;
-- desc formatted test;

-- 修改表結構 
-- 改表名
-- alter table test rename to test_new;
-- 添加新列
-- alter table test add columns(new_col int);
-- 添加備注
-- alter table test add columns(new_col_1 int comment'This is ... ...');
-- 更改表結構
-- alter table test replace columns(id int ,foo string);

-- 加載資料
-- 本地檔案
-- load data local inpath '/home/path' into table test;
-- load data local inpath '/home/path' overwrite into table test;
-- 加載hdfs檔案
-- load data inpath '/home/path' into table test;
-- load data inpath '/home/path' overwrite into table test; '' 

-- 本地檔案上傳到hdfs檔案
-- hdfs dfs -put /data.txt /hive_data/new_data/

-- 檢視資料倉庫
-- hdfs dfs -ls /urs/hive/warehouse/cdadb.db/
           

推薦資料:

HIVE—索引、分區和分桶的差別 - 小醜進場 - 部落格園  https://www.cnblogs.com/LiCheng-/p/7420888.html
Hive性能優化 - 哥不是小蘿莉 - 部落格園  https://www.cnblogs.com/smartloli/p/4356660.html
Hive學習之路 (二十一)Hive 優化政策  http://www.360doc.com/content/19/0214/21/55348351_814983723.shtml
           

繼續閱讀