Hive 簡介
hive是基於Hadoop的一個數據倉庫工具,可以將結構化的數據文件映射爲一張數據庫表,並提供簡單的sql查詢功能,可以將sql語句轉換爲MapReduce任務進行運行。 其優點是學習成本低,可以通過類SQL語句快速實現簡單的MapReduce統計,不必開發專門的MapReduce應用,十分適合數據倉庫的統計分析。
使用Hive的原因
- 操作接口採用類SQL語法,提供快速開發的能力
- 避免了去寫MapReduce,減少開發人員的學習成本
- 擴展功能很方便
Hive的特性
- 可擴展:Hive可以自由的擴展集羣的規模,一般情況下不需要重啓服務
- 延展性:Hive支持用戶自定義函數,用戶可以根據自己的需求來實現自己的函數,就像SQL中的UDF
- 容錯性:良好的容錯性,節點出現問題SQL仍可完成執行,分佈式存儲的優點
容錯性的原因:MapRuduce的整個編配工作由主節點控制,一般每份mapper的輸入數據會同時分發到多個節點形成多分副本,用於事務的失效處理,每個節點必須與主節點通信,表示自己工作正常。如果某節點失效或則工作異常,主節點將重啓該節點或者將該節點移出可用機器池。
注:
- 在任何時候,每個mapper和reducer間都不進行通信,每個節點只處理自己的事務,並且在本地分配的數據集上運算。
Hive與Hadoop的關係
MapRuduce學習要點
- 主節點控制MapReduce 的作業流程
- MapReduce的作業可以分成map任務和reduce任務
- map任務與reduce任務之間不做數據交流
- 在map和reduce階段中間有一個sort或combine階段
- 數據被重複存放在不同的機器上,以防某個機器失效
- mapper和reducer傳輸的數據形式爲key/value對
Hive命令
命令選項
- -i: 初始化SQL文件
- -e ‘quoted query string’: 運行引號內sql查詢語句
- -f filename: 從文件中運行sql語句
- -S: 無聲模式在互動的Shell,只有數據發出
- –h: 查看應用的幫助文檔
- -hiveconf: 設置hive/hadoop的配置變量
HIVE_HOME/bin/hive -S -e ' select count(*) from c02_clickstat_fatdt1' > a.txt
HIVE_HOME/bin/hive -f /home/my/hive-script.sql
Hive中的連接操作
- 只支持相等JOIN。
- 多表連接當使用不同的列進行Join時,會產生多個MapReduce作業。
- 最後的表的數據是從流中讀取,而前面的會在內存中緩存,因此最好把最大的表放在最後。
排序
- order by
跟傳統的 sql 中的 order by 作用相同 ,對查詢的結果做一次全局排序,因此無論有多少個 map,order by 的數據都會放到一個 reducer 中去處理,會消耗很多時間也浪費了資源。
- sort by
在每一個reducer上都會做排序,保證了局部有序,但是不能保證所有數據都有序,可以爲接下來的全局排序提高不少效率(做一次歸併排序)
- distribute by
控制map的輸出在reducer上如何劃分
select mid ,money,name from store distribute by mid sort by mid
mid相同的數據會被送到一個reducer上去處理(distribute by mid),然後在每一個reducer上會按照mid排序(sort by mid)
- cluster by
功能就是distribute by 與 sort by的結合
select mid ,money,name from store cluster by mid
cluster by指定的列只能降序,不能指定asc,desc