大數據(九) - Hive

jopen 8年前發布 | 14K 次閱讀 分布式/云計算/大數據

構建在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 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!