MapReduce 論文閱讀筆記
阿新 • • 發佈:2020-06-24
# Abstract
MapReduce :
* **programming model** 程式設計模型
* **an associated implementation for processing and generating large data sets.**
使用者只需要指定 Map(Map函式將 key/value 型別的 pair 生成中間結果的 pair) 和 Reduce 函式(Reduce 函式將所有具有相同中間結果的值組合起來)即可。
MapReduce 封裝隱藏了分散式系統平行計算的細節:
* 輸入資料的分割
* 計劃將程式分配到一組計算機中
* 處理機器故障
* 管理叢集內部的通訊
程式(in functional style)分散式的執行在大型分散式的叢集上,而且具有很好的可伸縮性 scalable。
# Introduction
過去這些年,Google一直在尋找方法來實現處理大量資料(抓取到的檔案,web日誌等)的方法,通常資料量很大而且必須分散在數以千計的電腦上來進行運算。為了處理如何使計算相互關聯,分配資料以及處理故障的問題,往往編寫大量的複雜程式碼掩蓋了他們,最初的簡單計算的初衷卻被忽略掉。
為了解決這種複雜性,抽象出了一個簡單的計算模型放到一個庫中,這個庫隱藏了可能出現的問題:
* 平行計算
* 容錯
* 資料分發
* 負載均衡
這個抽象受到了 `Lisp` 以及很多函數語言程式設計語言中存在的原語 `map`和 `reduce` 的啟發。
大多數平行計算都包含兩個步驟:
* map:將每個邏輯記錄變成 `key/value` 的中間形式方便計算
* reduce:將所有具有相同 `key` 的值組合到一起來進行合適的處理
我們使用一個函式式的程式設計模型(functional programming model)可以讓處理大型的平行計算和使用重新執行作為容錯的主要機制變得很簡單。
這項工作的主要貢獻是:提供了一個簡單但是很強大的介面(interface)讓自動化的平行計算和大規模計算的分發成為可能,結合該介面的實現,可以在商用機的大型叢集上實現高效能。
Section2 :描述了基本的程式設計模型給出幾個例子
Section3 :描述`MapReduce` 介面針對叢集運算環境的實現
Section4 :一些針對該模型的細微的改良
Section5 :針對實現設計出一系列效能衡量方法
Section6 :`MapReduce` 在 Google 中的使用,以及使用 MapReduce 來重寫生產環境的索引系統
Section7 :相關以及未來的工作
# 2 Programming Model
input: a set of `key/value` pairs
output: a set of `key/value` pairs
MapReduce 的使用者將只會使用兩個函式 `Map` 和 `Reduce`。
`Map`:使用者編寫,將輸入的 pair 變成 `k/v` 的中間 pairs,然後 MapReduce 會把具有相同 key 的 pair 送給 `Reduce` 函式
`Reduce`: 使用者編寫,接受中間結果 key 和 key 的一系列值。將這些值組合起來成為更少的 `k/v`;通常每個 Reduce 函式只輸出一個 或者 0 個值。中間結果太多無法全部放到記憶體中,可以通過迭代的方法來處理大量的 value
## 2.1 Example
設想一個需要統計檔案中每個單詞數量的一個問題,我們很可能編寫這樣的程式碼:
```java
map(String key, String value):
// key: document name
// value: document contents
for each word w in value:
EmitIntermediate(w, "1")
reduce(String key, String values):
// key: a word
// values: a list of counts
int result = 0
for each v in values
result += ParseInt(v)
Emit(AsString(result))
```
map:給每個單詞新增一個屬性(出現的次數,這裡就是1)
reduce:給每個特定的單詞加起來計算總數並且提交
此外,使用者編寫程式碼以使用輸入和輸出檔案的名稱以及可選的調整引數來填充mapreduce規範物件。然後,使用者呼叫MapReduce函式,並將其傳遞給指定物件。使用者程式碼與MapReduce庫(在C ++中實現)連結在一起。
## 2.2 Types
儘管前面虛擬碼使用 string 來寫的輸入輸出,但是從概念上說,是由使用者來指定 map 和 reduce 的型別
```c
map (k1, v1) -> list(k2, v2)
map (k2, list(v2)) -> list(v2)
```
輸入值和中間值來自不同的域,中間值和輸出值來自相同的域
C ++實現在使用者定義的函式之間來回傳遞字串,並將其留給使用者程式碼以在字串和適當的型別之間進行轉換
## 2.3 More Examples
這有一些可以使用 MapReduce 簡化的計算:
**Distributed Grep**: 分散式的匹配,map 函式提交一個符合匹配的 line, reduce 的作用只是複製中間結果到輸出
**Count of URL Access Frequency**: 網頁訪問計數,map 處理網頁請求並且輸出中間