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具有如下特性:
此架構包括Language API、Schema RDD、Data Sources三層。
(1)功能
Hive:
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:
適用場景:
適用場景:
適用場景:
(1)cloudera公司2014年做的性能基准對比測試,原文鏈接:http://blog.cloudera.com/blog/2014/09/new-benchmarks-for-sql-on-hadoop-impala-1-4-widens-the-performance-gap/
先看一下測試結果:
配置:
所有測試都運行在一個完全相同的21節點集群上,每個節點只配有64G內存。之所以內存不配大,就是為了消除人們對於Impala只有在非常大的內存上才有好性能的錯誤認識:
單用戶如下圖所示。
多用戶如下圖所示。
查詢吞吐率如下圖所示。
Impala本身就是cloudera公司的主打產品,因此只聽其一面之詞未免有失偏頗,下面就再看一個SAS公司的測試。
(2)SAS2013年做的Impala和Hive的對比測試
硬件:
數據模型如下圖所示。
各表的數據量如下圖所示。
PAGE_CLICK_FLAT表使用Compressed Sequence文件格式,大小124.59 GB。
查詢:
使用了以下5條查詢語句
結果:
Hive與Impala查詢時間對比如下圖所示。
可以看到,查詢1、2、4Impala比Hive快的多,而查詢3、5Impala卻比Hive慢很多。這個測試可能更客觀一些,而且也從側面說明了一個問題,不要輕信廠商宣傳的數據,還是要根據自己的實際測試情況得出結論。
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模型提供容錯和擴展性。

此架構包括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數據庫。
(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作業
- 支持Parquet、Avro、Text、JSON、ORC等多種文件格式
- 支持存儲在HDFS、HBase、Amazon S3上的數據操作
- 支持snappy、lzo、gzip等典型的Hadoop壓縮編碼方式
- 通過使用“shared secret”提供安全認證
- 支持Akka和HTTP協議的SSL加密
- 保存事件日志
- 支持UDF
- 支持並發查詢和作業的內存分配管理(可以指定RDD只存內存中、或只存磁盤上、或內存和磁盤都存)
- 支持把數據緩存在內存中
- 支持嵌套結構
- 支持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
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查詢。
適用場景:
- 從Hive數據倉庫中抽取部分數據,使用Spark進行分析。
- 商業智能和交互式查詢。
適用場景:
- 秒級的響應時間
- OLAP
- 交互式查詢
- ETL
- UDAF
(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條查詢語句
結果:
Hive與Impala查詢時間對比如下圖所示。

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