百度分布式交互查詢平臺——PINGO架構迭代

2021-01-17 CSDN

PINGO是一個由百度大數據部與百度美國研發中心合作而成的分布式交換查詢平臺。在PINGO之前,百度的大數據查詢作業主要由基於Hive的百度QueryEngine去完成。QueryEngine很好的支持著百度的離線計算任務,可是它對交互式的在線計算任務支持並不好。為了更好的支持交互式任務,我們在大約一年前設計了基於SparkSQL與Tachyon的PINGO的雛形。在過去一年中, 通過跟不同業務的結合,PINGO逐漸的演變成一套成熟高效的交互式查詢系統。本文將詳細介紹PINGO的架構迭代過程以及性能評估。



QueryEngine是基於Hive的百度內部的大數據查詢平臺,這套系統在過去幾年中較好的支撐了百度的相關業務。 圖1展示了QueryEngine的架構圖,其服務入口叫做Magi。用戶向Magi提交查詢請求, Magi為這次請求分配一個執行機, 執行機會調用Hive讀取Meta信息並向Hadoop隊列提交任務. 在這一過程中, 用戶需要自行提供計算需要的隊列資源。隨著近幾年對大數據平臺的要求越來越高, 我們在使用QueryEngine過程中也發現了一些問題:首先QueryEngine需要由用戶提供計算資源, 這使得數據倉庫的用戶需要去了解Hadoop以及相關的管理流程, 這增加了用戶使用數據的門檻。 第二, 對於很多小型計算任務而言, MR的任務的起動時間也較長, 往往用戶的計算任務只需要1分鐘, 但是排隊/提交任務就需要超過一分鐘甚至更長的時間。這樣的結果是,QueryEngine雖然很好的支持線下執行時間長的任務,但是對線上的一些交換式查詢任務(要求延時在一到兩分鐘內)確是無能為力。


圖1: Query Engine 的執行流程


為了解決這些問題, 在大約一年前,我們嘗試在離線計算的技術棧上搭建起一套具有在線服務屬性的SQL計算服務 PINGO。如圖2所示: PINGO使用了SparkSQL為主要的執行引擎, 主要是因為Spark具有下面的特點:






圖2: PINGO初版系統架構設計



在過去一年中,PINGO從一個雛形開始,通過跟不同業務的結合,逐漸的演變成一套成熟高效的系統。中間經歷過幾次的架構演變,在本章中,我們將詳細介紹PINGO的迭代過程。


PINGO 1.0


PINGO初版的目標是提升性能,讓其能支持交互式查詢的任務。由於Spark是基於內存的計算引擎,相對於Hive有一定的性能優勢, 所以第一步我們選擇使用Spark SQL。為求簡單,最初的服務是搭建在Spark Standalone集群上的。我們知道, Spark在Standalone模式下是不支持資源伸縮的, 一個Spark Application在啟動的時候會根據配置獲取計算資源。 這時就算一個查詢請求只有一個Task還在運行, 該Application所佔用的所有資源都不能釋放。好在一個Spark Application可以同時運行多個Job, 每個Job都能夠』平分』其所佔用的計算資源。


圖3: PINGO 1.0 系統架構


基於上面的考慮, 如圖3所示,我們利用Spark的Standalone集群搭建了第一版PINGO服務. 我們的主服務節點叫做Operation Manager, 它本身也是一個Spark Driver。所有用戶的請求都會從Magi Service發送到Magi Worker, 再由Magi Worker分配給Operation Manager, 通過Operation Manager在Spark集群上執行。


PINGO 1.1


通過PINGO 1.0, 我們把數據倉庫的計算引擎從Hive/MR轉變成了Spark。 不過, 單純的替換計算引擎, 也許可以把查詢的性能提升1-2倍, 但是並不會使查詢的速度有數量級上的提高. 想要從本質上提高查詢速度, 我們還需要改進存儲。對此我們設計了PINGO 1.1, 加入了以Tachyon為載體的緩存系統,並在緩存層上搭建了緩存管理系統ViewManager, 進一步提升系統性能。


很多快速的查詢系統都將Parquet之類列存儲格式和分布式KeyValue存儲引擎結合起來, 通過建立索引/物化視圖等手段加速SQL查詢的速度. 通過將部分查詢條件下推到存儲引擎, 某些SQL查詢語句甚至可以被提速至100倍以上。然而我們的數據都存儲在舊版本的Hive數據倉庫中, 文件系統被限定為HDFS, 數據格式一般為低版本的ORC File, 也有不少表是ORCFile或者文本。 因為遷移成本/數據上下遊依賴等兼容性等原因, 我們沒有辦法更改Hive數據倉庫本身的存儲。


不過根據局部性原理, 任何數據訪問都有熱點. 我們可以建立緩存系統, 在緩存系統中應用最新的文件系統和存儲格式. 通過把熱點輸入通過預加載的方式導入到緩存系統, 我們可以加速整個系統的訪問性能.為此, 我們設計了以下的系統架構:

圖4: PINGO 1.1 系統架構


在這個架構中, 我們引入了一個新模塊 ViewManager, 該模塊負責管理緩存系統。 它的主要功能是識別熱點數據, 將數據導入到緩存系統中, 並在查詢時改變SQL的執行過程, 使得Spark從緩存而不是原始位置讀取數據。在這個架構下,當一個Query進來時,會先向OperationManager請求。當接受到請求後,OperationManager會向ViewManager查詢數據是否已經在緩存中。如果已經在緩存,數據將被直接返回給用戶, Query完成。如果數據不在緩存中,OperationManager會向底層Data Warehouse發起請求, 等數據到達時返回給用戶。同時,ViewManager也會向底層Data Warehouse發起請求, 等數據到達時建立一個Cache Entry, 這樣的話下次同樣Query進來時,就會從緩存讀數據。注意這裡我們OperationManager與ViewManager對會向底層Data Warehouse的數據讀取是兩個獨立的STREAM, 這樣保證兩者不會互相干擾。


那PINGO又是如何動態去讀取緩存中或者底層Data Warehouse的數據的呢?畢竟在Query Plan中,數據地址是寫死的。 為了能夠讓緩存對用戶透明, 我們在SparkSQL上做了一些改進, 如下圖所述


圖5: PINGO1.1 對SparkSQL的改進


Spark中利用Catalyst框架來執行SQL語句。 對於Catalyst框架來說, 其輸入是Unresolved Logical Plan, 這可以簡單理解為SQL語句的結構化描述。 Catalyst調用Catalog來向MetaService查詢表的元數據, Catalog返回MetastoreRelation來代表Hive表, 其中含有讀取該表的所有必要信息,以便後續的解析和優化。 而在執行時, Catalyst會把MetastoreRelation轉化為HiveTableScan, 來完成對數據的讀取。


為了實現對緩存的透明利用, 我們在其中兩個地方了做了擴展。 首先我們在Catalog中為我們緩存的表返回CachableRelation來代替MetastoreRelation。 而在將LogicalPlan轉變為真正執行的PhysicalPlan時, 我們會把CachableRelation翻譯為兩種TableScan的Union, 一個針對那些被緩存住的數據, 另外一個針對那些沒有被緩存住的數據。


通過這種方式, 我們能夠做到在用戶不感知的情況下, 完成對數據倉庫存儲層的替換和優化。 目前我們做的僅僅是改變存儲的文件系統和格式, 將來也會將同樣的實現思路應用到索引和物化視圖上。


PINGO 1.2


PINGO 1.1服務很好的提高了系統性能, 但是在運營了一段時間之後, 我們逐漸感覺到Spark的集群管理問題正在成為整個系統的瓶頸。這具體表現在兩個方面


我們的整個服務其實是一個Spark Application, 服務的主節點同時是Spark的Driver。 而我們知道, Spark並不以高可靠性見長, 我們在實踐中也發現把所有的計算壓力放到單個Spark Application容易導致比較嚴重的GC問題和負載問題。 而當Spark出問題需要重啟的時候, 我們的整個服務也就暫停了。


單一Spark集群的架構無法適應多機房的基礎設施。 百度內部的離線集群規模還是很大的, 機房分布在全國的多個地區。 這樣, 我們的服務能夠獲取的資源往往來自多個機房, 而多個機房的機器是不適合組成一個Spark集群的。 另外, 當集群讀取其他機房的數據時, 帶寬往往成為整個計算任務的瓶頸。


發現這些問題是好事,說明系統已經逐漸成熟,開始往怎麼更好的運維的方向發展了。 為了解決上面的問題, 我們對系統進行了進一步的迭代. 迭代後的架構如下圖所示:


圖6: PINGO 1.2 系統架構


在這一版架構中, 我們將PINGO的服務和調度功能獨立出來, 與真正執行計算的部分剝離。 支持了單一查詢入口PinoMaster進行調度, 多個集群Pingo Applicatoin執行計算的多集群功能。 PingoMaster同時維護多個Spark Application。 當一個Query到來時, 我們會根據集群的歸屬/存儲的位置選擇一個最優的Application執行任務。 另外, 這一版本的PINGO還支持在yarn集群上起動Application。 百度內部有自己的資源管理系統, 提供了和yarn兼容的接口. 通過遷移PINGO服務到yarn上避免了原本Standalone版本需要的很多運維工作, 並且可以通過定期重啟Application來解決Spark的可靠性問題。


為了能夠在PINGO中實現更好的調度策略, 我們也對Spark SQL進行了深度擴展。


圖7: PINGO1.2 對SparkSQL的改進


當Pingo收到一個Query後, 我們在Master端就完成對這條Query的分析和部分優化, 並將這些信息保存到QueryContext中。 當SQL在Application端真正執行的時候, 我們從Master端而不是Meta端拿到執行所需要的信息. 這樣做的好處是可以在根據Query的內容來做出調度. 基於這個執行流程, 目前我們開發了兩個比較有效的調度策略:


根據數據的存儲位置進行調度。 因為我們在Master端就能夠知道Query所需數據的存儲位置, 所以可以選擇合適的PingoApplication來執行這條Query。


根據數據量大小進行調度. 如上文所說, 一個Spark Aplication可以支持同時運行多個Job, 但是在很多大型的Job同時運行在一個Application又會造成FullGC等穩定性問題. 我們會根據Query輸入量的大小, 為大型Query單獨啟動Application, 而讓小Query復用同一個Application。 這樣的好處是對於多數的小Query , 我們節省了起動Application的開銷, 而又避免了大Query造成的穩定性問題。



在上一章中,我們詳細介紹了PINGO架構的迭代,在本章中,我們重點看一下PINGO的性能。如圖8所示,首先我們對比了使用Hive以及使用Spark作為計算引擎的性能。 這裡的Benchmark選取的Query是百度內部交互式數據分析的典型負載, 主要是Join/Aggregate等操作, 輸入的數據量從100M到2T左右.我們可以看到, Spark相比Hive有較大的性能優勢。在比較大比較複雜的Query中, Spark取得了2到3倍的加速比。注意在這個對比中,內存資源有限,用的是64GB內存的機器,很多Spark的數據被迫落盤, 如果有更多內存,加速比會更高。


圖8: Query執行時間: Hive vs. Spark


下一步我們了解一下加了緩存後的性能, 在這個實驗中,我們使用了192GB的機器,有更多的內存去支持緩存以及內存計算。如圖9所示,在這個環境下,使用Spark相對於Hive有大概5到7倍的提速。 在加入了Tachyon後,相對於Hive無緩存的情況有30到50倍的提速。我們相信在未來的幾年內,內存價格會大幅降低,內存計算會變成主流,所以使用內存做緩存是一個正確的方向。


圖9: 緩存性能提高


PINGO服務目前被應用在交互式查詢場景中, 旨在為PM和RD提供快速的數據分析服務。 圖10展示了在同樣的計算資源下, 在生產環境使用PINGO前後的Query執行時間分布圖。注意,在這個生產環境中,我們用的是64GB內存的機器, 為了提供足夠的緩存空間,我們使用了Tachyon的Tiered Storage功能,讓緩存分布在內存以及本地磁碟中。 我們可以看到, 在傳統的基於Hive+MR的服務模式下, 只有1%左右的Query能夠在兩分鐘內完成. 而採用了基於Spark的PINGO服務, 有50%+的Query可以在兩分鐘內執行完成。 能夠取得這樣的加速效果, 部分原因是Spark本身的執行效率比Hive要高一些。這個本身還有很大的優化空間,比如如果我們使用內存緩存的話,執行時間可以輕易的壓縮到30秒內。


圖10: Query執行時間: Hive vs. PINGO



經過過去一年的迭代與發展,PINGO已經很好的支持了百度內部的交互式查詢業務。通過PINGO,很多查詢的延時從以前的30到40分鐘,降低到了2分鐘以內,很大的提高了查詢者的工作效率。今後PINGO的發展將朝著更好用,已經更快兩個方向發展。為了讓PINGO更好用,我們正在PINGO之上開發UI, 讓用戶與圖形界面交互(而不是通過輸入SQL Query)就能輕易的查詢到想要的數據。為了讓PINGO更快,更有交互性,我們希望可以把90%以上的Query 時間降低到30秒以下。第一步就是要擴大我們的Cache的覆蓋率與性能,設計出更好的緩存預取以及緩存替換機制,並且加速Cache讀取的延時。第二步,我們也通過硬體加速的方法使用FPGA加速某些常用的SQL Operator。就在最近,我們對SQL的JOIN Operator進行了FPGA硬體加速,相對CPU取得了3倍的加速比。我們也會很快把這項技術使用到PINGO上。


作者簡介: 

溫翔,百度公司大數據部資深工程師。北京大學計算機本科以及碩士研究生畢業。曾在騰訊公司從事大數據平臺開發。目前主要從事百度大數據交換式查詢平臺架構以及開發。 

沈光昊,百度公司大數據部主任架構師。浙江大學計算機碩士。曾在Facebook工作。目前主要負責百度大數據部的總體架構。 

蔡旻諧,百度美國研發中心研發架構師。臺灣大學畢業,加州大學洛杉磯分校(UCLA)計算機碩士,曾任職於雅虎微軟從事搜索廣告平臺核心設計研發。目前任職於百度美研基礎架構部,主要從事分布式計算平臺Spark與深度學習平臺的研發設計工作。 

徐寶強,百度公司大數據部高級項目經理。牛津大學計算機碩士。目前主要從事大數據平臺項目管理工作。 

劉少山,百度公司美國研發中心高級架構師。加州大學歐文分校計算機博士。曾在LinkedIn, Microsoft, Microsoft Research, INRIA, Intel以及Broadcom工作。目前主要從事百度深度學習, 大數據,以及異構計算平臺架構與開發。


責編:錢曙光,關注架構和算法領域,尋求報導或者投稿請發郵件qianshg@csdn.net,另有「CSDN 高級架構師群」,內有諸多知名網際網路公司的大牛架構師,歡迎架構師加微信qshuguang2008申請入群,備註姓名+公司+職位。 

版權聲明:本文為《程式設計師》原創文章,未經允許不得轉載,訂閱2016年程式設計師請訪問 http://dingyue.programmer.com.cn



想了解IT產品研發背後的那些人、技術和故事,請關注CSDN(資訊)微信公眾號:CSDNnews

相關焦點

  • 探秘百度數據工廠Pingo的多存儲後端數據聯合查詢技術
    來源:Alluxio(ID:Alluxio_China)  作者介紹:張志宏,2013年加入百度大數據部,曾作為核心成員參與百度大數據平臺的搭建。目前是百度數據工廠Pingo核心團隊的技術負責人。  Pingo是來自百度的離線大數據集成開發平臺,使用Spark作為計算引擎,深度整合了資源調度、文件系統、元數據管理、工作流管理、交互式Notebook查詢等功能。能夠對異地、異構的非結構化數據、結構化數據、計算資源進行統一接入、訪問和鑑權,能夠對各類企業級數據存儲&計算環境進行統一管理。
  • 分布式系統架構與雲原生—阿里雲《雲原生架構白皮書》導讀
    1.2 分布式系統架構的定義  此處定義參考百度百科為「在一個分布式系統中,一組獨立的計算機展現給用戶的是一個統一的整體,就好像是一個系統似的。系統擁有多種通用的物理和邏輯資源,可以動態的分配任務,分散的物理和邏輯資源通過計算機網絡實現信息交換。系統中存在一個以全局的方式管理計算機資源的分布式作業系統。
  • 百度數據倉庫Palo、數據工廠Pingo等四大產品獲信通院權威認證
    截至2019年12月,共完成了9個批次的236次測試,涵蓋到分布式批處理平臺、分布式流處理平臺、分布式分析型資料庫、分布式事務型資料庫、關係型雲資料庫、時序資料庫、數據挖掘平臺、數據集成工具、數據管理平臺、知識圖譜工具、用戶行為數據分析解決方案、基於多方安全計算的數據流通產品以及可信數據服務。
  • Presto:分布式 SQL 查詢引擎
    下文將詳細介紹二者的區別基本概念組件Coordinator 負責管理 Worker 和 MetaStore 節點,以及接受客戶端查詢請求,並進行 SQL 的語法解析(Parser)、執行計劃生成與優化(Planner)和查詢任務的調度(Scheduler)Coordinator 通過 RESTful 接口與 Client 和 Worker 交互Worker
  • 百度開源2020年度報告:兩大開源平臺、九個捐贈項目
    12月20日,在WAVE SUMMIT+2020深度學習開發者峰會上,飛槳全新發布PaddleHelix螺旋槳生物計算平臺;推出業內首個通用異構參數伺服器架構;開源算法庫全面升級,官方算法數量從140+擴展至200+;飛槳硬體生態夥伴達到20家,適配或者正在適配的晶片/IP型號29種。飛槳提供了開源深度學習平臺自主可控的堅實底座,加速AI產業生態構建。
  • 一文理解分布式架構
    二、分布式架構的應用1、分布式文件系統例如:出名的有 Hadoop 的 HDFS, 還有 google的 GFS , 淘寶的 TFS 等2、分布式緩存系統例如:memcache , hbase, mongdb 等3、分布式資料庫例如:mysql, mariadb, postgreSql 等
  • 兩大開源平臺、九個捐贈項目,走進百度開源的2020 | 極客公園
    12月20日,在WAVE SUMMIT+2020深度學習開發者峰會上,飛槳全新發布PaddleHelix螺旋槳生物計算平臺;推出業內首個通用異構參數伺服器架構;開源算法庫全面升級,官方算法數量從140+擴展至200+;飛槳硬體生態夥伴達到20家,適配或者正在適配的晶片/IP型號29種。飛槳提供了開源深度學習平臺自主可控的堅實底座,加速AI產業生態構建。
  • 光大銀行分布式實戰:國內最大繳費平臺的資料庫架構轉型
    我今天分享的主題是《高並發場景下,光大銀行分布式資料庫的架構轉型實戰》。 光大銀行也是很有魄力的,拿出了一個重要的業務系統進行一次試點,做了一次這種分布式架構轉型的項目。我有過十餘年DBA相關的經驗,不過之前接觸比較多的主要還是傳統的商用型資料庫,所以能作為這次項目的推進人,也是我個人在這種新的架構下的一次學習的過程。
  • 分布式系列之一:架構的演進過程
    穩定性和可用性這兩個指標很難達到單機系統存在可用性和穩定性的問題,這兩個指標又是我們必須要去解決的 1、了解分布式架構中的相關概念 集群 小飯店原來只有一個廚師,切菜洗菜備料炒菜全乾。
  • 雲原生微服務應用平臺來啦!
    基於容器技術,架構完整先進一般來說,現在流行的大多數PaaS平臺,其底層的虛擬化技術主要是容器和虛擬機兩種。容器相對於虛擬機而言,是一種更輕量級的虛擬化技術,百度智能雲此次推出的CNAP就應用了此技術。但與普通的PaaS平臺不同,CNAP充分利用了百度智能雲產品矩陣的優勢,整體架構更為先進。
  • SpringCloud:分布式微服務架構
    概念微服務是一種架構風格,它是一種將一個單一應用程式開發為一組小型服務的方法,每個服務運行在自己的進程中,服務間通信採用輕量級通信機制(通常採用http)。SpringCloud 簡介當我們的系統是分布式架構的時候,由於一個大的業務被拆分成各個不同的子業務,此時就會出現各種各樣的問題(之前文章有過介紹),而SpringCloud提供了一整套的解決方案!
  • 一文詳解:如何設計出高可用的分布式架構?
    本文作者將與大家分享目前主流的分布式架構、分布式架構中常見理論以及如何才能設計出高可用的分布式架構。在分布式架構中,SOA 和微服務架構是最常見的兩種分布式架構,而且目前服務網格的概念也越來越火了,我們就先從這些常見的架構開始。
  • 如何評價百度剛剛開源的Paddle平臺?
    ▎這個平臺本身怎麼樣Paddle本身在開源前就一直存在,始於2013年的時候,因為百度深度實驗室察覺到自己在深度神經網絡訓練方面,伴隨著計算廣告、文本、圖像、語音等訓練數據的快速增長,傳統的基於單GPU的訓練平臺已經無法滿足需求,為此在徐偉的帶領下,實驗室搭建了Paddle(Parallel Asynchronous Distributed
  • IMC架構引領電動汽車平臺進化
    從特斯拉的Model 3平臺,到大眾的MEB平臺,再到ARCFOX的IMC架構,純電動汽車平臺正朝著智能模塊化的方向不斷進化。領先一個時代的IMC架構對選購純電動汽車的用戶而言,智能模塊化平臺將越來越重要,一方面可以實現按需定製、更卓越的駕乘體驗、更前瞻的科技的需求,另一方面也關係到後續的產品維護、迭代升級。所以選平臺時,不僅要注重模塊化與拓展性,更要注重未來持續進化的能力,以滿足即將到來的5G時代快速迭代升級的要求。
  • Tachyon:Spark生態系統中的分布式內存文件系統
    Tachyon簡介Spark平臺以分布式內存計算的模式達到更高的計算性能,在最近引起了業界的廣泛關注,其開源社區也十分活躍。以百度為例,在百度內部計算平臺已經搭建並運行了千臺規模的Spark計算集群,百度也通過其BMR的開放雲平臺對外提供Spark計算平臺服務。
  • 百度騰訊offer比較(騰訊遊戲VS百度基礎架構)?
    真心求比較,求建議(offer待遇差不多,不過騰訊遊戲年終獎謠傳很高,而百度那邊做hbase big table 分布式感覺是未來技術的趨勢)。    我是在百度INF做分布式的。    先談錢:    如果lz拿的不是special offer,我估計offer表面上看起來沒有騰訊給的那麼吸引。也就是,錢少。
  • 「CCF傑出工程師獎」花落百度飛槳總架構師於佃海
    頒獎會上,百度深度學習平臺飛槳總架構師於佃海榮獲「CCF傑出工程師獎」,以表彰他在機器學習的大規模產業應用方面做出的重要貢獻。「CCF傑出工程師獎」 設立於2016年,每年評選一次,每次獲獎人數不超過兩名,授予在計算機工程技術及應用領域有突出成就和重要貢獻者。
  • 大數據平臺架構:數據平臺建設的幾種方案
    隨著大數據在越來越多的企業當中落地,企業要開展大數據相關的業務,那麼首先要搭建起自身的數據平臺。而企業搭建大數據平臺,往往需要結合成本、業務、人員等各方面的因素,來規劃數據平臺建設方案。今天我們就來聊聊數據平臺建設的幾種方案。
  • 13張圖搞懂分布式系統服務註冊與發現原理
    大型網站都是從小型網站發展而來,架構也是一樣。任何一個大型網站的架構都不是從一開始就一層不變的,而是隨著用戶量和數據量的不斷增加不斷迭代演進的結果。在架構不斷迭代演進的過程中我們會遇到很多問題,技術發展的本質就是不斷發現問題再解決問題,解決問題又發現問題。
  • DMLC深盟分布式深度機器學習開源平臺解析
    這個模型會不斷地迭代,每次迭代就生成一顆新的樹。然而,在數據集較大較複雜的時候,我們可能需要幾千次迭代運算,這將造成巨大的計算瓶頸。xgboost正是為了解決這個瓶頸而提出。單機它採用多線程來加速樹的構建,並依賴深盟的另一個部件rabbit來進行分布式計算。為了方便使用,xgboost提供了 Python和R語言接口。