文/蘇鵬濤
隨著電力信息化的建設推進,電力企業數據中心積累了大量的數據資源,數據準確性越來越高,量測類數據其所占比重也越來越大,已具備良好的數據基礎。通過各種基于大數據平臺的數據挖掘工具或查詢引擎,可以實現快速查詢、負荷預測、異常分析等高級應用,提高企業運營水平、發掘數據潛在價值。由于生產系統大都為傳統關系型數據庫,這就需要將海量的量測數據從傳統關系型數據庫遷移到大數據平臺,雖然Sqoop等工具支持將關系型數據庫導入HBase中,但其需要與其它調度工具如Oozie配合使用才可實現定時任務,并且沒有自動補傳功能。本方法基于HBaseJava API 實現了一種支持自動補傳的傳統關系型數據庫遷移到HBase的方法。
該方法通過JDBC訪問數據源,通過HBaseJava API操作HBase數據庫寫入數據,可以實現電力量測類數據從傳統關系型數據庫向大數據平臺HBase數據庫的自動遷移,支持增量延時同步功能,能夠做到遷移失敗數據的自動補傳,具有穩定內存消耗、降低集群資源需求、靈活控制遷移方式、快速增加遷移任務、缺失數據自動補傳、異常提醒和任務定時啟動等優點。
HBase是建立在Hadoop文件系統上的分布式列式數據庫,它是一種NoSQL數據庫,主要適用于海量明細數據(十億、百億級)的隨機實時查詢,如日志明細、交易清單、軌跡行為等,非常適合于電力量測類海量數據的快速查詢、綜合分析等應用。
電力量測類數據是一種具有明顯時序特性的數據,主要由采集日期、采集點(從0點整開始,根據采集設備不同,每隔2、5或15分鐘一個)、設備號、量測類型、采集值(量測值)構成,其中設備號可關聯到設備信息。量測快速查詢主要有兩種類型的需求,一是查詢某一設備一段時間的曲線(如查詢XX變壓器連續一個月的負荷典線,了解哪些時段負荷高等),二是查詢某一時間各設備的數值(如查詢XX區所有變壓器負荷,哪些設備超載等)。為滿足這兩種快速查詢需求,設計HBase表結構如圖1所示,以公司簡碼、時間、主設備號、量測類型合并作為Rowkey,以設備號作為列名,示數值作為值,公司簡碼作為分區。

圖1:HBase表結構

圖2:量測類數據寬表

圖3:功能結構圖
Sqoop是一款開源的工具,主要用于在Hadoop與傳統的數據庫間進行數據的相互遷移。它以Shell命令的方式進行調用,可以將命令中的查詢語句的結果導入到HBase中。
量測類數據多表關聯后的數據寬表如圖2所示。每個設備每天一條數據,96個列記錄96個測點值,與圖1HBase表結構相比有兩個結構上的差異。一是需要將一行數據中的n個時間點轉換為n行;二是需要將每個主設備號下的n行的每個設備號轉換為一行的n個列,并且以設備號作為列名。這就同時涉及到行轉列和列轉行,由于Sqoop依賴于SQL語句查詢結果,要通過一個SQL語句實現此結構轉換非常困難,語句極其復雜。本遷移方法使用Java語言開發,通過SQL查詢出寬表數據,再對每一條寬表數據按照配置的規則拆分組裝,這樣兩個循環結構即可實現此結構轉換。其功能結構如圖3所示。
本方法能根據主機硬件信息、HBase集群信息設定最佳的寫入方式,由查詢模塊、配置模塊、日志模塊、轉換模塊、寫入模塊、管理模塊六個功能模塊組成。
查詢模塊通過JDBC從關系型數據庫查詢數據;
配置模塊用于配置連接、表、查詢條件、結果輸出格式、寫入方式等;
日志模塊記錄每張表每次遷移的狀態;
轉換模塊按照對應HBase結構將查詢模塊查到的結果數據轉換為寫入模塊需要的格式;
寫入模塊按照配置模塊寫入參數通過API將數據寫入HBase中;
管理模塊定時啟動遷移任務并根據日志模塊記錄的日志信息補傳未成功遷移的數據。
所有模塊均由Java語言開發,數據存儲于MySQL數據庫,使用JDBC方式分批訪問量測數據,使用JavaHBase API訪問HBase。
遷移流程如圖4所示。
開始:每日由管理模塊定時啟動遷移任務。
步驟1:管理模塊檢索日志模塊記錄的遷移日志,判斷歷史遷移日期中是否存在異常狀態記錄或有日志缺失。若有執行步驟2,若無執行步驟3。
步驟2:管理模塊生成缺失、異常日志信息列表。執行步驟4。
步驟3:查詢模塊讀取配置模塊參數,按參數分批查詢需遷移的數據表前一日數據。執行步驟5。
步驟4:查詢模塊讀取配置模塊參數,按參數分批查詢需遷移的數據表對應的生成缺失、異常日志信息列表中的最早日期數據,并從列表中刪除此條記錄。執行步驟5。
步驟5:轉換模塊按配置模塊參數將步驟3或步驟4查詢結果轉換為HBase需要的結構。執行步驟6。
步驟6:寫入模塊通過API,按照配置模塊參數多線程并行寫入HBase。執行步驟7。
步驟7:日志模塊記錄或更新日志。執行步驟8。
步驟8:管理模塊判斷日志記錄中是否已有前一日日志,若有執行步驟11,若無執行步驟9。
步驟9:查詢模塊檢查生成缺失、異常日志信息列表,若已無信息執行步驟10,若有信息執行步驟4。
步驟10:查詢模塊讀取配置模塊參數按參數分批查詢需遷移的數據表前一日數據。執行步驟5。
步驟11:管理模塊結束當次遷移任務,并檢查日志記錄中是否存在異常次數大于等于2的日志記錄。若有發出警告日志,提醒人工檢查。
整個遷移過程中,若日志模塊、管理模塊發生異常,會造成日志缺失;其它模塊發生異常會記錄異常日志到日志模塊中。后一日遷移任務均可根據日志記錄自動補傳。當發生補傳無效情況時,管理模塊生成告警日志,提醒人工干預檢測處理,以此機制確保遷移的自動化和可靠性。
測試環境為CDH大數據平臺,其HBase集群由7臺配置相同的服務器構成,每臺服務器均安裝了一個獨立的Sqoop組件。由于量測數據量較大,Sqoop使用的轉換SQL較復雜,采用一個Sqoop命令遷移全部數據時較容易發生卡死,因此將其拆分為多個命令。7臺服務器,每臺啟動一個Sqoop遷移,每個Sqoop特意改造為遷移不同HBase分區的數據,以確保數據均衡,達到最大效率。Sqoop偽代碼如下:

其中--query "......"部分需要將整個邏輯寫為一個可執行的SQL語句。
遷移方法配置為分批查詢,每批次查詢固定量的數據,在內存中轉換寫入后再抽取下一批數據,以確保使用較低的內存達到較高的效率。管理模塊根據HBase集群數,每臺HBase主機單獨啟動一個遷移進程,每個進程遷移不同分區數據,確保所有HBase節點均合理利用起來。
通過測試,轉換寫入1億行原始數據,寫入HBase后數據大小約900G。若用Sqoop用時4小時38分,平均速率約每秒56M,單個進程每秒8M。使用本遷移方法用時5小時01分,平均速率約每秒51M,單個進程每秒7.3M。服務器資源消耗兩者相當,遷移方法由于有日志等其它開銷,效率稍低于Sqoop。
雖然數據遷移效率略低于Sqoop,但若需補傳少量數據時,Sqoop會將全部數據重傳,所有已傳數據變為歷史版本,極大增加了系統存儲負擔。若Sqoop要達到本方法的補傳效果,需要人為查詢HBase中表數據情況,再更改Sqoop中的SQL語句,當HBase表中數據量極大時,很難查到失敗數據的斷面信息,操作可行性極低。
本方法在數據遷移過程中,通過直接Kill進程方式強制結束數據遷移。遷移方法進程在被Kill之前已完成遷移的數據其日期已被記錄于日志中,Kill后進程停止,其后日志缺失。重啟遷移任務,管理模塊根據日志自動將缺失日志的日期的數據補傳,僅補傳Kill執行后的缺失數據,覆蓋前次數據使其成為歷史版本。

圖4:遷移流程圖
本文研究了一種電力量測類數據遷移到HBase的方法,包含查詢模塊、配置模塊、日志模塊、轉換模塊、寫入模塊、管理模塊等六個功能模塊,通過配置查詢語句、轉換數據結構和設定系統參數,基于JDBC訪問電力量測類數據傳統關系型數據庫、HBase Java API操作HBase數據庫,實現寫入遷移數據、記錄遷移日志、定時啟動任務和自動補傳數據功能。本方法可以實現電力量測類數據從傳統關系型數據庫到HBase數據庫的自動遷移,支持增量延時同步功能,能夠做到遷移失敗數據的自動補傳,能夠以較高效率將電力量測類數據導入HBase,并解決了缺失數據自動補傳的問題,降低了電力量測類數據遷移到HBase的執行難度,提高了數據遷移的靈活性、便利性和穩定性。