Apache Hawq Data Locality簡介 (1) [作者:張桓]
Apache Hawq作為一款重量級的開源sql-on-hadoop產品,在效能方面做了很多優化工作。其中針對datalocality設計了單獨的模組,使得查詢中本地磁碟IO的比例最大化。那麼什麼是datalocality呢?舉個日常生活中的例子,我們經常會在網上購物,那麼自營倉庫的電商的送貨流程是這樣的,如果你所在片區的網點有訂單物品,那麼快遞小哥直接送貨,如果沒有,則會向臨近的區級倉庫申請調貨,區級倉庫還沒有就市級倉庫調貨,市級倉庫還沒有就省級倉庫,如果是跨境電商還可以從其他國家的倉庫調貨。網購的送貨時間與訂單物品所在倉庫的級別息息相關。如果在網點或者區級倉庫,我們往往當天就能收到貨,如果需要從市級倉庫調貨,那麼需要隔天才能收貨,如果跨國,
在Hawq中,一條查詢被分拆成多個stage,每個stage由多個計算程序以pipeline的形式執行。Hawq的datalocality與電商送貨類似,執行計算的程序可以看作收貨人,資料在hdfs中儲存單位是block,因此每個block可以看作訂單中的物品,無形的“快遞員”將資料傳遞到計算程序空間中,datalocality模組的目標就是將資料傳遞到計算程序空間的速度最大化。Block可以儲存在計算程序所在機器的記憶體中,本地磁碟中,也可能在同一hdfs叢集的其他機器上,可以在同一個機架內,也可能跨機架,甚至跨資料中心,這就對應了商品是在本地網點還是在區級,市級,省級甚至跨國倉庫。 當指定計算程序在哪些機器後,我們可以設計相應的datalocality演算法,保證系統整體的本地磁碟IO最大化。
前面介紹了datalocality的基本概念,下面來點乾貨,介紹一下Hawq中hash表的datalocality演算法。Hawq的hash表以某列為分佈鍵,將資料打散到hdfs的不同檔案中,打散的檔案數等於hash表的bucket number。在針對該表執行查詢時,hawq會在查詢的每個stage中啟動bucket number個計算程序處理資料,計算程序在機器間平均分佈。最下面的scan stage中,每個程序恰好負責讀取一個檔案,由於hdfs插入的時候會在本地保留一個備份,Hawq的設計可以保證同一個檔案至少在一臺機器上有所有block的備份。因此只要排程scan程序讀取本機插入的檔案,就可以保證100%的本地讀取。當然,這是理想情況,如果插入操作時hdfs某個結點過於忙碌,也會產生插入程序在本機沒有block備份的情況。
對於Hawq random表,無法保證一個檔案至少在一臺機器上有該檔案所有block的備份,因此針對random表的data locality演算法也更為複雜,我們會在以後介紹。
最後,和大家分享一個電商對datalocality演算法設計的啟示。假設一個程序正在掃描一個由多個block組成的hdfs檔案,這些block有的在程序所在機器上有備份,有的沒有備份,傳統的做法是依次掃描這些block,速度也因此會受到網路IO的限制,總時間=磁碟IO+網路IO。參考一下電商,如果我們訂單中的物品一部分本地網點有,一部分在市級倉庫,那麼快遞員會先配送本地網點的物品,同時市級倉庫開始調貨,等到第二天收到市級倉庫的物品後,再由快遞員配送。從市級倉庫調貨並沒有阻塞快遞員配送本地網點的物品,如果datalocality演算法借鑑這個思路,可以優先讀取本地block,同時在一個後臺程序(執行緒)中不斷收集在其他機器上的block,收集完畢後再交由計算程序處理。跨學科、跨領域會激發創新,無論您來自哪個領域,歡迎給Apache Hawq提出寶貴的意見和建議。
https://cwiki.apache.org/confluence/display/HAWQ/Apache+HAWQ+Home