MapReduce是一種從函數式編程語言借鑑過來的模式,在某些場景下,它能夠極大地簡化代碼。先看一下什麼是MapReduce:編程
MapReduce是Google提出的一個軟件架構,用於大規模數據集(大於1TB)的並行運算。概念「Map(映射)」和「Reduce(概括)」,及他們的主要思想,都是從函數式編程語言借來的,還有從矢量編程語言借來的特性。
當前的軟件實現是指定一個Map(映射)函數,用來把一組鍵值對映射成一組新的鍵值對,指定併發的Reduce(概括)函數,用來保證全部映射的鍵值對中的每個共享相同的鍵組。
簡單來講,MapReduce就是把待處理的問題分解爲Map和Reduce兩個部分。而待處理的數據做爲一個序列,每個序列裏的數據經過Map的函數進行運算,再經過Reduce的函數進行聚合成最終的結果。架構
下面使用mapreduce模式實現了一個簡單的統計日誌中單詞出現次數的程序:併發
from functools import reduce from multiprocessing import Pool from collections import Counter def read_inputs(file): for line in file: line = line.strip() yield line.split() def count(file_name): file = open(file_name) lines = read_inputs(file) c = Counter() for words in lines: for word in words: c[word] += 1 return c def do_task(): job_list = ['log.txt'] * 10000 pool = Pool(8) return reduce(lambda x, y: x+y, pool.map(count, job_list)) if __name__ == "__main__": rv = do_task()