Hive在騰訊數據倉庫TDW中的應用

jopen 10年前發布 | 80K 次閱讀 Hive 數據挖掘

Hive是Apache基金會下的一個在Hadoop上構建數據倉庫的開源軟件,它支持通過類SQL的HQL語言操作結構化數據。Hive的主要功 能是將類SQL的HQL語言翻譯成MapReduce代碼并在Hadoop上運行。Hive的出現使使用Hadoop做大數據分析變得更簡單,節省了數據 分析人員編譯和調試MapReduce代碼的繁瑣工作。目前,Hive在國內互聯網公司應用很多。TDW作為一個數據倉庫產品,對外主要提供SQL語言接 口。TDW中的SQL解析,主要是基于Hive實現的,在TDW中,Hive作為TDW的查詢引擎(Query Engine,簡稱QE)而存在。如下圖所示:

Hive在騰訊數據倉庫TDW中的應用

用戶通過TDW集成開發環境(IDE)或者PL Client提交SQL給Hive、Hive經過Parser做詞法、語法分析后,經過SemanticAnalyzer做語義分析并生成查詢計劃,這些 查詢計劃以一個無環有向圖(DAG)來表示,圖中的每個節點是一個MapReduce任務。最后通過Executor將這個DAG中的MapReduce 任務按照依賴順序提交給Hadoop執行。Hive具有一些很好的特性,使得在用它構建TDW時,獲得了巨大的方便和成功:

  • Hive實現了基本的SQL功能。這使得使用Hive可以很快搭建一個數據倉庫,并且可以做基本的數據分析。
  • Hive具有良好的擴展性。Hive支持UDF、UDAF,可以擴充SQL函數。另外,Hive支持自定義序列化和反序列化的格式,也就是自定義SerDe,可以方便的進行存儲格式的擴展。
  • Hive代碼具有良好的結構。Hive中代碼中,詞法、語法分析,語義分析,查詢優化,查詢執行,元數據,類型系統等結構清晰,便于進行原理分析,方便進行二次開發。

利用Hive的這些特性,構建TDW獲得了一定程度的成功。然而,構建TDW時所基于的Hive-0.4.1版本本身存在一些問題,在技術上不夠成熟,這些問題嚴重制約了TDW的運營和推廣。這些問題表現在:

  • 數據倉庫功能不完善。缺乏權限管理、過程語言、list/range分區功能、窗口函數、多維分析等功能等——這些功能對于一個數據倉庫產品,是 不可或缺的;并且,騰訊多數業務在其他數據倉庫上大量使用這些功能。要推動業務從其他數據倉庫轉向基于Hive的TDW,這些功能是必須完善的。
  • 使用門檻高。用戶界面簡陋,運行調試麻煩,問題定位困難,查詢計劃不直觀。Hive比起Hadoop直接寫MR任務,雖然已經有很大進步,但是對 比其他成熟的數據倉庫產品,Hive在易用性上的考慮明顯不足。用戶需要在命令行下進行操作,如果SQL運行失敗,常常需要通過Hive日志,甚至是 MapReduce的后臺日志進行問題定位。在查詢計劃的顯示上,Hive的explain結果較為復雜,若通過查詢計劃來調優SQL,則需要操作者具有 較多的Hadoop知識。總體來講,Hive的使用門檻較高,影響數據分析業務的開發效率。
  • 性能差。Hive-0.4.1版本的Hive在查詢優化上較為簡單,有很多SQL翻譯的MR執行效率很低,或者不合理。性能差,不僅浪費了機器資源,也相對影響了產品的口碑。
  • 不夠穩定。Hive-0.4.1版本的Hive在生產環境中經常會出現卡死、元數據損壞、進程異常退出等問題。在實際運營過程中,騰訊遇到Hive大量上述問題,造成服務中斷、報表延遲、計算錯誤等,嚴重影響了TDW的服務質量。

基于以上這些問題,對Hive-0.4.1版本的Hive進行了大量的優化和改造,這些優化和改造主要包括:功能擴充、易用性提升、性能優化、穩定性優化。通過這些優化,最終使基于Hive的TDW成為騰訊內部廣泛使用的一個易用、高效、穩定的大數據處理平臺。

TDW對Hive的優化

A: 功能擴充

開源Hive的功能簡單,甚至可以說比較簡陋,缺乏數據倉庫應該具備的很多功能,在TDW研發和應用階段,功能的缺失曾經使TDW不斷受到業務的挑 戰,這些挑戰一度影響到TDW的應用推廣進度和口碑,因此,騰訊對HIVE進行了大量的功能擴充。在功能擴充上,騰訊以業務使用TDW的需求為主,為 TDW實現了大量Oracle特性。這些特性一方面使TDW功能更強大,另一方面,為TDW的應用推廣、業務遷移做出了巨大貢獻,主要是使業務從 Oracle數據倉庫轉向TDW變得簡單。在功能上,騰訊實現的幾個主要特性有:

1.基于角色的權限管理

騰訊參考MySQL和Oracle的權限管理功能和語法形式,為Hive擴充了基于角色的權限管理功能。這項工作主要分三個方面:

  • 為Hive增加了一些與權限相關的元數據表用來存放角色、權限相關的元數據信息
  • 增加了相關的SQL語法,包括create role、grant、revoke等命令,這些命令能夠實現將權限相關的信息記錄在元數據中。
  • 對原有的Hive SQL解析流程進行改變,在SQL解析時增加相關的權限檢查。解析時可根據元數據中的權限信息,判斷用戶是否有執行此SQL,訪問此庫、表的權限,以達到權限控制的目的。

通過以上三個方面的功能擴充,騰訊完善了TDW權限管理,提高用戶數據存入TDW的安全性,同時方便了TDW管理員的日常工作。

2.兼容MySQL的分區功能

為了滿足用戶的需求,騰訊也實現了MySQL的分區功能。TDW的分區表建表語法與MySQL類似,并且支持list、range兩種分區類型,還 支持子分區功能。這部分修改主要是修改Hive的文法,使它支持MySQL的建分區語法;增加分區相關的元數據表;修改查詢優化部分代碼,使TDW支持 list、range等分區優化;增加add partition、drop partition、truncate partition等命令。

3.窗口函數

窗口函數又稱分析函數,在數據分析中經常使用。TDW在Hive上開發了用戶自定義窗口函數(UDWF)框架和窗口函數算子。通過這個開發,TDW 實現了常見的窗口函數,如lag、lead、row_number、rank等。UDWF框架,參考了Hive原有的UDAF設計,使一個窗口 partition的數據可以在同一個reduce內被處理,窗口函數算子中,進行具體的窗口函數計算。

4.過程語言

TDW使用Python語言作為過程語言框架,使用戶可以用Python控制SQL的執行邏輯。除此之外,TDW還提供了一些公共庫,如打點日志庫 等,方便用戶進行過程語言的開發。除此之外,為了方便用戶將一些Oracle的PL/SQL轉換成TDW的Python過程語言,騰訊與中科院合作研發了 一個將PL/SQL翻譯成TDW Python SQL的轉換工具,可以減小業務遷移的手工工作量,提高遷移效率。

5.多維分析功能

TDW的一些用戶原有的業務使用了較多的cube、rollup功能,為了能讓業務順利高效的遷移到TDW,TDW支持了多維分析功能。TDW的多 維分析功能實現比較簡單,通過對語法分析后產生的抽象語法樹(AST)進行變換,將cube、rollup變換成group by+union all。

其他功能如公用表達式(CTE)、update/delete、入庫數據校驗等功能,TDW已經實現,這里不再贅述。目前,TDW在功能上較為成熟,Oracle的常用功能在TDW一般都有對應的功能,用戶對TDW的目前表現也十分滿意。

B: 易用性提升

開源的Hive在易用性上,考慮欠妥——沒有Windows下的開發環境;HQL語言雖然與SQL語言很接近,卻不一致,語法比較怪異;從其他數據 庫語言轉向HQL門檻較高。這些易用性方面的問題嚴重影響了TDW業務遷移和開發的效率。為此,騰訊在易用性上對Hive進行了如下的改造:

1.TDW集成開發環境

騰訊為TDW開發了Windows下的集成開發環境(TDW IDE),用戶可以在它上面進行過程語言的編輯和調試、SQL的編輯和調試。它支持很多現代集成開發環境都有的易用性特性,比如語法高亮、自動補全、用法提示、進度顯示、代碼格式化、圖形化顯示查詢計劃等。

TDW IDE也是基于開源軟件進行開發,騰訊使用Eclipse提供基本的IDE功能,使用PyDev提供TDW Python過程語言的編輯和調試環境,使用Jython提供Python與Java的粘合、SQL的編輯和調試功能,借鑒了Eclipse上的開源 SQL插件QuantumDB的實現原理。

Hive在騰訊數據倉庫TDW中的應用

Hive在騰訊數據倉庫TDW中的應用

Hive在騰訊數據倉庫TDW中的應用

2.改善SQL語法細節,使它更標準、更易用

騰訊希望TDW的SQL更符合標準,或者更通用,降低用戶的學習成本。為此,騰訊為TDW實現了exists、not like、insert values、select expression without from、show create table、comment on等SQL功能。這些功能都需要對Hive語法分析、語義分析、優化器等方便進行改造實現。

3.提供SQL/MED功能,使TDW方便與PostgreSQL互聯互通

隨著TDW應用的不斷廣泛,TDW與外部數據的交互也越來越多。一些用戶希望在TDW中能夠實時訪問保存在PostgreSQL中的數據配置信息或 者維度表信息。騰訊借鑒了PostgreSQL的外表功能,實現了TDW的SQL/MED功能。用戶可以在TDW中建PostgreSQL的外表,然后在 TDW中像訪問普通表一樣對這些外表進行訪問,包括進行TDW中的表與外表的關聯。這部分主要是修改TDW建表語法,使在建表使可以提供相關的外表信息, 然后將這些信息保存在元數據中。當在TDW中訪問這些外表時,會先去相應的數據庫中讀取數據,再進行TDW的SQL操作。

通過這些改造,TDW易用性顯著提高,業務的遷移和開發也順利了。目前TDW IDE在公司內的用戶數已經接近1500人,他們每天使用TDW IDE進行數據開發工作,數據提取工作等,它已經成為TDW用戶的必備工具。

C: 性能和穩定性優化

開源的Hive在性能和穩定性上面,也有很多問題。隨著TDW業務的不斷增多,這些問題日益凸顯,迫使騰訊必須在性能和穩定性上優化Hive。

在性能上面,Hive原本支持的文本格式,效率比較低,騰訊自己研發了二進制的存儲格式,不但讀寫效率增加,而且直至lzo壓縮。而且內部有自己的 索引,使它隨機讀性能很好。騰訊還為Hive擴充按行split、orderby+limit等優化技術,使它的SQL性能更好。除了這些騰訊原創的 Hive優化,騰訊也會將Hive社區的優化補丁打到TDW中。比如騰訊今年的SQL MR并行優化,就是來自社區的補丁,在生產環境的效果不錯(如下圖和表格所示)。

Hive在騰訊數據倉庫TDW中的應用

Hive在騰訊數據倉庫TDW中的應用

在計算性能方面,騰訊還引入了估值優化,來提升系統的計算效率。騰訊引入了HyperLogLog算法,來代替準確的count distinct,對于那些不需要計算準確值得業務(如計算uv、App獨立用戶數等),可以用來提升計算效率,降低計算成本,下表示各類基數估值算法與 它的內存使用量,精度的比較,來自這篇論文:HyperLogLog: the analysis of a near-optimal cardinality estimation algorithm

Hive在騰訊數據倉庫TDW中的應用

在穩定性方面,開源的Hive有很多潛在問題。TDW對Hive的應用,其規模之大、復雜度之高,在業內是很少見的,因此很多開源的Bug,也只有 騰訊才能遇到。這些bug有的使Hive異常退出、有的使它無法響應、有的式它元數據遭破壞,這些都會影響TDW的正常服務,使TDW不穩定。為了使 Hive穩定運行,騰訊做了大量的穩定性工作,包括:Hive Server容災與負載均衡、大結果集獲取接口優化、元數據接口優化、內存泄漏檢測、服務過載保護(最大連接數限制、SQL長度限制等)、非線程安全容器 (多線程訪問static HashMap)梳理等。通過這些工作,使TDW的不會因為Hive的問題而停止服務,服務質量得到保證。

TDW在穩定性方面的一個很大增強是元數據方面。騰訊重構了Hive的元數據模塊。社區的Hive使用一層ORM(使用JDO接 口,datanucleus的實現)來簡化元數據的訪問API,并且提供靈活的元數據存儲配置。但是這帶來了性能和穩定性上的問題。先實際運營中,騰訊發 現ORM層在擴展性、性能、數據的一致性、出現問題時定位的方便性上,都有問題。在TDW運營初期,元數據量比較小,問題不是那么突出。但是當TDW元數 據到達一定規模時,騰訊經常遇到元數據訪問接口卡住,或者將表的元數據寫臟,或者多個Hive Server的元數據不一致等等。一旦出現元數據問題,修復起來都非常麻煩,需要手工操作元數據DB,風險很大。對業務造成的影響也很大。騰訊最終選擇對 Hive的元數據進行重構,將ORM層去掉,使用JDBC直接訪問元數據DB,效率和透明性大大提升;同時騰訊將元數據分散化,引入global database和segment database。Global database中存放用戶、權限、segment路由信息等,segement database中存放具體的表的元數據信息。通過這種架構,使TDW的元數據可以線性擴展和負載均衡,消除了之前的元數據單點問題。新的元數據架構如圖 所示。

Hive在騰訊數據倉庫TDW中的應用

Hive優化的未來方向

經過過去約三年多時間的Hive優化,TDW已經成為騰訊內部易用、高效、穩定的大數據處理平臺。但是對于Hive的優化工作,騰訊不會停止。隨著TDW在騰訊的普及,以及騰訊數據分析業務的不斷增長,騰訊未來需要在三方面進行長期的優化工作:

  • 查詢計劃優化:TDW的查詢計劃仍然有優化空間。目前TDW的查詢優化算法主要是基于規則的,未來騰訊將引入基于代價的查詢優化算法。這個優化方向難度比較大,但是騰訊會持續去優化。
  • 數據安全:隨著TDW內數據的增多,業務和用戶越來越關心數據的安全,騰訊要對比TDW與傳統DB在安全機制和功能上的差距,為用戶提供更多安全特性。
  • 數據管理功能:TDW核心功能已經基本具備,但是數據管理功能還有欠缺,比如元數據管理、數據生命周期管理、成本管理等,都需要不斷優化。

參考鏈接:

  • http://code.csdn.net/news/2819976
 本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!