ホームページ  >  記事  >  バックエンド開発  >  MapReduce モードを実装する Python の例

MapReduce モードを実装する Python の例

高洛峰
高洛峰オリジナル
2016-11-21 14:45:071551ブラウズ

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()


声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。