hive介紹及架構設計


                    hive介紹及架構設計

                                           作者:尹正傑

版權聲明:原創作品,謝絕轉載!否則將追究法律責任。

 

 

  我們知道MapReduce和Spark它們提供了高度抽象的編程接口便於用戶編寫分布式程序,它們具有極好的擴展性和容錯性,能夠處理超大規模的數據集。這些計算引擎提供了面向高級語言(比如Java,Python等)的編程接口,然而,考慮到分布式程序編寫的復雜性,直接使用這些編程接口實現應用系統(比如報表系統)無疑會提高使用門檻,降低開發效率。考慮到SQL仍然是一種非常主流的數據分析語言,開源社區在分布式計算框架基礎山構建了支持SQL的引擎,其中典型的代表是MapReduce之上的Hive以及Spark之上的Spark SQL,這些數據分析引擎通常不支持標准得到SQL,而是對SQL進行了選擇性支持,並進行了適當擴展,其中最主流的數據分析語言為HQL(Hive Query Language)。

  簡而言之,Hive是對非Java,python等編程者對hdfs數據做MapReduce操作。

 

一.概述    

1>.背景

    大數據計算引擎為大規模數據處理提供了解決方案,它們提供了高級編程語言(比如Java,Python等)編程接口,可讓程序員很容易表達計算邏輯。但在大數據領域,僅提供對編程語言的支持是不夠的,這會降低一些數據分析場景(比如報表系統)下的開發效率,也提高了使用門檻。
    為了讓更多人使用這些大數據引擎分析數據,提高系統開發效率,大數據系統引入了對SQL的支持。SQL作為一種主流的數據分析語言,仍廣受數據分析師歡迎,主要原因如下:
        (1)SQL能夠跟現有系統進行很好的集成,現有的有JDBC/ODBC BI系統兼容。
        (2)很多工程師習慣使用SQL。
        (3)相比於MapReduce和Spark等,SQL更容易表達。
    需要注意的是,大數據SQL引擎通常不支持標准SQL。大數據SQL主要是面向數據分析(另外一類是面向事務)的,支持絕大部分標准SQL語法,並進行了適當擴展。
  為了讓大家更高效地使用MapReuce和Spark等計算引擎,開源社區在計算引擎基礎上構建了更高級的SQL引擎,其中典型的代表是Hive和Spark SQL。Hive提供的查詢語言被成為“HQL”(Hive Query Language),該語言的跟標准的SQL語法極為相似,已經掌握SQL的工程師可以很容易學習HQL;Spark SQL提供的查詢語言接近HQL,但在個別語法上稍有不同。

2>SQL On Hadoop 

    如下圖所示,目前構建在Hadoop之上的SQL引擎主要分為兩類,基於計算引擎和基於MPP架構:
    (1)基於計算引擎
        這些SQL引擎是在計算引擎基礎上構建的,其基本原理是將SQL語聚翻譯成分布式應用程序,之后運行在集群中。典型的代表有構建在MapReduce之上的Hive和構建在Spark之上的Spark SQL。這類SQL引擎的特點是具有良好的擴展性和容錯性,能夠應對海量數據。
    (2)基於MPP架構
        這些SQL引擎是基於MPP架構構建的,其基本原理是將SQL翻譯成可分布式執行的任務,采用Volcano風格的計算引擎並處理這些任務,任務之間的數據流動和交換由專門的Exchange運算符完成。典型的代表有Presto和Impala等。這些SQL引擎具有良好的可擴展性,但容錯性較差。

 

 

二.Hive架構

    Hive是構建在分布式計算框架之上的SQL引擎,它重用了Hadoop中的分布式存儲系統HDFS/HBase和分時計算框架MapReduce/Tez/Spark等。Hive是Hadoop生態系統中的重要部分,目前是應用最廣泛的SQL On Hadoop解決方案。

1>.Hive基本架構

    Hive對外提供了三種訪問方式,包括Web UI,CLI(Client Line Interface)和Thrift協議(支持JDBC/ODBC),而在Hive后端,主要包括三個服務組件構成,如下圖所示:
    (1)Driver(驅動器)
        與關系型數據庫的查詢引擎類似,Driver實現了SQL解析,生成邏輯計划,物理計划,查詢優化與執行等,它的輸入是SQL語句,輸出為一系列分布式執行程序(可以為MapReduce,Tez或Spark等)。
    (2)Metastore
        Hive Metastore是管理和存儲元信息的服務,它保存了數據庫的基本信息以及數據表的定義等,為了能夠可靠地保存這些元信息,Hive Metastore一般將它們持久化到關系型數據庫中,默認采用了嵌入式數據庫Derby(數據存放在內存中),用戶可以根據需要啟用其他數據庫,比如MySQL。
    (3)Hadoop
        Hive依賴與Hadoop,包括分布式文件系統HDFS,分布式資源管理系統YARN以及分布式計算引擎MapReduce,Hive中的數據表對應的數據存放在HDFS上,計算資源由YARN分配,而計算任務則來自MapReduce引擎。

    根據訪問方式不同,可將Hvie分成三種部署模式,即嵌入式不模式,本地模式和遠程模式。

    如上圖所示,在嵌入式模式中,Metasotre和數據庫(Derby)兩個進程嵌入到Driver中,當Driver啟動時會同時運行這兩個進程,一般用於測試。

    如上圖所示,在本地模式中,Driver和Metastore運行在本地,而數據庫(比如MySQL)啟動在一個共享節點上。

    如上圖所示,在遠程模式中,Metastore運行在單獨一個節點上,被其他所有服務共享。使用Beeline,JDBC/ODBC,CLI個Thrift等方式訪問Hive時,則采用該的是該模式,這是一種常用於生成環境下的部署模式。

  Hive是Hadoop生態系統中最早的SQL引擎,它的Metastore服務已經被越來越多的SQL引擎所支持,已經成為大數據系統的元信息標准存儲倉庫。比如Spark SQL,Impala和Presto等引擎均可直接讀取並處理Hive Metastore中的數據表,真正實現“一份數據多種引擎”的計算方式。 

2>.Hive查詢引擎

    Hive最初是構建在MapReduce計算引擎之上的,但隨着越來越多的新型計算引擎的出現,Hive也逐步支持其他更高效的DAG計算引擎,包括Tez和Spark等,如下圖所示,用戶可個性化指定每個HQL的執行執行引擎。

    相比於每個MapReduce計算引擎,新型DAG計算引擎采用以下優化機制讓HQL具有更高的執行性能:
        (1)避免借助分布式文件系統交換數據而減少不必要的網絡和磁盤IO。
        (2)將重復使用的數據緩存隊列到內存中以加速讀取效率。
        (3)復用資源直到HQL運行結束(比如在Spark,Executor一旦啟用后不會釋放,直到所有任務運行完成)。

    如上圖所示,在Hive中運行以下HQL,在該HQL中,3個表進行鏈接操作,並按照state唯獨進行交互操作:
      SELECT a.state,COUNT(*),AVERAGE(c.price)
        FROM a
        JOIN b ON (a.id = b.id)
        JOIN c ON (a.itemid = c.itemid)
        GROUP BY a.state
    (1)如果采用MapReduce計算引擎
        該HQL最終被轉換成4個MapReduce作業,它們之間通過分布式文件系統HDFS交換數據,並最終由一個MapReduce作業將結果返回。在該計算過程中,中間結果要被前一個作業寫入HDFS(需要寫三個副本),並由下一個作業從HDFS讀取數據,並進一步處理。

    (2)如果采用類似Tez或Spark的DAG計算引擎
        該HQL最終僅被轉化成1個應用程序(得益於DAG引擎的通用性),該作業HQL中不同算子的數據交換可以直接通過本地磁盤或者網絡進行,因而磁盤的網絡IO開銷較小,性能會更高。

 

三.Spark SQL基本架構

    Spark SQL是構建在分布式計算框架Spark之上的結構化數據處理引擎,它不僅支持類HQL查詢語言,也提供了一套結構化編程接口DataFreame/DataSet。它是一個異構化數據處理引擎,支持多種數據源,包括HDFS(各種文件格式),Hive,關系型數據庫等,用戶可以使用Spark SQL提供的類HQL語言和結構化編程結構處理這些數據源中的數據。

    Spark SQL基本架構如上圖所示,主要由四層構成:
    (1)用戶接口層
        Spark SQL提供了兩套訪問接口:    
          1)類HQL語言
              該語言兼容絕大部分HQL語法,支持CLi,JDBC/ODBC等訪問方式。它可以於Hive無縫集成,直接存取Hive Metastore中的數據庫和數據表。
          2)結構化編程接口DataFrame/DataSet
              眾所周知,SQL表達能力是有限的,對於復雜的數據分析,比如機器學習算法實現,SQL很難勝任。
              為了解決SQL的缺點,Spark SQL引入了一套結構化編程接口 DataFrame/DataSet,基於這套API,用戶可以靈活控制自己的計算邏輯,目前是Spark生態系統中最重要的編程接口,而Spark Steaming,Mlib和graphX等系統均基於這套API實現自己的引擎和編程接口。
    (2)SQL引擎層
        Spark SQL引擎層主要職責是將HQL或DataFrame/DataSet程序編譯成可分布式運行的程序,設計生成邏輯計划,物理計划,查詢優化於執行等。其最重要的組件就是查詢優化器catalyst,確保生成最優化的分布式程序。
    (3)計算引擎層
        SQL引擎層的輸入是HQL或DataFrame/DataSet程序,而輸出則是基於RDD模型的Spark分布式計算程序,這些程序會直接運行在Spark計算引擎層。
    (4)存儲層
        Spark SQL另一個強大之處就是對數據源進行抽象,內置了對大量存儲引擎的支持,包括HDFS(支持各種數據存儲格式Text和Sequence File,列式存儲格式Parquet和ORC等),Hive,各種關系行數據庫等。用戶也可以根據需要將特定數據存儲引擎接入Spark SQL,進而利用其強大而靈活的引擎進行數據分析。

 

四.Spark SQL和Hive對比

    Spark SQL於Hive均支持類SQL語言,能夠很方便地處理海量數據,但它們也有明顯的區別,如下圖所示:

    整體上說,在表達能力和數據源支持方面,Spark SQL更勝一籌,在表達能力方面Spark SQL不僅僅支持SQL,也支持更加靈活的DataFrame與DataSet API,而對數據源支持方面,Spark SQL借助data source API,適合操作多種異構數據源,在查詢引擎支持方面,Hive借助插拔是引擎設計,則此Spark SQL更具靈活性。

 

五.博主推薦閱讀

鏈接一:Hive快速入門篇之Hive環境搭建(https://www.cnblogs.com/yinzhengjie/p/9154324.html 。

鏈接二:Hive快速入門篇之HQL的基礎語法(https://www.cnblogs.com/yinzhengjie/p/9154339.html)。

鏈接三:HQL基本語法及應用案例(https://www.cnblogs.com/yinzhengjie/p/10847527.html)。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM