【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
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章