交互式計算引擎REOLAP篇


              交互式計算引擎ROLAP篇

 

摘自:《大數據技術體系詳解:原理、架構與實踐》

 

 

 

一.Impala

    Impala最初由Cloudera公司開發的,其最初設計動機是充分結合傳統數據庫與大數據系統Hadoop的優勢,構造一個全新的,支持SQL與多租戶,並具備良好的靈活性和擴展性的高性能查詢引擎。傳統數據庫與大數據系統Hadoop各有優缺點:
    (1)傳統關系型數據庫對SQL這種最主流的數據分析語言有完好的支持,且支持多租戶,能夠很好對應並發場景,但靈活性和擴展性較差。
    (2)大數據系統Hadoop具備很好的靈活性(支持各種數據存儲格式,各種存儲系統等)和擴展性(數據規模和計算規模均可以線性擴展),但對SQL及並發的支持較弱。
  Cloudera結合傳統數據庫與大數據系統Hadoop各自優點,利用C++語言構造了一個全新的高性能查詢引擎Impala。在Cloudera的測試中,Impala的查詢效率比Hadoop生態系統中的SQL引擎Hive有數量級的提升。從技術角度上來看,Imapla之所以有好的性能,主要有以下幾個方面:
    (1)Impala完全拋棄了MapReduce這個不太適合做SQL查詢的范式,而是像Dremel一樣借鑒了MPP並行數據庫的思想,采用了全服務進程的設計架構,所有計算均在預先啟動的一組服務中進行,可支持更好的並發,同時省略掉不必要的shuffe,sort等開銷。
    (2)Impala采用全內存實現不需要把中間結果寫入磁盤,省略了大量的I/O開銷。
    (3)充分利用本地讀(而非遠程網絡讀),盡可能將數據和計算資源分配在同一台機器,減少網絡開銷。
    (4)用C++實現,做了很多針對底層硬件的優化,例如使用SSE指令。

  Impala官網網站:http://impala.apache.org/

1>.基本架構

    Impala采用了對等式架構,所有角色中間是對等的,沒有主從之分,如下圖所示,Impala主要由三類服務組成,分別為Catalogd,Statestored和Impalad,接下來依次介紹這幾個組件:
    (1)Catalogd
        元信息管理服務,它從hive metastore中同步表信息,並將任何元數據的改變通過catalogd廣播給各個Impala服務。需要注意的是,在一個大數據數據倉庫中,元數據一般很大,不同數據表的訪問頻度不同,為此,Catalogd僅僅載入每張表的概略信息,更為詳細的信息由后台進程從第三方存儲中延遲載入。
    (2)Statestored
        狀態管理服務器。元數據訂閱-發布服務,它是單一實例(存在單點故障問題),將集群元數據傳播到所有Impala進程。MPP數據庫設計的一大挑戰是實現節點見協調和元數據同步,Impala對稱的節點架構要求所有的節點必須都能夠接受並執行查詢,因此所有節點必須有系統目錄結構和最新版本和集群成員關系的當前視圖,而Statestored正式負責以上這些功能,即將所有元數據及其修改同步到各個Impalad。
    (3)Impalad
        同時承擔協調者和執行者雙重角色。首先,對於某一查詢,作為協調者,接受客戶段查詢請求並對其進行分詞,語法分析,生成邏輯查詢計划以及物理查詢計划,之后的各個執行片段(segemet)調度到Impalad上執行;其次,接受從其他Impalad發過來的單個執行片段,利用本地資源(CPU,內存等)處理這些片段,並進一步將查詢結果返回給協調者。Impala一般部署在集群中運行Datanode進程的所有機器上,進而利用數據本地化的特點而不必通過網絡傳輸即可在文件系統中讀取數據庫。
  
  需要注意的是,在內存資源不足時,Impala也支持將中間結果數據寫入磁盤,但需要顯式啟用該功能。

  Impala前端負責將SQL編譯為可之行的查詢計划,它由SQL解析器,基於成本(costbased)的優化器組成。它的查詢編譯階段遵循經典的實現方式:分為查詢解析,語義分析,查詢計划/優化等幾個模塊。最大挑戰啊來自查詢計器,它將執行計划分為兩個階段:單點計划;計划並行和分隔。
      第一階段,將解析樹轉換為單點計划樹,這包括如下內容:HDFS/HBase掃描,hashjoin,cronssjoin,union,hash聚集,sort,top-n和分析評估等。它基於分析評估結果,進行謂詞下推,相關列投影,分區剪枝,設置限制(limit)/偏移並完成一些基於成本的優化比如排序,合並分析窗口函數和join重排序等。
      第二階段,將單個節點的計划轉換分分布式計划,基於目標在與最小化數據移動和最大化本地數據掃描,它通過在計划節點間增加必要的交換實現分布式,通過增加額外的非交換節點最小化網絡間的數據移動,在此階段,生物的物理join策略。Impala支持兩種分布式join方式,表廣播(broadcast)和哈希重分布兩張表數據。

  在Impala中,分布式計划中的聚集函數會被分拆為兩個階段執行。第一節點:針對本地數據進行分組聚合降低數據量,並進行數據重分布;第二階段:進一步匯總之前的局部聚集結果計算處最終結果。

2>.訪問方式 

    Impala定位是為用戶提供一套能與商業智能場景結合的查詢引擎,它與其他查詢引擎類似,支持多種商業標准:通過JDBC/ODBC訪問,通過kerberos或LDAP進行認真,遵循標准SQL的角色授權等。為了更好與Hive Metastore結合,它支持大部分HQL(Hive Query Language)語法,用戶通過CREATE TABLE創建表,並提供數據邏輯模式,指定物理布局(包括數據存儲格式以及數據目錄組織方式),創建后的表可 采用標准SQL查詢。
    Impala支持幾乎所有主流的數據存儲格式,包括文本格式,SequenceFile,RCFile以及Parquet等。但需要注意的是,Impala目前不支持ORCFile(優化的RCFile)。
    下圖展示了在Impala中,不同數據格式(結合不同壓縮算法)對存儲空間占用和運行性能的影響。很明顯,列式存儲格式在存儲空間占用的性能提升方面有明顯優勢。

    Impala支持幾乎所有的SQL-92中的SELECT語法以及SQL-2003中的分析型函數,支持幾乎所有的標准數據類型,包括INTEGER,FLOAT,STRING,CHAR,VARCHAR,TEIMESTAMP和DECIMAL(最高達38精度)。 此外,Impala也支持用戶自定義函數和自定義聚集函數。
    由於Impala是傳統關系型數據庫與大數據系統Hadoop結合的產物,它在一些方面不同於傳統關系型數據庫:
        (1)由於HDFS存儲系統自身的限制,Impala目前不支持面向單行的UPDATA和DELETE操作,而只支持按批插入和刪除:
                    按批插入可使用INSERT INTO ... SELECT ...語法。
                    按批刪除可使用ALTER TABLE DROP PARTITION語法。
        (2)數據加載速度快,運行時類型校驗:
                    往Impala表中加載數據的速度非常快,只需要在存儲層拷貝或移動文件即可,而不會進行任何類型檢查。
                    Impala采用運行時檢查的方式,即SQL執行時動態檢查每行的數據類系否跟表模式匹配。
        (3)不支持事務
                    Impala是面向OLAP(OnLine Analytical Processing)應用場景的,以只讀型的數據分析為主,對OLTP(OnLine Transaction Processing)場景沒有直接支持。

 

二.Presto

    Prosto是Facebook開源的交互式計算引擎,能夠處理TB甚至PB數據量。由於Presto能夠與Hive進行無縫集成,因而以及成為非常主流的OLAP引擎。
    
    Prosto官網網址:https://prestodb.github.io/

1>.基本架構

    如下圖所示,Presto查詢引擎是一個Master-Slave的架構,由一個coordinator服務,一個Discovery Server服務,多個Worker服務組成,它們的職責如下:
    (1)Coordinator
        協調者,接受客戶端查詢請求(SQL)並對其進行詞法分析,語法分析,生成邏輯查詢計划以及物理查詢計划后,將各個任務調度到Worker上執行,並在Worker返回結果后對其進一步匯總。在Prosto集群中,可以同時存在多個Coordinator,以防止單點故障。
    (2)Discovery Server
        服務發現組件,各個Worker啟動時會像Discovery Server注冊,並將狀態信息定期匯報給Discovery Server,這樣,Coordinator可隨時從Discovery Server中獲取活躍的Worker劣幣阿婆。Discovery Server是一個輕量級的服務,通常內嵌Coordinator節點中。
    (3)Worker
        任務執行者,接收來自Coordinator任務,利用多線程方式並行執行,並將結果發送給Coordinator。

2>.訪問方式 

    Presto是插拔式架構,通過連接器(Connector)接入外部數據源。為了分區各個數據源的數據,它在數據庫之上又引入了一層命名空間:catalog,前面提到的Hive,Cassandra和MySQL等在Presto中均一catalog方式存在。不同的catalog中可以又多個數據庫,每個數據庫中進一步可以同時存在多張數據表。
    Presto支持大部分標准SQL語法,包括SELECT,CREATE,DELETE,ALTER,DROP等。
    SELECT其基本語法如下:
      [ WITH with_query [,...]]
      SELECT [ ALL | DISTINCT] select_expr [,...]
      [ FROM from_item [,...]]
      [ WHERE conditon]
      [ GROUP BY [ALL | DOSTINCT] grouping_element [,...]]
      [ ORDER BY expression [ASC | DESC] [,...]]
      [LIMIT [count | ALL]]
      支持五種JOIN操作,包括內鏈接,左外鏈接,右外鏈接,全外鏈接以及笛卡爾積,除此之外,它還支持CUBE,ROLLUP等數據倉庫操作;
   CREATE  :可創建SCHEMA(可容納類似數據表和視圖德國數據庫對象的容器),TABLE,VIEW。 
   DELETE  :刪除數據庫表特定的行,有些connector不支持該操作。
   ALTER   :修改SCHEMA或數據表的元信息,包括重命名SCHEMA或數據表,為數據表增加新列等。
   DROP   :刪除SCHEHMA,數據表或者視圖。
   用戶可通過CLI或JDBC訪問Presto。Presto采用了插件式架構,可支持多種數據源,這使得它可以集成異構數據源,甚至連接(join)不用數據源中的數據。接下里以Hive和MySQL為例,介紹如何將這兩個系統接入Presto。
  
  (1)Presto訪問Hive  
      Hive是Hadoop生態社區中最早的分布式SQL查詢引擎,它並未采用MPP架構,而是將SQL翻譯成MapReduce或者Tez等批處理作業運行在Hadoop集群中,因而數據處理效率並不高。Presto與Hive有完好的支持,它能夠直接讀取Hive只能夠已經存在的表,並使用MPP引擎進行高效處理。
      Hive主要有三個組件組成:
        數據存儲:Hive使用分布式文件系統HDFS或S3存儲數據,並支持包括文本文件,SequenceFile,RCFile,ORCFile以及Parquet等數據格式。
        元數據管理:Hive中記錄數據和表之間映射關系的元數據由Hive Metastore管理,它將這些元數據保存到關系型數據庫中(比如MySQL)。
        查詢語言HQL與分布式計算引擎:Hive中定義了一種類似於SQL的查詢語言HQL,它能將這種語言翻譯成MapReduce或Tez分布式作業,並運行在Hadoop集群中。
      Presto只用到了Hive中的前兩個組件:數據存儲和元數據管理,但並為使用HQL以及查詢引擎,而是采用了自己定義但SQL查詢語言和分布式查詢引擎。
      Hive支持多個Hadoop版本,包括Apache Hadoop 1.x,Apache Hadoop 2.x,CDH4.x以及CDH5.x,以CDH5.x為例,你可以在"/etc/catalog"下創建文件"hive.properties"以配置對應但Hive Connecor,並在該文件中增加以下兩個配置屬性:connector名稱和Hive Metastore地址:
        #connector名稱,如果是Apache Hadoop2.x,則為hive-hadoop2,如果是cloudera CDH 5,則為hive-cdh5
        connector.name=hive-cdh5
        #hive metastore地址
        hive.metasore.uri=thrift://example.net:9083
      如果你有多個Hive實例,可在"etc/catalog/"下創建其他以“.properties”結尾的配置文件,每個配置文件對應一個Connector。
      一旦創建好Connector,重啟Prestor集群才可以啟用它,之后變可以使用CLI或JDBC創建數據表,進而查詢數據。
  (2)Presto訪問MySQL
      Persto內置了MySQL connector,允許用戶通過Presto引擎讀取並分析MySQL數據庫中的數據,甚至連接MySQL與其他數據源(比如Hive)中的數據表。
      用戶可以在“etc/catalog”下創建一個配置文件,比如“mysqltest.properties”,進而將MySQL Connector綁定到名為mysqltest的catalog下,mysqltest.properties內容如下:
        #connector名稱,一般為“mysql”
        connector.name=mysql
        #JDBC地址  
        connector-url=jdbc:mysql://example.net:3306
        #訪問MySQL的用戶名
        connector-user=presto
        #訪問MySQL的密碼
        connector-password=yinzhengjie
      之后便可以使用SQL訪問MySQL:
        #顯示mysqltest中所有的數據庫
        SHOW SCHEMEAS FROM mysqltest;
        #顯示數據庫mysqltest.web下所有的數據表
        SHOW TABLES FROM mysqltest.web;
        SELECT * FROM mysql.web.clicks;

3>.Presto實戰案例

    某公司收集到一批用戶瀏覽網頁分行為數據,以文本格式保存在HDFS上,如何使用Prosto對這些數據進行高效的分析?
    
解決思路:
    在hive中將建一個名為web的SCHEMA,並創建了一個名為web的SCHEMA,並創建一個ORC格式的分區表paga_views,用以存儲用戶瀏覽網頁的行為數據,該表包含了以下五個字段(其中ds和country為分區字段):
      view_time   : 用戶瀏覽網頁的時間。
      user_id    : 用戶ID。
      page_url   : 網頁的URL。
      ds      :用戶瀏覽網頁的日志(精確到天)。
      country    :用戶所在國家。
  為了解決這類問題,可以分成如下圖所示的五個步驟。

    由於Prosto為提供數據加載的語句,所以該步驟需要在Hive中完成(實際上,前三步均可在Hive中完成,但為了演示Presto功能,前兩步也在Presto中完成)。

  (1)創建一張文本格式的分區數據表tmp_page_views:
      CREATE SCHEMA hive.web;
      CREATE TABLE hive.web.tmp_page_views(
        view_time timestamp,
        user_id bigint,
        page_url varchar,
        ds date,
        country varchar
      )
      WITH (
        format = 'TEXTFILE',
        partitioned_by = ARRAY['ds','country']
      )
      通過WITH語句設置表的屬性,包括存儲格式(format)和分區字段(parititioned_by),用戶可通過以下語句查看所有可設置的屬性列表:
      SELECT * FROM system.metadata.table_properties;
  (2)使用HIVE HQL中的LOAD語句,在Hive中將數據倒入數據表tmp_page_views總。
  (3)使用“CREATE TABLE ... AS”語句,創建一個ORC表page_views,它擁有跟"tmp_page_views"一樣的元信息(除數據格式)和數據:
      CREATE TABLE page_views
      WITH (
      format = 'ORC',
        partitioned_by = ARRAY['ds','country'] 
      )
      AS
      SELECT * FROM tmp_page_views;
  (4)使用SQL查詢表中的數據
      SELECT view_time,user_id
        FROM page_views
      WHERE ds = DATA '2016-08-09' AND country = 'US';
  (5)刪除臨時數據表tmp_page_views
      DROP TABLE hive.web.tmp_page_views;  

 

三.Impala與Presto對比

    Imapla與Presto均是為了克服Hive性能地下而提出來的SQL查詢引擎,它們在設計架構和查詢性能優化上做了大量工作。它們兩個擁有很多相同特色,但也各自有特色,它們的異同對比如下表所示。

 

四.博主推薦閱讀

  鏈接一:Impala快速上手教程:https://www.w3cschool.cn/impala/impala_overview.html


免責聲明!

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



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