Hive、Spark SQL、Impala比較


        Hive、Spark SQL和Impala三種分布式SQL查詢引擎都是SQL-on-Hadoop解決方案,但又各有特點。前面已經討論了Hive和Impala,本節先介紹一下SparkSQL,然后從功能、架構、使用場景幾個角度比較這三款產品的異同,最后附上分別由cloudera公司和SAS公司出示的關於這三款產品的性能對比報告。
Spark SQL簡介
        Spark SQL是Spark的一個處理結構化數據的程序模塊。與其它基本的Spark RDD API不同,Spark SQL提供的接口包含更多關於數據和計算的結構信息,Spark SQL會利用這些額外信息執行優化。可以通過SQL和數據集API與Spark SQL交互,但無論使用何種語言或API向Spark SQL發出請求,其內部都使用相同的執行引擎,這種統一性方便開發者在不同的API間進行切換。
        Spark SQL具有如下特性:
  • 集成——將SQL查詢與Spark程序無縫集成。Spark SQL可以將結構化數據作為Spark的RDD(Resilient Distributed Datasets,彈性分布式數據集)進行查詢,並整合了Scala、Java、Python、R等語言的API。這種集成可以使開發者只需運行SQL查詢就能完成復雜的分析算法。
  • 統一數據訪問——通過Schema-RDDs為高效處理結構化數據而提供的單一接口,Spark SQL可以從Hive表、parquet或JSON文件等多種數據源查詢數據,也可以向這些數據源裝載數據。
  • 與Hive兼容——已有數據倉庫上的Hive查詢無需修改即可運行。Spark SQL復用Hive前端和元數據存儲,與已存的Hive數據、查詢和UDFs完全兼容。
  • 標准的連接層——使用JDBC或ODBC連接。Spark SQL提供標准的JDBC、ODBC連接方式。
  • 可擴展性——交互式查詢與批處理查詢使用相同的執行引擎。Spark SQL利用RDD模型提供容錯和擴展性。
        Spark SQL架構如下圖所示。

        此架構包括Language API、Schema RDD、Data Sources三層。
  • Language API——Spark SQL與多種語言兼容,並提供這些語言的API。
  • Schema RDD——Schema RDD是存放列Row對象的RDD,每個Row對象代表一行記錄。Schema RDD還包含記錄的結構信息(即數據字段),它可以利用結構信息高效地存儲數據。Schema RDD支持SQL查詢操作。
  • Data Sources——一般Spark的數據源是文本文件或Avro文件,而Spark SQL的數據源卻有所不同。其數據源可能是Parquet文件、JSON文檔、Hive表或Cassandra數據庫。
2. Hive、Spark SQL、Impala比較
(1)功能
        Hive:
  • 是簡化數據抽取、轉換、裝載的工具
  • 提供一種機制,給不同格式的數據加上結構
  • 可以直接訪問HDFS上存儲的文件,也可以訪問HBase的數據
  • 通過MapReduce執行查詢
  • Hive定義了一種叫做HiveQL的簡單的類SQL查詢語言,用戶只要熟悉SQL,就可以使用它查詢數據。同時,HiveQL語言也允許熟悉MapReduce計算框架的程序員添加定制的mapper和reducer插件,執行該語言內建功能不支持的復雜分析。
  • 用戶可以定義自己的標量函數(UDF)、聚合函數(UDAF)和表函數(UDTF)
  • 支持索引壓縮和位圖索引
  • 支持文本、RCFile、HBase、ORC等多種文件格式或存儲類型
  • 使用RDBMS存儲元數據,大大減少了查詢執行時語義檢查所需的時間
  • 支持DEFLATE、BWT或snappy等算法操作Hadoop生態系統內存儲的數據
  • 大量內建的日期、數字、字符串、聚合、分析函數,並且支持UDF擴展內建函數。
  • HiveQL隱式轉換成MapReduce或Spark作業
        Spark SQL:
  • 支持Parquet、Avro、Text、JSON、ORC等多種文件格式
  • 支持存儲在HDFS、HBase、Amazon S3上的數據操作
  • 支持snappy、lzo、gzip等典型的Hadoop壓縮編碼方式
  • 通過使用“shared secret”提供安全認證
  • 支持Akka和HTTP協議的SSL加密
  • 保存事件日志
  • 支持UDF
  • 支持並發查詢和作業的內存分配管理(可以指定RDD只存內存中、或只存磁盤上、或內存和磁盤都存)
  • 支持把數據緩存在內存中
  • 支持嵌套結構
        Impala:
  • 支持Parquet、Avro、Text、RCFile、SequenceFile等多種文件格式
  • 支持存儲在HDFS、HBase、Amazon S3上的數據操作
  • 支持多種壓縮編碼方式:Snappy(有效平衡壓縮率和解壓縮速度)、Gzip(最高壓縮率的歸檔數據壓縮)、Deflate(不支持文本文件)、Bzip2、LZO(只支持文本文件)
  • 支持UDF和UDAF
  • 自動以最有效的順序進行表連接
  • 允許定義查詢的優先級排隊策略
  • 支持多用戶並發查詢
  • 支持數據緩存
  • 提供計算統計信息(COMPUTE STATS)
  • 提供窗口函數(聚合 OVER PARTITION, RANK, LEAD, LAG, NTILE等等)以支持高級分析功能
  • 支持使用磁盤進行連接和聚合,當操作使用的內存溢出時轉為磁盤操作
  • 允許在where子句中使用子查詢
  • 允許增量統計——只在新數據或改變的數據上執行統計計算
  • 支持maps、structs、arrays上的復雜嵌套查詢
  • 可以使用impala插入或更新HBase
(2)架構
        Hive:
        構建在Hadoop之上,查詢管理分布式存儲上的大數據集的數據倉庫組件。底層使用MapReduce計算框架,Hive查詢被轉化為MapReduce代碼並執行。生產環境建議使用RDBMS存儲元數據。支持JDBC、ODBC、CLI等連接方式。

        Spark SQL:
        底層使用Spark計算框架,提供有向無環圖,比MapReduce更靈活。Spark SQL以Schema RDD為核心,模糊了RDD與關系表之間的界線。Schema RDD是一個由Row對象組成的RDD,附帶包含每列數據類型的結構信息。Spark SQL復用Hive的元數據存儲。支持JDBC、ODBC、CLI等連接方式,並提供多種語言的API。

        Impala:
        底層采用MPP技術,支持快速交互式SQL查詢。與Hive共享元數據存儲。Impalad是核心進程,負責接收查詢請求並向多個數據節點分發任務。statestored進程負責監控所有Impalad進程,並向集群中的節點報告各個Impalad進程的狀態。catalogd進程負責廣播通知元數據的最新信息。

(3)場景
        Hive:
        適用場景:
  • 周期性轉換大量數據,例如:每天晚上導入OLTP數據並轉換為星型模式;每小時批量轉換數據等。
  • 整合遺留的數據格式,例如:將CSV數據轉換為Avro;將一個用戶自定義的內部格式轉換為Parquet等。
        不適用場景:
  • 商業智能,例如:與Tableau結合進行數據探查;與Micro Strategy一個出報表等。
  • 交互式查詢,例如:OLAP查詢。
        Spark SQL:
        適用場景:
  • 從Hive數據倉庫中抽取部分數據,使用Spark進行分析。
        不適用場景:
  • 商業智能和交互式查詢。
        Impala:
        適用場景:
  • 秒級的響應時間
  • OLAP
  • 交互式查詢
        不適用場景:
  • ETL
  • UDAF
3. Hive、SparkSQL、Impala性能對比
(1)cloudera公司2014年做的性能基准對比測試,原文鏈接:http://blog.cloudera.com/blog/2014/09/new-benchmarks-for-sql-on-hadoop-impala-1-4-widens-the-performance-gap/
        先看一下測試結果:
  • 對於單用戶查詢,Impala比其它方案最多快13倍,平均快6.7倍。
  • 對於多用戶查詢,差距進一步拉大:Impala比其它方案最多快27.4倍,平均快18倍。
        下面看看這個測試是怎么做的。
        配置:
        所有測試都運行在一個完全相同的21節點集群上,每個節點只配有64G內存。之所以內存不配大,就是為了消除人們對於Impala只有在非常大的內存上才有好性能的錯誤認識:
  • 雙物理CPU,每個12核,Intel Xeon CPU E5-2630L 0 at 2.00GHz
  • 12個磁盤驅動器,每個磁盤932G,1個用作OS,其它用作HDFS
  • 每節點64G內存
        對比產品:
  • Impala 1.4.0
  • Hive-on-Tez 0.13
  • Spark SQL 1.1
  • Presto 0.74
        查詢:
  • 21個節點上的數據量為15T
  • 測試場景取自TPC-DS,一個開放的決策支持基准(包括交互式、報表、分析式查詢)
  • 由於除Impala外,其它引擎都沒有基於成本的優化器,本測試使用的查詢都使用SQL-92標准的連接
  • 采用統一的Snappy壓縮編碼方式,各個引擎使用各自最優的文件格式,Impala和Spark SQL使用Parquet,Hive-on-Tez使用ORC,Presto使用RCFile。
  • 對每種引擎多次運行和調優
        結果:
        單用戶如下圖所示。

        多用戶如下圖所示。

        查詢吞吐率如下圖所示。

        Impala本身就是cloudera公司的主打產品,因此只聽其一面之詞未免有失偏頗,下面就再看一個SAS公司的測試。

(2)SAS2013年做的Impala和Hive的對比測試
        硬件:
  • Dell M1000e server rack
  • 10 Dell M610 blades
  • Juniper EX4500 10 GbE switch
        刀片服務器配置
  • Intel Xeon X5667 3.07GHz processor
  • Dell PERC H700 Integrated RAID controller
  • Disk size: 543 GB
  • FreeBSD iSCSI Initiator driver
  • HP P2000 G3 iSCSI dual controller
  • Memory: 94.4 GB
        軟件:
  • Linux 2.6.32
  • Apache Hadoop 2.0.0
  • Apache Hive 0.10.0
  • Impala 1.0
  • Apache MapReduce 0.20.2
        數據:
        數據模型如下圖所示。

        各表的數據量如下圖所示。

        PAGE_CLICK_FLAT表使用Compressed Sequence文件格式,大小124.59 GB。
        查詢:
        使用了以下5條查詢語句
[sql]  view plain  copy
 
  在CODE上查看代碼片 派生到我的代碼片
  1. -- What are the most visited top-level directories on the customer support website for a given week and year?  
  2. select top_directory, count(*) as unique_visits     
  3.   from (select distinct visitor_id, split(requested_file, '[\\/]')[1] as top_directory  
  4.           from page_click_flat  
  5.          where domain_nm = 'support.sas.com'   
  6.            and flash_enabled='1'   
  7.            and weekofyear(detail_tm) = 48   
  8.            and year(detail_tm) = 2012  
  9.        ) directory_summary  
  10.  group by top_directory  
  11.  order by unique_visits;  
  12.   
  13. -- What are the most visited pages that are referred from a Google search for a given month?  
  14. select domain_nm, requested_file, count(*) as unique_visitors, month  
  15.   from (select distinct domain_nm, requested_file, visitor_id, month(detail_tm) as month  
  16.           from page_click_flat  
  17.          where domain_nm = 'support.sas.com'   
  18.            and referrer_domain_nm = 'www.google.com'  
  19.        ) visits_pp_ph_summary  
  20.  group by domain_nm, requested_file, month  
  21.  order by domain_nm, requested_file, unique_visitors descmonth asc;  
  22.   
  23. -- What are the most common search terms used on the customer support website for a given year?  
  24. select query_string_txt, count(*) as count  
  25.   from page_click_flat  
  26.  where query_string_txt <> ''   
  27.    and domain_nm='support.sas.com'   
  28.    and year(detail_tm) = '2012'  
  29.  group by query_string_txt  
  30.  order by count desc;  
  31.   
  32. -- What is the total number of visitors per page using the Safari browser?  
  33. select domain_nm, requested_file, count(*) as unique_visitors  
  34.   from (select distinct domain_nm, requested_file, visitor_id  
  35.           from page_click_flat  
  36.          where domain_nm='support.sas.com'   
  37.            and browser_nm like '%Safari%'   
  38.            and weekofyear(detail_tm) = 48   
  39.            and year(detail_tm) = 2012  
  40.        ) uv_summary  
  41.  group by domain_nm, requested_file  
  42.  order by unique_visitors desc;  
  43.   
  44. -- How many visitors spend more than 10 seconds viewing each page for a given week and year?  
  45. select domain_nm, requested_file, count(*) as unique_visits  
  46.   from (select distinct domain_nm, requested_file, visitor_id  
  47.           from page_click_flat  
  48.          where domain_nm='support.sas.com'   
  49.            and weekofyear(detail_tm) = 48   
  50.            and year(detail_tm) = 2012   
  51.            and seconds_spent_on_page_cnt > 10;  
  52.        ) visits_summary  
  53.  group by domain_nm, requested_file  
  54.  order by unique_visits desc;  
        結果:
        Hive與Impala查詢時間對比如下圖所示。

        可以看到,查詢1、2、4Impala比Hive快的多,而查詢3、5Impala卻比Hive慢很多。這個測試可能更客觀一些,而且也從側面說明了一個問題,不要輕信廠商宣傳的數據,還是要根據自己的實際測試情況得出結論。


免責聲明!

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



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