最近在拜讀 Martin Kleppmann 的 Designing Data-Intensive Applications, 覺得受益匪淺,且我也相信透過 Feynman Technique 將學到的東西用最淺顯易懂的方式表達能幫助自己內化這些知識,遂嘗試把閱讀後的心得記錄在此。
另外在提到書內內容時都會盡量使用英文原文,不另做名詞的翻譯,以方便對照書內內容。
何謂 data-intensive applications¶
所謂的 data-intensive applications 如同名稱所示,專注在如何有效率地處理、儲存密集資料。通常一個這樣的系統的後端要用多種方式處理資料,而不是只用一個資料庫就結束了。(雖然對 end users 來說可能看起來像這樣)
舉個簡單例子,一個電子商務網頁的後端除了做為 OLTP 的 NoSQL 資料庫 (e.g., MongoDB) 以外,可能還有:
- 一個專門存放網頁快取的資料庫 (e.g. Redis)
- 給資料科學家分析用的資料倉儲 (e.g., Redshift)
- 處理 streaming events 的 messaging queue (e.g., Kafka)
- 定期將 NoSQL 資料庫的資料做 ETL 存到 資料倉儲的批次處理 (e.g., Hive jobs)
光是要把以上所列的資料庫 / 分散式系統 / 資料流 以有系統的方式組合起來就需要大量經驗,更遑論還要達到以下三個要求了:
- 可靠性 (reliable): 像是 zero-down time, 很短的回應時間 etc
- 規模性 (scalable): 即使之後資料量增加,系統也能很好地運作
- 維護性 (maintainable): 容易改善、新增功能的系統設計
儘管我們不可能熟悉所有資料庫以及分散式系統的細節,了解他們背後設計的核心理念、演算法以及大致上的運作方式能讓我們了解每個 data system 的特性以及優缺點,依照不同的使用案例選擇最適合的 data system 並予以組合。
何謂資料密集¶
書中所指的「密集」資料有以下所列的特徵(一個以上):
- 大量資料
- 資料的(格式、 schema etc)變動速度很快
- 資料有複雜結構
針對「資料有複雜結構」以及「資料變動很快」這點,最為人所知的 solution 就是 NoSQL 等允許彈性 schema 的資料庫的崛起; 而針對「資料量很大」這點,則端看使用案例有各式各樣的資料庫、分散式系統。舉幾個例子:
- 能有效儲存大量資料的 Google BigTable
- 以欄 (column) 為單位儲存以壓縮大量資料的資料倉儲 Redshift
- Amazon 的 Single-leader Replication - DynamoDB
- 專門處理 realtime streaming data 的 Kafka, RabbitMQ etc.
如同前述,以上提到的系統依照它們想要解決的問題的特性,背後都會有一些假設以及 trade-off 。了解這些背後的原理可以讓我們了解哪些工具在什麼時候最 powerful 。
這本書主要分成三部分來闡述,抓到大方向會比較容易閱讀:
- 針對單一機器上的資料,有哪些常用的資料儲存/處理方法
- 類似前一部份,闡述針對分散式系統的資料儲存/處理方法
- 資料密集型應用:如何將多個 data systems 組合起來
一句話總結¶
在資料密集的時代,我們的最終目標在於如何將各式各樣的 data systems 以有系統的方式「組合」起來,以建立一個可靠、具規模性以及維護性的系統。
跟資料科學相關的最新文章直接送到家。 只要加入訂閱名單,當新文章出爐時, 你將能馬上收到通知