Menu

最近在拜讀 Martin KleppmannDesigning 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): 容易改善、新增功能的系統設計
Image Credit : 如何了解各個 data system 的優缺點並予以組合

儘管我們不可能熟悉所有資料庫以及分散式系統的細節,了解他們背後設計的核心理念、演算法以及大致上的運作方式能讓我們了解每個 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 以有系統的方式「組合」起來,以建立一個可靠、具規模性以及維護性的系統。

跟資料科學相關的最新文章直接送到家。
只要加入訂閱名單,當新文章出爐時,
你將能馬上收到通知