讓檔案具有計算能力

2021-06-23 01:02:46 字數 3265 閱讀 3787

讓檔案具有計算能力,可以減輕資料庫吞吐瓶頸、降低資料庫成本、降低資料庫擴容壓力、使資料更易於管理。

有很多資料庫之外的檔案都蘊含著結構化資料,比如:文字檔案、excel檔案、日誌檔案、二進位制檔案。為了在應用程式中使用這些結構化資料,一般的作法是先把它們匯入資料庫,利用資料庫的介面計算資料並獲得結果。

但是,將檔案匯入資料庫再計算,會產生如下不便:

額外的工作量。將檔案匯入庫內,通常要額外進行etl開發工作。很多時候,我們還要處理增量資料、實現定時排程、開發儲存過程、設定資料庫許可權,工作量進一步加大。

加大了資料庫吞吐負擔。有些檔案的資料量很大,比如**日誌。匯入資料庫後,這些資料占用昂貴的資料庫儲存空間、資料庫license、cpu資源、網路io,加大了資料庫的吞吐負擔。

推進了資料庫擴容。更多的資料加大了資料庫的吞吐負擔,就會加速資料庫的擴容 ,使用者不得不經常公升級擴容,購買昂貴的專用儲存裝置、資料庫license、伺服器cpu。有時候,僅僅擴容還不夠,還需要購買更高檔的資料庫專用伺服器。

資料的可管理性變差。檔案可以按照業務種類、模組關係、時間順序進行多級目錄管理,可管理性較高。而資料庫是扁平結構,不能以多級目錄的形式來管理資料,只適合管理數量較少的表。有時,匯入的資料種類多、數量大、命名隨意,在資料庫中很容易形成大量意義混淆的表名,長此以往,資料庫中會積累大量意義不明但又不敢刪除的頑固資料,可管理性反而變差。

檔案入庫的缺點這麼多,為什麼還要入庫?這是因為檔案本身缺乏計算能力,為了獲得計算能力,我們不得不將它入庫,並承受由此帶來的不便。可以看到,如果使檔案具有計算能力,這些不便都會消失,我們甚至還能將庫內原有的冗餘資料也匯出成庫外檔案,帶來更大的便利!

資料庫中有兩類資料,核心的業務資料,以及由此派生出的面向具體應用的冗餘資料(如為了提高效能和方便查詢事先彙總的資料)。資料庫建設初期,以核心資料為主。但隨著業務的發展,冗餘資料不論在量級和增速上都會大大超過核心資料。核心資料的安全性要求高,數量少,有必要放進昂貴的資料庫儲存空間。冗餘資料衍生自核心資料,它的安全要求不高,一旦損壞也可以通過核心資料重新生成,因此沒有必要放進資料庫中。之所以要把冗餘資料放在資料庫中,不是為了安全性,這同樣是為了讓冗餘資料獲得計算能力。

由於資料量大、關聯的應用多,冗餘資料消耗了資料庫的絕大部分資源,對資料庫的吞吐瓶頸影響更大,擴容時所要付出的成本也更多,可管理性也會更差。

總結一下,如果我們使檔案擁有計算能力,我們將獲得這些好處:

沒有額外的工作量。對於庫外檔案,我們可以直接讀取並計算,不必再匯入資料庫,額外的etl的工作量減少到零。

管理方便。檔案天然支援多級目錄,複製、轉移、拆分都比資料庫簡單高效得多,這就允許使用者按照業務模組、時間順序等規則分類管理資料,應用程式下線時,也可以按照目錄刪除該應用對應的資料。資料管理因此變得簡單清晰,工作量顯著降低。

成本低廉。既然是檔案,那就可以簡單地儲存在廉價硬碟中,無需購買昂貴的資料庫專用軟硬體。

降低資料庫吞吐負擔。將數量最大,應用最多的冗餘資料移到庫外,資料庫的效能自然會明顯提高,吞吐負擔隨之減低。

降低資料庫擴容壓力。資料庫吞吐負擔降低,就可以顯著推遲擴容臨界點的到來,資料庫可以繼續服役,也可以節省大量的擴容成本。

資源利用率高。用檔案來儲存資料並非要拋棄資料庫,相反的,檔案應當只儲存安全要求不高、但資料量巨大的冗餘資料以及庫外檔案,而資料庫仍然儲存核心資料。如此一來,檔案儲存和資料庫儲存各司其職,資源利用率顯著提高。

整體效能顯著提高。資料庫是私有介面,通道擁擠;檔案系統是開放介面,任何程式都能訪問,效能的天花板更高。另外,檔案可以方便地複製、分散在多台廉價pc上,這就可以使用多節點平行計算的方式來解決吞吐瓶頸,效能可以進一步大幅度提高。雖然資料庫也有並行解決方案,但teradata、greenplum等方案非常昂貴,免費的hive、impala目前計算能力和成熟度還不高,難以普及使用。

檔案計算的優勢很多,但有乙個關鍵的缺點,即檔案本身沒有計算能力,我們需要特定的工具才能讓它具有庫外計算能力。r語言、mapreduce、高階語言、集算器就是這樣的工具,其中,集算器的綜合優勢較多,下面重點介紹一下。

自有引擎支援檔案計算。集算器可以直接讀取txt檔案、excel檔案、二進位制檔案中的結構化資料,從而輕鬆支援庫外檔案計算。集算器還可以直接訪問各種關係型資料庫、半結構化資料,可以輕鬆進行多資料來源混合計算。

內建豐富的計算函式。集算器是針對結構化資料計算的程式語言,提供了豐富的內建物件和庫函式,可以實現複雜的業務邏輯,同時還能降低從業務邏輯到程式**的轉換門檻。

比如,有序集合可以解決sql\sp中的典型難題,包括相對位置訪問、多級分組中的行間計算、複雜的排名計算。

支援廉價橫向擴充套件。集算器支援多節點平行計算,從而支援大檔案庫外計算,在保證高效能的同時可以有效降低成本。集算器還是個幾乎免費的軟體,不必購買專用的資料儲存裝置和相應的授權就能使用,它支援windows/linux/unix,既支援中高階伺服器也支援廉價pc,伸縮性比資料庫更強。

下面用乙個例子來說明集算器進行檔案計算的過程:某企業使用檔案來儲存歷史資料和冗餘資料,其中包括了歷史訂單資料;資料庫用來儲存核心資料和當期資料,包括當月的訂單資料以及完整的客戶資訊。現在需要通過外部輸入的商品列表來計算去年年初到目前為止,有多少客戶購買了列表上的所有商品;計算完成後,需要將客戶id和客戶名返回給報表工具。集算器**如下:

a1-a3:從檔案讀取歷史資料,從資料庫取當月資料,並將兩者合併。

a4-a5:按照時間和商品列表過濾訂單,其中商品列表來自於外部(一般是報表工具)。需要注意的是,例子中假設資料量不大,因此採用了先合併再過濾的方式。如果實際資料量比較大,則應該採用先過濾再合併的方式;如果資料量進一步加大,則應當用檔案游標分段讀取分段計算方式;對於特別巨大的資料,可以採用多節點平行計算的方式。

a6-a10:計算出購買了相同產品的客戶。由於同乙個客戶會購買同樣的商品,因此需要將訂單按客戶分組,在每組中求得使用者購買了哪些不重複的商品(相當於sql中的distinct)。繼續對不重複的商品計數,即可知道使用者購買了幾種商品。這個數量如果和商品列表一致,則表示該使用者購買了列表中的所有商品。

a11-a12:從資料庫取得完整的客戶id、客戶名稱,通過關聯計算求出a10中客戶id所對應的客戶名稱。

a13:將計算結果返回給報表工具。

模板應具有的能力

1.模板引入 include 引入靜態模板片段 macro 引入動態模板片段,巨集本質也是乙個函式,就是傳入變數,編譯出一段模板 2.模板繼承 extends 實現了一次性復用多個模板片段的功能,相當於多個macro。在布局復用上,非常有用,實現了母版頁的功能。例如,有layout.html,子模板...

開發者應具有的能力

1.專案管理的能力 給乙個產品經理的構想文件 讓他規劃開發工期 2.文字表達的能力 看他的部落格 或者,讓他寫某項東西的文件 3.快速學習的能力 給一段沒有文件,只有example的 庫,讓他使用 4.理解產品的能力 讓其觀察乙個產品,讓他列出存在的問題 和解決方案 以及可以去做的事情 5.搜尋答案...

讓物件具有能動性

類的方法 def fun name self pass其中的引數self代表類的例項,在呼叫方法時由系統自動提供 方法定義時必須指明self引數 與普通的函式呼叫類似 在類的內部呼叫 self.方法名 引數列表 在類的外部呼叫 例項名 方法名 引數列表 以上兩種呼叫方法中,提供的引數列表都不用包括s...