大數據之路之數據上雲解決方案(增量)

上篇說到全量數據上雲,這裏繼續講增量

爲什麼要用到增量?因爲小數據庫還好,數據量大的,每一次都要全量既對存儲壓力巨大,也對上雲效率產生弊端,每次都要上全量代價太大了,所以這時候爲什麼不考慮全量+增量=全量的模式呢,即如果某庫數據是一天一調度,那就是昨天的全量+今天的增量=今天的全量,如此一來只需要第一次上一份全量,後續每次的調度只抽取增量即可

難點:

  1. 如何獲取到雲下數據庫的增量數據
  2. 如何保證全量+增量的合併數據能和源數據保持一致性 
  3. 如何保存增量數據,如何上雲這些增量數據
  4. 如何調度全量合併,如何設置合理分區

如何獲取增量,即增量採集,我之前寫過一篇增量採集的博客,傳送門

  1. 對於大型數據庫,數據變更頻率快,表數量多,對數據傳輸要求有備份,安全,零差數據的採用基於數據庫日誌的方法
  2. 對於小型數據庫,且未開歸檔,但數據變更頻率快的採用基於全量對比的方法
  3. 對於含有標準時間戳字段,且應用環境適合,表數量較少的採用基於時間字段的方法
  4. 至於觸發器,由於需要源端運維成本較大,且對源端存儲有壓力(既然都是對存儲有壓力爲何不用OGG),故很少有客戶選擇這一種
     

一般來講應用場景最多的就是第一種和第三種,這裏我們採用基於數據庫日誌的方法,也就是OGG+DataX(數據採集工具), OGG是基於oracle日誌,負責採集變化數據的一個數據庫插件,大部分公司用它都是用它的災備功能,而大數據應用裏它還有一個更牛逼的作用:採集增量數據並生成數據文件,這個過程由OGG裏的兩個組件GordenGate 和 Adapter來完成

基於OGG的數據集成方案是把從Oracle採集數據的工作交給OGG來做。主要考慮到既要獲得源系統精確的數據變化又要儘量不對源系統造成影響,實現的過程依賴OGG捕獲數據庫日誌,而不是通過查詢數據去獲得數據變化的增、刪、改,確實可以實現這個需求。所以,這個方案非常適合現在這種業務系統無法直接提供增量的場景。基於OGG的方案,首次採用DataX進行全庫數據初始化。以後日常的所有的作業都是根據OGG解析出來的增量的csv文件,採用DataX任務裝載到雲平臺中。

雲平臺裏一個表的全量數據和增量數據怎麼區分呢,靠分區:比如初始化分區分區值可以設爲00000000,後續每天的增量數據保存到具體日分區,如20190719等。

等增量數據上雲之後就可以進行全量合併,全量合併的思想就是把全量數據與增量數據通過主鍵進行比對,每一份數據都有帶的操作標識(IDU),操作時間等,可根據此,主鍵不同(I標識)的直接添加,主鍵相同的根據操作時間選擇最新的一條,是U的就直接添加,D的刪除,如此一來全量合併即完成了,全量合併的sql腳本如下

INSERT OVERWRITE TABLE xxx.xxxx PARTITION(rfq='20190719')
SELECT  uuid
        ,uuid2  
        ,czid
FROM    (
            SELECT  uuid
                    ,uuid2                   
                    ,czid
                    ,ROW_NUMBER() OVER (PARTITION BY CONCAT(uuid) ORDER BY CAST(czid AS decimal) DESC) AS rn
            FROM    (
                        SELECT  uuid
                                ,uuid2                             
                                ,czid
                        FROM    xxx.xxxx
                        WHERE   rfq = '20190718'
                        AND     czid != 'D'
                        UNION ALL
                        SELECT  uuid
                                ,uuid2                              
                                ,czid
                        FROM    xxx.xxxx
                        WHERE   RFQ = '20190719'
                    ) T
        ) t
WHERE   t.rn = 1
AND     t.czid != 'D'
;

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章