MapReduce は関数型プログラミング言語から借用したパターンであり、シナリオによってはコードを大幅に簡素化できます。まず MapReduce とは何かを見てみましょう:
MapReduce は、大規模なデータセット (1TB を超える) の並列操作のために Google が提案したソフトウェア アーキテクチャです。 「マップ」と「リデュース」という概念とその主なアイデアは、関数型プログラミング言語から借用されているだけでなく、ベクトル プログラミング言語から借用された機能も含まれています。
現在のソフトウェア実装では、一連のキーと値のペアを新しい一連のキーと値のペアにマップする Map 関数を指定し、マップされたすべてのキーと値のペアが同じであることを保証する同時 Reduce 関数を指定します。それぞれが同じキーのセットを共有します。
簡単に言うと、MapReduce は処理対象の問題を Map と Reduce の 2 つの部分に分解します。処理対象のデータはシーケンスとして扱われ、各シーケンス内のデータは 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()