HAWQ取代传统数仓实践(一)——为什么选择HAWQ
生活随笔
收集整理的這篇文章主要介紹了
HAWQ取代传统数仓实践(一)——为什么选择HAWQ
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
為了跟上所謂“大數(shù)據(jù)”技術(shù)的腳步,從兩年前開始著手實踐各種SQL-on-Hadoop技術(shù),從最初的Hive,到SparkSQL,再到Impala,進行了一系列ETL、CDC、多維數(shù)據(jù)倉庫、OLAP的實驗。作為一名從業(yè)20年以上的DBA,從數(shù)據(jù)庫的角度看,我的總體感覺是這些技術(shù)與傳統(tǒng)的DBMS相比,功能不完善,性能差距很大,甚至很難找到一個可行的、相對完備的Hadoop數(shù)據(jù)倉庫解決方案。這使我在實際應用中使用這些產(chǎn)品的時候總是感到顧此失彼、捉襟見肘。也可能是我做數(shù)據(jù)庫的時間太長了,只會用錘子,所以拿什么都跟釘子比。
? ? ? ? 然而,在去年12月舉辦的BDTC大會上聽到常雷博士介紹HAWQ項目時,立即引起了我的興趣。從常博士的演講中得知,HAWQ支持事務、性能相對于其它SQL-on-Hadoop產(chǎn)品高很多。更為關鍵的是HAWQ與SQL的兼容性非常好,甚至支持存儲過程,這是我以往所接觸過的產(chǎn)品中從未有過的。對于傳統(tǒng)數(shù)據(jù)庫的開發(fā)人員或DBA,使用HAWQ轉(zhuǎn)向大數(shù)據(jù)平臺的成本應該是很低的。于是當時就決定今年要系統(tǒng)研究一下HAWQ,也許它正是我所需要的。
? ? ? ? 但是Hive的缺點也很明顯——速度太慢。隨著技術(shù)的不斷進步,Hive的執(zhí)行引擎也從最初的MapReduce一種,發(fā)展出Hive on Spark、Hive on Tez等。尤其是運行在Tez框架上的Hive,其性能有了長足改進。即便如此,Hive的速度還是比較適合后臺批處理應用場景,而不適合交互式即席查詢和聯(lián)機分析。
? ? ? ? 為了解決MapReduce的性能問題,Spark使用RDD作為分布式程序的工作集合,它提供一種分布式共享內(nèi)存的受限形式。在分布式共享內(nèi)存系統(tǒng)中,應用可以向全局地址空間的任意位置進行讀寫操作,而RDD是只讀的,對其只能進行創(chuàng)建、轉(zhuǎn)化和求值等操作。這種內(nèi)存操作大大提高了計算速度。
? ? ? ? 開發(fā)Spark的初衷是用于機器學習系統(tǒng)的培訓算法,而不是SQL查詢。Spark宣稱其應用的延遲可以比MapReduce降低幾個數(shù)量級,但是我們的實際使用中,在20TB的數(shù)據(jù)集合上做SQL查詢也要10分鐘左右出結(jié)果,這個速度縱然是比Hive快了3倍,但顯然不能支撐交互查詢和OLAP應用。Spark還有一個問題是需要占用大量內(nèi)存,當內(nèi)存不足時,容易出現(xiàn)OOM錯誤。
? ? ? ? Impala的最大亮點在于它的執(zhí)行速度。官方宣稱大多數(shù)情況下它能在幾秒或幾分鐘內(nèi)返回查詢結(jié)果,而相同的Hive查詢通常需要幾十分鐘甚至幾小時完成,因此Impala適合對Hadoop文件系統(tǒng)上的數(shù)據(jù)進行分析式查詢。Impala缺省使用Parquet文件格式,這種列式存儲對于典型數(shù)據(jù)倉庫場景下的大查詢是較為高效的。
? ? ? ? Impala的問題主要體現(xiàn)在功能上的欠缺。如不支持update、delete操作,不支持Date數(shù)據(jù)類型,不支持XML和JSON相關函數(shù),不支持covar_pop、covar_samp、corr、percentile、 percentile_approx、histogram_numeric、collect_set等聚合函數(shù),不支持rollup、cube、grouping set等操作,不支持數(shù)據(jù)抽樣(Sampling),不支持ORC文件格式等等。其中分組聚合、取中位數(shù)等是數(shù)據(jù)分析中的常用操作,當前的Impala存在如此多的局限,使它在易用性上大打折扣,在實際使用時要格外注意。
? ? ? ? HAWQ從代碼級別上可以說是數(shù)據(jù)存儲在HDFS上的PostgreSQL數(shù)據(jù)庫,100%符合ANSI SQL規(guī)范并且支持SQL 92、99、2003。它支持內(nèi)連接、外連接、全連接、笛卡爾連接、相關子查詢等所有表連接方式,支持并集、交集、差集等集合操作,并支持遞歸查詢。作為一個數(shù)據(jù)庫系統(tǒng),提供這些功能很好理解。
(2)豐富的函數(shù)
? ? ? ? 除了包含諸多字符串、數(shù)字、日期時間、類型轉(zhuǎn)換等常規(guī)標量函數(shù)以外,HAWQ還包含豐富的窗口函數(shù)和高級聚合函數(shù),這些函數(shù)經(jīng)常被用于分析型數(shù)據(jù)查詢。窗口函數(shù)包括cume_dist()、dense_rank()、first_value(expr)、lag(expr [,offset] [,default])、last_valueexpr、lead(expr [,offset] [,default])、ntile(expr)、percent_rank()、rank()、row_number()等。高級聚合函數(shù)包括MEDIAN (expr)、PERCENTILE_CONT (expr) WITHIN GROUP (ORDER BY expr [DESC/ASC])、PERCENTILE_DISC (expr) WITHIN GROUP (ORDER BY expr [DESC/ASC])、sum(array[])、pivot_sum (label[], label, expr)等。具體的函數(shù)說明參見 Using Functions and Operators。
(3)TPC-DS合規(guī)性
? ? ? ? TPC-DS針對具有各種操作要求和復雜性的查詢定義了99個模板,例如點對點、報告、迭代、OLAP、數(shù)據(jù)挖掘等。成熟的基于Hadoop的SQL系統(tǒng)需要支持和正確執(zhí)行多數(shù)此類查詢,以解決各種不同分析工作場景和使用案例中的問題。圖1所示的基準測試是通過TPC-DS中的99個模板生成的111個查詢來執(zhí)行的。圖中顯示了4種基于SQL-on-Hadoop常見系統(tǒng)的合規(guī)等級,綠色和藍色分別表示:每個系統(tǒng)可以優(yōu)化的查詢個數(shù);可以完成執(zhí)行并返回查詢結(jié)果的查詢個數(shù)。從圖中可以看到,HAWQ完成了所有查詢,表現(xiàn)遠優(yōu)于其它系統(tǒng)。HAWQ雖然沒有提供update、delete等DML語句,但通過其強大的數(shù)據(jù)查詢功能,可以輕松實現(xiàn)多維數(shù)據(jù)倉庫中漸變維(SCD)的處理需求。
圖1
(4)分區(qū)表
? ? ? ? 與傳統(tǒng)DBMS系統(tǒng)類似,HAWQ也支持多種分區(qū)方法及多級分區(qū),如List分區(qū)和Range分區(qū)。分區(qū)表對查詢性能和數(shù)據(jù)可維護性都有很大幫助。
(5)過程化編程
? ? ? ? HAWQ支持內(nèi)建的SQL、C、Java、Perl、pgSQL、Python、R等多種語言的過程化編程。參見 Using Languages and Extensions in HAWQ。
(6)原生Hadoop文件格式支持
? ? ? ? HAWQ支持HDFS上的AVRO、Parquet、平面文本等多種文件格式,支持snappy、gzip、quicklz、RLE等多種數(shù)據(jù)壓縮方法。與Hive不同,HAWQ實現(xiàn)了schema-on-write(寫時模式)數(shù)據(jù)驗證處理,不符合表定義或存儲格式的數(shù)據(jù)是不允許進入到表中的,這點與DBMS系統(tǒng)保持一致。
(7)外部數(shù)據(jù)整合
? ? ? ? HAWQ通過名為Pivotal eXtension Framework(PXF)的模塊提供訪問HDFS上的Json文件、Hive、HBase等外部數(shù)據(jù)的能力。而且PXF還允許用戶自定義:PXF提供框架API以便用戶為其自有數(shù)據(jù)堆棧開發(fā)新的連接器,增強了數(shù)據(jù)引擎的松耦合程度。
? ? ? ? 除了用于訪問HDFS文件的PXF協(xié)議,HAWQ還提供了gpfdist文件服務器,它利用HAWQ系統(tǒng)并行讀寫本地文件系統(tǒng)中的文件。
? ? ? ? HAWQ采用基于成本的SQL查詢優(yōu)化器,該查詢優(yōu)化器以針對 大數(shù)據(jù)模塊化查詢優(yōu)化器架構(gòu)的研究成果為基礎而設計。
? ? ? ? HAWQ能夠制定執(zhí)行計劃,可優(yōu)化利用Hadoop 集群的資源,還可以針對特定環(huán)境,如軟件版本、硬件類型、CPU、IOPS指標等信息配置優(yōu)化器。
? ? ? ? HAWQ已經(jīng)驗證,能夠快速為涉及超過50個關聯(lián)表的高性能查詢找到理想的查詢計劃。因此可以將HAWQ用于大量數(shù)據(jù)分析的傳統(tǒng)企業(yè)數(shù)據(jù)倉庫工作負載要求。
(2)Dynamic pipelining
? ? ? ? SQL-on-Hadoop的主要設計目標是在Hadoop上執(zhí)行SQL連接時最大程度地降低數(shù)據(jù)傳輸?shù)拈_銷。HAWQ采用Dynamic pipelining來解決這一關鍵要求,使基于HDFS的數(shù)據(jù)適用于交互式查詢。Dynamic pipelining是一種并行數(shù)據(jù)流框架,結(jié)合了以下獨特的技術(shù):
(3)與Impala的性能比較
? ? ? ? 圖2是HAWQ提供的TPC-DS性能比較圖,可以看到HAWQ平均比Impala快4.55倍。
圖2
(4)與Hive的性能比較
? ? ? ? 圖3是我在自己的實驗環(huán)境中所做的,HAWQ與Hive查詢性能對比圖。對于不同查詢,HAWQ比Hive快4-50倍。測試具體的軟硬件環(huán)境、數(shù)據(jù)模型、數(shù)據(jù)量、查詢語句等參見 HAWQ與Hive查詢性能對比測試。
圖3
? ? ? ? HAWQ是我所使用過的SQL-on-Hadoop解決方案中唯一支持SQL過程化編程的,Hive、SparkSQL、Impala都沒有此功能。對于習慣了編寫存儲過程的DBA來說,這無疑大大提高了HAWQ的易用性。HAWQ的UDF提供以下特性:
圖4
圖5
? ? ? ? 然而,在去年12月舉辦的BDTC大會上聽到常雷博士介紹HAWQ項目時,立即引起了我的興趣。從常博士的演講中得知,HAWQ支持事務、性能相對于其它SQL-on-Hadoop產(chǎn)品高很多。更為關鍵的是HAWQ與SQL的兼容性非常好,甚至支持存儲過程,這是我以往所接觸過的產(chǎn)品中從未有過的。對于傳統(tǒng)數(shù)據(jù)庫的開發(fā)人員或DBA,使用HAWQ轉(zhuǎn)向大數(shù)據(jù)平臺的成本應該是很低的。于是當時就決定今年要系統(tǒng)研究一下HAWQ,也許它正是我所需要的。
一、常用SQL-on-Hadoop產(chǎn)品的不足
1. Hive
? ? ? ? Hive是最老牌的一款Hadoop數(shù)據(jù)倉庫產(chǎn)品,更夠部署在所有Hadoop發(fā)行版本之上。它在MapReduce計算框架上封裝一個SQL語義層,極大簡化了MR程序的開發(fā)。直到現(xiàn)在,Hive以其穩(wěn)定性依然贏得大量用戶。? ? ? ? 但是Hive的缺點也很明顯——速度太慢。隨著技術(shù)的不斷進步,Hive的執(zhí)行引擎也從最初的MapReduce一種,發(fā)展出Hive on Spark、Hive on Tez等。尤其是運行在Tez框架上的Hive,其性能有了長足改進。即便如此,Hive的速度還是比較適合后臺批處理應用場景,而不適合交互式即席查詢和聯(lián)機分析。
2. SparkSQL
? ? ? ? SparkSQL是Hadoop中另一個著名的SQL引擎,正如名字所表示的,它以Spark作為底層計算框架,實際上是一個Scala程序語言的子集。Spark基本的數(shù)據(jù)結(jié)構(gòu)是RDD,一個分布于集群節(jié)點的只讀數(shù)據(jù)集合。傳統(tǒng)的MapReduce框架強制在分布式編程中使用一種特定的線性數(shù)據(jù)流處理方式。MapReduce程序從磁盤讀取輸入數(shù)據(jù),把數(shù)據(jù)分解成鍵/值對,經(jīng)過混洗、排序、歸并等數(shù)據(jù)處理后產(chǎn)生輸出,并將最終結(jié)果保存在磁盤。Map階段和Reduce階段的結(jié)果均要寫磁盤,這大大降低了系統(tǒng)性能。也是由于這個原因,MapReduce大都被用于執(zhí)行批處理任務。? ? ? ? 為了解決MapReduce的性能問題,Spark使用RDD作為分布式程序的工作集合,它提供一種分布式共享內(nèi)存的受限形式。在分布式共享內(nèi)存系統(tǒng)中,應用可以向全局地址空間的任意位置進行讀寫操作,而RDD是只讀的,對其只能進行創(chuàng)建、轉(zhuǎn)化和求值等操作。這種內(nèi)存操作大大提高了計算速度。
? ? ? ? 開發(fā)Spark的初衷是用于機器學習系統(tǒng)的培訓算法,而不是SQL查詢。Spark宣稱其應用的延遲可以比MapReduce降低幾個數(shù)量級,但是我們的實際使用中,在20TB的數(shù)據(jù)集合上做SQL查詢也要10分鐘左右出結(jié)果,這個速度縱然是比Hive快了3倍,但顯然不能支撐交互查詢和OLAP應用。Spark還有一個問題是需要占用大量內(nèi)存,當內(nèi)存不足時,容易出現(xiàn)OOM錯誤。
3. Impala
? ? ? ? Impala是一個運行在Hadoop之上的大規(guī)模并行處理(MPP)查詢引擎,提供對Hadoop集群數(shù)據(jù)的高性能、低延遲的SQL查詢,使用HDFS作為底層存儲。對查詢的快速響應使交互式查詢和對分析查詢的調(diào)優(yōu)成為可能,而這些在針對處理長時間批處理作業(yè)的SQL-on-Hadoop傳統(tǒng)技術(shù)上是難以完成的。? ? ? ? Impala的最大亮點在于它的執(zhí)行速度。官方宣稱大多數(shù)情況下它能在幾秒或幾分鐘內(nèi)返回查詢結(jié)果,而相同的Hive查詢通常需要幾十分鐘甚至幾小時完成,因此Impala適合對Hadoop文件系統(tǒng)上的數(shù)據(jù)進行分析式查詢。Impala缺省使用Parquet文件格式,這種列式存儲對于典型數(shù)據(jù)倉庫場景下的大查詢是較為高效的。
? ? ? ? Impala的問題主要體現(xiàn)在功能上的欠缺。如不支持update、delete操作,不支持Date數(shù)據(jù)類型,不支持XML和JSON相關函數(shù),不支持covar_pop、covar_samp、corr、percentile、 percentile_approx、histogram_numeric、collect_set等聚合函數(shù),不支持rollup、cube、grouping set等操作,不支持數(shù)據(jù)抽樣(Sampling),不支持ORC文件格式等等。其中分組聚合、取中位數(shù)等是數(shù)據(jù)分析中的常用操作,當前的Impala存在如此多的局限,使它在易用性上大打折扣,在實際使用時要格外注意。
二、HAWQ的可行性
? ? ? ? 剛才介紹了幾種SQL-on-Hadoop產(chǎn)品的主要問題,那么重點來了,HAWQ是否有能力取而代之呢?下面從功能與性能兩方面,簡單分析一下使用HAWQ的主要特點。具有了這些特性,使用HAWQ在Hadoop上開發(fā)分析型數(shù)據(jù)倉庫應用是完全可行的。1. 功能
(1)完全兼容SQL標準? ? ? ? HAWQ從代碼級別上可以說是數(shù)據(jù)存儲在HDFS上的PostgreSQL數(shù)據(jù)庫,100%符合ANSI SQL規(guī)范并且支持SQL 92、99、2003。它支持內(nèi)連接、外連接、全連接、笛卡爾連接、相關子查詢等所有表連接方式,支持并集、交集、差集等集合操作,并支持遞歸查詢。作為一個數(shù)據(jù)庫系統(tǒng),提供這些功能很好理解。
(2)豐富的函數(shù)
? ? ? ? 除了包含諸多字符串、數(shù)字、日期時間、類型轉(zhuǎn)換等常規(guī)標量函數(shù)以外,HAWQ還包含豐富的窗口函數(shù)和高級聚合函數(shù),這些函數(shù)經(jīng)常被用于分析型數(shù)據(jù)查詢。窗口函數(shù)包括cume_dist()、dense_rank()、first_value(expr)、lag(expr [,offset] [,default])、last_valueexpr、lead(expr [,offset] [,default])、ntile(expr)、percent_rank()、rank()、row_number()等。高級聚合函數(shù)包括MEDIAN (expr)、PERCENTILE_CONT (expr) WITHIN GROUP (ORDER BY expr [DESC/ASC])、PERCENTILE_DISC (expr) WITHIN GROUP (ORDER BY expr [DESC/ASC])、sum(array[])、pivot_sum (label[], label, expr)等。具體的函數(shù)說明參見 Using Functions and Operators。
(3)TPC-DS合規(guī)性
? ? ? ? TPC-DS針對具有各種操作要求和復雜性的查詢定義了99個模板,例如點對點、報告、迭代、OLAP、數(shù)據(jù)挖掘等。成熟的基于Hadoop的SQL系統(tǒng)需要支持和正確執(zhí)行多數(shù)此類查詢,以解決各種不同分析工作場景和使用案例中的問題。圖1所示的基準測試是通過TPC-DS中的99個模板生成的111個查詢來執(zhí)行的。圖中顯示了4種基于SQL-on-Hadoop常見系統(tǒng)的合規(guī)等級,綠色和藍色分別表示:每個系統(tǒng)可以優(yōu)化的查詢個數(shù);可以完成執(zhí)行并返回查詢結(jié)果的查詢個數(shù)。從圖中可以看到,HAWQ完成了所有查詢,表現(xiàn)遠優(yōu)于其它系統(tǒng)。HAWQ雖然沒有提供update、delete等DML語句,但通過其強大的數(shù)據(jù)查詢功能,可以輕松實現(xiàn)多維數(shù)據(jù)倉庫中漸變維(SCD)的處理需求。
圖1
(4)分區(qū)表
? ? ? ? 與傳統(tǒng)DBMS系統(tǒng)類似,HAWQ也支持多種分區(qū)方法及多級分區(qū),如List分區(qū)和Range分區(qū)。分區(qū)表對查詢性能和數(shù)據(jù)可維護性都有很大幫助。
(5)過程化編程
? ? ? ? HAWQ支持內(nèi)建的SQL、C、Java、Perl、pgSQL、Python、R等多種語言的過程化編程。參見 Using Languages and Extensions in HAWQ。
(6)原生Hadoop文件格式支持
? ? ? ? HAWQ支持HDFS上的AVRO、Parquet、平面文本等多種文件格式,支持snappy、gzip、quicklz、RLE等多種數(shù)據(jù)壓縮方法。與Hive不同,HAWQ實現(xiàn)了schema-on-write(寫時模式)數(shù)據(jù)驗證處理,不符合表定義或存儲格式的數(shù)據(jù)是不允許進入到表中的,這點與DBMS系統(tǒng)保持一致。
(7)外部數(shù)據(jù)整合
? ? ? ? HAWQ通過名為Pivotal eXtension Framework(PXF)的模塊提供訪問HDFS上的Json文件、Hive、HBase等外部數(shù)據(jù)的能力。而且PXF還允許用戶自定義:PXF提供框架API以便用戶為其自有數(shù)據(jù)堆棧開發(fā)新的連接器,增強了數(shù)據(jù)引擎的松耦合程度。
? ? ? ? 除了用于訪問HDFS文件的PXF協(xié)議,HAWQ還提供了gpfdist文件服務器,它利用HAWQ系統(tǒng)并行讀寫本地文件系統(tǒng)中的文件。
2. 性能
(1)基于成本的SQL查詢優(yōu)化器? ? ? ? HAWQ采用基于成本的SQL查詢優(yōu)化器,該查詢優(yōu)化器以針對 大數(shù)據(jù)模塊化查詢優(yōu)化器架構(gòu)的研究成果為基礎而設計。
? ? ? ? HAWQ能夠制定執(zhí)行計劃,可優(yōu)化利用Hadoop 集群的資源,還可以針對特定環(huán)境,如軟件版本、硬件類型、CPU、IOPS指標等信息配置優(yōu)化器。
? ? ? ? HAWQ已經(jīng)驗證,能夠快速為涉及超過50個關聯(lián)表的高性能查詢找到理想的查詢計劃。因此可以將HAWQ用于大量數(shù)據(jù)分析的傳統(tǒng)企業(yè)數(shù)據(jù)倉庫工作負載要求。
(2)Dynamic pipelining
? ? ? ? SQL-on-Hadoop的主要設計目標是在Hadoop上執(zhí)行SQL連接時最大程度地降低數(shù)據(jù)傳輸?shù)拈_銷。HAWQ采用Dynamic pipelining來解決這一關鍵要求,使基于HDFS的數(shù)據(jù)適用于交互式查詢。Dynamic pipelining是一種并行數(shù)據(jù)流框架,結(jié)合了以下獨特的技術(shù):
- 適應性高速UDP互聯(lián)技術(shù)。
- 操作運行時執(zhí)行環(huán)境。這是所有SQL查詢的基礎,并針對大數(shù)據(jù)工作負載進行了調(diào)優(yōu)。
- 運行時資源管理確保查詢的完整性。
- 無縫數(shù)據(jù)分配機制,將經(jīng)常用于特定查詢的部分數(shù)據(jù)集集中起來。
(3)與Impala的性能比較
? ? ? ? 圖2是HAWQ提供的TPC-DS性能比較圖,可以看到HAWQ平均比Impala快4.55倍。
圖2
(4)與Hive的性能比較
? ? ? ? 圖3是我在自己的實驗環(huán)境中所做的,HAWQ與Hive查詢性能對比圖。對于不同查詢,HAWQ比Hive快4-50倍。測試具體的軟硬件環(huán)境、數(shù)據(jù)模型、數(shù)據(jù)量、查詢語句等參見 HAWQ與Hive查詢性能對比測試。
圖3
三、適合DBA的解決方案
? ? ? ? 當初HAWQ最吸引我的地方是它支持SQL過程化編程。這是通過用戶自定義函數(shù)(user-defined functions,UDF)實現(xiàn)的。編寫UDF的語言可以是SQL、C、Java、Perl、Python、R和pgSQL。數(shù)據(jù)庫開發(fā)人員常用的自然是SQL和pgSQL,PL/pgSQL函數(shù)可以為SQL語言增加控制結(jié)構(gòu),執(zhí)行復雜計算任務,并繼承所有PostgreSQL的數(shù)據(jù)類型(包括用戶自定義類型)、函數(shù)和操作符。? ? ? ? HAWQ是我所使用過的SQL-on-Hadoop解決方案中唯一支持SQL過程化編程的,Hive、SparkSQL、Impala都沒有此功能。對于習慣了編寫存儲過程的DBA來說,這無疑大大提高了HAWQ的易用性。HAWQ的UDF提供以下特性:
- 給HAWQ內(nèi)部函數(shù)起別名。
- 返回結(jié)果集的表函數(shù)。
- 參數(shù)個數(shù)可變的函數(shù)。
- 多態(tài)數(shù)據(jù)類型。
四、HAWQ系統(tǒng)架構(gòu)
? ? ? ? 圖4是給出了一個典型的HAWQ集群的主要組件。圖5是HAWQ內(nèi)部架構(gòu)圖。關于HAWQ的系統(tǒng)架構(gòu)說明,參見 解密Apache HAWQ ——功能強大的SQL-on-Hadoop引擎。圖4
圖5
總結(jié)
以上是生活随笔為你收集整理的HAWQ取代传统数仓实践(一)——为什么选择HAWQ的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Obj-C 实现设计模式 -- Obse
- 下一篇: urllib2.urlopen超时问题