第15期:開放的計算能力為數(shù)據(jù)庫瘦身
我們在上一期談到,數(shù)據(jù)庫的臃腫,也就是過多的中間表以及相關(guān)存儲過程,是由于其計算封閉性造成的。如果能夠?qū)崿F(xiàn)獨立的計算引擎,使計算不再依賴于數(shù)據(jù)庫提供,那么就可以為數(shù)據(jù)庫瘦身了。
一、
內(nèi)部來源的中間數(shù)據(jù)不必再以數(shù)據(jù)表的形式落地在數(shù)據(jù)庫中,而可以放到文件系統(tǒng)中,由外部計算引擎提供進一步的計算能力。對于只讀的中間數(shù)據(jù),使用文件存儲時不需要考慮再改寫,可以更為緊致并采用一定的壓縮手段,而且在訪問時也不必考慮事務(wù)一致性,機制大為簡化,這樣能獲得比數(shù)據(jù)庫更好多的吞吐性能。文件系統(tǒng)還可以采用樹形組織方案,將各個應(yīng)用(模塊)的中間數(shù)據(jù)分類管理好,使更方便,并且可使中間數(shù)據(jù)將從屬于應(yīng)用模塊,不會被其它模塊訪問到。當(dāng)有模塊修改或下線時,相應(yīng)的中間數(shù)據(jù)可以跟隨修改,而不必擔(dān)心被共享而產(chǎn)生的耦合問題。用于生成中間數(shù)據(jù)的存儲過程也可以移到數(shù)據(jù)庫外部,作為應(yīng)用程序的一部分,同樣不會產(chǎn)生耦合問題。
外部來源的中間表也可以減少甚至取消。ETL過程的E、T步驟可以直接在數(shù)據(jù)庫外部由計算引擎實施,在完成清洗轉(zhuǎn)換之后再加載進數(shù)據(jù)庫。E、T步驟中不占用數(shù)據(jù)庫的計算資源,當(dāng)然也不需要建立中間表來保存這些數(shù)據(jù),數(shù)據(jù)庫只要保存最終需要的結(jié)果即可。
多樣性數(shù)據(jù)源的數(shù)據(jù)呈現(xiàn)也可以直接由計算引擎實現(xiàn)數(shù)據(jù)源和數(shù)據(jù)庫的混合計算,這樣就不必將外部數(shù)據(jù)源導(dǎo)入數(shù)據(jù)庫,有效減少中間表。在數(shù)據(jù)呈現(xiàn)時由計算引擎臨時向數(shù)據(jù)源發(fā)出取數(shù)指令以獲得***的數(shù)據(jù),還可以獲得更好的實時性,而采用中間表方式一般只能定期把外部數(shù)據(jù)源轉(zhuǎn)入,無法看到***的外部數(shù)據(jù)。而且,不將外部數(shù)據(jù)導(dǎo)入數(shù)據(jù)庫,還能繼續(xù)利用原數(shù)據(jù)源的某些優(yōu)勢,比如NoSQL數(shù)據(jù)庫對于按鍵值查找有很好的性能,還能較好地解決數(shù)據(jù)結(jié)構(gòu)多樣性的問題。另外,專門設(shè)計的計算引擎如果再能處理好XML,json這類多層數(shù)據(jù),在計算描述上也比傳統(tǒng)的關(guān)系數(shù)據(jù)庫更有優(yōu)勢。
二、
除了必須的計算能力本身之外,要用于數(shù)據(jù)庫瘦身的計算引擎必須擁有較好開放性和可集成性。
開放性是指計算能力并不依賴于某種存儲體系,而可以計算各種來源的數(shù)據(jù),比如文件系統(tǒng)中的數(shù)據(jù),這樣就能利用適合的存儲方案來組織管理中間數(shù)據(jù)。如果計算體系要求特有的數(shù)據(jù)存儲體系(比如數(shù)據(jù)庫),那只是把數(shù)據(jù)庫的臃腫換了一個地方繼續(xù)臃腫。可集成性是指計算能力可以嵌入到應(yīng)用程序中,成為應(yīng)用的一部分,而不能象數(shù)據(jù)庫那樣是個獨立的進程,這樣就不會被其它應(yīng)用(模塊)共享,避免出現(xiàn)應(yīng)用間的耦合問題。
從這個意義上講,Hadoop體系(包括Spark)雖然有一定的計算能力,但并不合適充當(dāng)開放計算引擎的作用。Hadoop有一定的開放性,可以計算體系外的數(shù)據(jù),但并不常用,而且性能較差;Hadoop是以獨立進程方式運行的龐大體系,基本上沒有可集成性,很難完全嵌入到應(yīng)用程序中。
有了開放可集成的計算能力,相當(dāng)于實現(xiàn)了計算和存儲的分離,在設(shè)計應(yīng)用的體系結(jié)構(gòu)時就會更為得心應(yīng)手。不必為了獲得計算能力而部署多余的數(shù)據(jù)庫或者擴容數(shù)據(jù)庫,讓數(shù)據(jù)庫專心做它最合適做的事情,將資源效用發(fā)揮到***。