大數據:MapReduce

開放

3.1 大數據一詞的出現歷史

大數據這個詞出現的時間相對較晚。谷歌趨勢顯示自 2011 年以來該短語的使用開始積極增長:

同時,現在只有懶人不使用這個詞。特別是,營銷人員經常不恰當地使用該術語。那麼大數據究竟是什麼?由於我決定係統地陳述和突出這個問題,因此有必要定義這個概念。

在我的實踐中,我遇到了不同的定義:

  • 大數據是指超過 100GB 的數據(500GB、1TB,任何你喜歡的)。
  • 大數據是無法在 Excel 中處理的數據。
  • 大數據是無法在單台計算機上處理的數據。

甚至這些:

  • 大數據通常是任何數據。
  • 大數據並不存在,它是營銷人員發明的。

我會堅持維基百科的定義:

大數據是一系列處理海量和顯著多樣性的結構化和非結構化數據的途徑、工具和方法,以便在持續增長、分佈在計算機網絡的眾多節點、形成的條件下獲得人類可感知的有效結果。在 2000 年代後期,替代傳統數據庫管理系統和商業智能類的解決方案。

因此,通過大數據,我將理解的不是一些特定數量的數據,甚至不是數據本身,而是處理它們的方法,這些方法允許對信息進行分佈式處理。這些方法既可以應用於大數據集(比如互聯網上所有頁面的內容),也可以應用於小數據集(比如本講的內容)。

以下是可能需要大數據技術的數據源的一些示例:

  • 上網用戶行為日誌
  • 運輸公司汽車的 GPS 信號
  • 從大型強子對撞機中的傳感器獲取的數據
  • 俄羅斯國家圖書館的數字化圖書
  • 所有銀行客戶的交易信息
  • 有關大型零售連鎖店中所有採購的信息等。

數據源的數量正在快速增長,這意味著對數據處理技術的需求越來越大。

3.2 大數據原理

根據大數據的定義,我們可以製定處理此類數據的基本原則:

1.橫向可擴展性。由於可以有任意大的數據量,任何涉及處理大數據的系統都必須是可擴展的。數據量增加了 2 倍——集群中的 iron 數量增加了 2 倍,一切都在繼續工作。

2. 容錯。水平可擴展性原則意味著集群中可以有很多機器。例如,Yahoo 的 Hadoop 集群擁有超過 42,000 台機器(您可以在此鏈接中查看跨組織的集群規模)。這意味著其中一些機器肯定會發生故障。大數據實踐需要意識到這些中斷並在沒有任何重大後果的情況下倖免於難。

3. 數據局部性。在大型分佈式系統中,數據分佈在大量機器上。如果數據物理上位於一台服務器上並在另一台服務器上進行處理,則數據傳輸的成本可能會超過處理本身的成本。因此,設計大數據解決方案的最重要原則之一就是數據局部性原則——如果可能,我們在存儲數據的同一台機器上處理數據。

所有現代大數據工具都以某種方式遵循這三個原則。為了遵循它們,有必要提出一些開發數據開發工具的方法、方法和範例。我將在今天的講座中分析最經典的方法之一。

3.3 MapReduce

MapReduce是Google提出的一種分佈式數據處理模型,用於在計算機集群上處理大量數據。下圖很好地說明了 MapReduce:

MapReduce 假設數據被組織成一些記錄。數據處理分 3 個階段進行:

1.地圖階段。在此階段,使用用戶定義的 map() 函數對數據進行預處理。該階段的工作是對數據進行預處理和過濾。該操作與函數式編程語言中的映射操作非常相似——自定義函數應用於每個輸入記錄。

應用於單個輸入記錄的 map() 函數會生成許多鍵值對。Set——即它可以只返回一條記錄,也可以什麼都不返回,也可以返回幾個鍵值對。key 和 value 是什麼由用戶決定,但是 key 是很重要的東西,因為以後只有一個 key 的數據會落到 reduce 函數的一個實例中。

2.舞台洗牌。它不會被用戶注意到。在這個階段,map 函數的輸出是“binned”——每個 bin 對應於 map 階段的一個輸出鍵。將來,這些籃子將作為 reduce 的輸入。

3.階段減少。在洗牌階段生成的每個具有值的“籃子”都會進入 reduce() 函數的輸入。

reduce 函數由用戶給出併計算單個“籃子”的最終結果。reduce()函數返回的所有值的集合就是MapReduce任務的最終結果。

關於 MapReduce 的一些額外事實:

  1. map函數的所有運行都獨立工作並且可以並行運行,包括在不同的集群機器上運行。
  2. reduce函數的所有運行都獨立工作並且可以並行運行,包括在不同的集群機器上。
  3. Shuffle在內部代表了一種並行排序,所以它也可以工作在不同的集群機器上。第 1-3 點允許您實施水平可擴展性原則
  4. map函數通常用在存儲數據的同一台機器上——這減少了數據在網絡上的傳輸(數據局部性原理)。
  5. MapReduce 始終是全數據掃描,沒有索引。這意味著當需要非常快的響應時,MapReduce 的適用性很差。

3.4 使用 MapReduce 有效解決的任務示例

字數

讓我們從經典任務開始——字數統計。任務制定如下:有大量文檔。任務是計算每個在語料庫中至少出現一次的單詞在語料庫中出現的總次數。

解決方案:

由於我們有大量文檔,因此讓一個文檔成為 MapRreduce 任務的一個輸入記錄。在 MapReduce 中,我們只能定義用戶定義的函數,我們將這樣做(我們將使用類似 python 的偽代碼):

def map(doc): 
for word in doc: 
yield word, 1 
def reduce(word, values): 
yield word, sum(values) 

map函數將輸入文檔轉換為一組對 (word, 1),對我們透明地混洗將其轉換為對 (word, [1,1,1,1,1,1]), reduce對這些對求和,返回這個詞的最終答案。

處理廣告系統日誌

第二個例子取自Data-Centric Alliance的真實實踐。

任務:廣告系統的 csv 日誌格式如下:

<user_id>,<country>,<city>,<campaign_id>,<creative_id>,<payment></p> 
 
11111,RU,Moscow,2,4,0.3 
22222,RU,Voronezh,2,3,0.2 
13413,UA,Kyiv,4,11,0.7 
… 

有必要計算在俄羅斯城市展示廣告的平均成本。

解決方案:

def map(record): 
user_id, country, city, campaign_id, creative_id, payment = record.split(",") 
payment=float(payment) 
if country == "RU": 
yield city, payment 
def reduce(city, payments): 
yield city, sum(payments)/len(payments) 

map函數檢查我們是否需要這個條目——如果需要,它只留下必要的信息(城市和支付金額)。reduce函數計算該城市的最終答案,給出該城市的所有付款列表。

留言
  • 受歡迎
你必須登入才能留言
此頁面尚無留言