本文為 Design Data Intensive Applications 的書摘 + 個人心得。
從寫 Design Data Intensive Applications 書摘到現在,我們著墨的都是現代系統的樣子,你發送 request 或送一個查詢,然後系統回給你 response 或結果,像資料庫、快取伺服器、搜尋引擎、web 伺服器、API 伺服器等等,這些都可視為 在線系統 (online system),依據這個分法,我們可把系統區分成:
- Services (online systems) 就是開頭寫的那樣子,服務處理的速度越快越好,所以 回應時間 (response time) 通常是測量效能的指標。
- Batch processing systems (offline systems) 批次處理系統 (batch processing system) 處理大量的資料,然後產出一些資料,處理工作時間從幾分鐘到幾天都有可能,所以它的效能指標是 吞吐量 (throughput),同樣時間內能處理多大的資料,這也是這幾天要討論的主題。
- Stream processing systems (near-real-time systems) 串流處理系統 (stream processing system) 介於 online 和 offline 之間,所以稱為 接近即時 (near-real-time) 系統,串流處理主要是 消費 (consume) 和 生產 (produce)(而不是 request 和 response),另外串流作業是建立在批次處理之上的。
批次處理系統也是需要符合 Reliable, Scalable 和 Maintainable 原則 的,所以這幾天會探討多種批次處理的方法,而主角就是捧紅大數據的 MapReduce ,在這之前先來看看如何用標準 Unix 工具做資料處理吧,今天的重點就是了解 Unix 哲學,帶領我們往更大規模的分散式系統前進。
使用 Unix 工具做批次處理
如果你有 nginx 的 log 長這樣:
93.180.71.3 - - [17/May/2015:08:05:32 +0000] "GET /downloads/product_1 HTTP/1.1" 304 0 "-" "Debian APT-HTTP/1.3 (0.8.16~exp12ubuntu10.21)"
你要如何透過 Unix 的工具做次數計算的統計分析呢?
範例資料可以從這裡下載。
Simple Log analysis
Unix 底下其實有很多好用的工具,若你想知道網站前 3 名的 URL 是什麼,你可以在 Unix shell 中寫:
cat nginx.log |
awk '{print $7}' |
sort |
uniq -c |
sort -r -n |
head -n 3
由上到下它總共做了這些事:
- 讀取 log 檔案
- 將每一行用空白分隔,然後輸出 URL。
- 使用
sort
以字母順序做排序,所以一樣的 URL 會排在一起。 uniq
能去重除重複的行,加上-c
選項能輸出每個去重複 URL 後的次數,輸出長這樣21104 /downloads/product_2
- 再使用
sort
排序一次,因為次數在前,所以加上-n
以次數數值排序,再用-r
做反向排序。 - 列出前 3 名。
結果長這樣:
30285 /downloads/product_1
21104 /downloads/product_2
73 /downloads/product_3
Unix 哲學
在用 Unix 分析 log 的案例中,我們使用 管線命令 (pipe) |
將所有命令串連起來,Unix pipe 的發明者 Malcolm Douglas ,在 1964 年第一次這樣描述它:
We should have some ways of connecting programs like [a] garden hose—screw in another segment when it becomes necessary to massage data in another way. This is the way of I/O also.
我們應該要有一些把程式像園藝軟管那樣連接起來的方法,當需要以另一種方式處理數據時,就擰入另一個程式片段,這也是 I/O 的方式。
這個把程式當水管連接的想法也就成為 Unix 哲學的一部份。
透明度和易於實驗
Unix 工具成功的一部份原因是它們很容易看到正在發生的事情:
- Unix 的檔案輸入通常都是不可變的,這意味者你能執行多個命令卻不會損害輸入檔案。
- 你可以在任何一個地方結束管線命令,然後馬上看到結果,這也讓工程師易於 debug。
- 很好做管線命令的階段性輸出,然後當下一個管線命令階段的輸入。
雖然 Unix 工具跟優化過的資料庫查詢相比,顯得直率、簡單,但它們仍然很有用,尤其是你想做實驗觀察資料的時候。
然而,Unix 工具最大的限制就是你只能在單台機器上執行,所以這也讓像 Hadoop 這樣的工具有用武之地。