Batch Processing (1) – Batch Processing with Unix Tools

本文為 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

由上到下它總共做了這些事:

  1. 讀取 log 檔案
  2. 將每一行用空白分隔,然後輸出 URL。
  3. 使用 sort 以字母順序做排序,所以一樣的 URL 會排在一起。
  4. uniq 能去重除重複的行,加上 -c 選項能輸出每個去重複 URL 後的次數,輸出長這樣 21104 /downloads/product_2
  5. 再使用 sort 排序一次,因為次數在前,所以加上 -n 以次數數值排序,再用 -r 做反向排序。
  6. 列出前 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 這樣的工具有用武之地。

tshine73
tshine73
文章: 50

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *