大數據(九) - Hive
構建在Hadoop之上的 數據倉庫,數據計算使用MR,數據存儲使用HDFS
因為數據計算使用mapreduce,因此通常用于進行離線數據處理
Hive 定義了一種類 SQL 查詢語言——HQL
類似SQL,但不完全相同
可認為是一個HQL-->MR的語言翻譯器。
簡單,容易上手
有了Hive,還需要自己寫MR程序嗎?
Hive的HQL表達的能力有限
迭代式算法無法表達
有些復雜運算用HQL不易表達
Hive 效率較低
Hive自動生成MapReduce作業,通常不夠智能;
HQL調優困難,粒度較粗
可控性差
Hive各模塊組成
用戶接口
包括 CLI,JDBC/ODBC,WebUI
元數據存儲(metastore)
默認存儲在自帶的數據庫derby中,線上使用時一般換為MySQL
驅動器(Driver)
解釋器、編譯器、優化器、執行器
Hadoop
用 MapReduce 進行計算,用 HDFS 進行存儲
Hive部署架構-實驗環境

Hive部署架構-生產環境

數據模型

Partition 和Bucket
Partition
為減少不必要的暴力數據掃描,可以對表進行分區
為避免產生過多小文件,建議只對離散字段進行分區
Bucket
對于值較多的字段,可將其分成若干個Bucket
可結合Partition與Bucket使用
select語句
不支持having和exist in操作, 可轉換為LEFT SEMI JOIN操作
Join(僅支持等值連接),不支持非等值的連接
Order by和Sort by
Order by
啟動一個reduce task
數據全局有序
速度可能會非常慢
Strict模式下,必須與limit連用
Sort by
可以有多個reduce task
每個Reduce Task內部數據有序,但全局無序
通常與distribute by
Distribute by與Cluster by
distribute by
相當于MapReduce中的paritioner,默認是基于hash實現的;
與sort by連用,可發揮很好的作用
cluster by
當distribute by與sort by(降序)連用,且跟隨的字段 相同時,可使用cluster by簡寫;
用戶自定義函數UDF: 擴展HQL能力的一種方式
HQL支持索引嗎?
HQL執行過程主要是并行地暴力掃描。目前Hive僅支持單表索引,但提供了索引創建接口和調用方法,可由用戶根據需要實現索引結構;
HQL支持update操作嗎?
不支持。Hive底層是HDFS,HDFS僅支持追加操作,不支持隨機寫;
Skew Data處理機制?
指定skew 列:CREATE TABLE list_bucket_single (key STRING, value STRING) SKEWED BY (key) ON (1,5,6);
為skew task分配更多資源(TODO)
將skew task分解成多個task,再合并結果(TODO)
Hive On HBase
使用HQL處理HBase中的數據
比直接通過HBase API存取數據方便;
但性能更低,相當于把在線處理轉為批處理
存在問題
不夠成熟;
不能按時間戳獲取數據,默認總是取最新的數據
Hive的類似系統
Stinger
下一代Hive被稱為“Stinger”,其底層的計算引擎將由Tez替換MapReduce;
Tez相比于MapReduce具有眾多優勢:
提供了多種算子(比如Map、Shuffle等)供用戶使用;
將多個作業合并成一個作業,減少磁盤讀寫IO;
充分利用內存資源。

Shark
Hive On Spark(http://spark.incubator.apache.org/);
Spark是一個內存計算框架,相比于MapReduce,效率更加高效(部分測試表明,速度快100x);
Shark完全兼容Hive,底層計算引擎采用Spark。
Impala
底層計算引擎不再采用MR,而是使用與商用并行關系數據庫類似的分布式查詢引擎;
性能比較


來自: http://blog.csdn.net//matthewei6/article/details/50540172
本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!