2013-09-28 3 views
1

Я создал следующий код:Mincemeat.py - DataSource разделение файлов

#!/usr/bin/env python 
import mincemeat 
import glob 

all_files = glob.glob('textfiles/*.txt') 

def file_contents(file_name): 
    f = open(file_name) 
    try: 
     return f.read() 
    finally: 
     f.close() 

# The data source can be any dictionary-like object 
datasource = dict((file_name, file_contents(file_name)) 
        for file_name in all_files) 

def mapfn(k, v): 
    for w in v.split(): 
     yield w, 1 

def reducefn(k, vs): 
    result = sum(vs) 
    return result 

s = mincemeat.Server() 
s.datasource = datasource 
s.mapfn = mapfn 
s.reducefn = reducefn 

results = s.run_server(password="changeme") 
print results 

Я бегу это на моем личном макинтош и работает клиент на той же машине. Однако, мой вопрос заключается в том, что если я запускаю несколько клиентов на нескольких компьютерах, будут ли файлы разделены автоматически? Я имею в виду, будет ли сервер mincemeat присваивать файлы клиентам для обработки? Кроме того, в приведенном выше примере я не указываю ключ в функции mapper. Как указать ключ, например. имя файла?

ответ

1

Да, фарш будет автоматически распределять работу равномерно по клиентам (это одна из основных целей MapReduce).

В вашей картографической функции каждый вызов с выходом дает ключ и значение. В этом примере ключ - это слово, которое вы в настоящее время повторяете.

+0

Спасибо, Майкл за ваш ответ. Что касается ключевого вопроса, на самом деле я хотел знать, что как в mapfn я могу назначить имя файла параметру k. Короче, как mincemeat знает, что k - это имя файла, а v - строка в файле. Мы нигде не указали его. Благодарю. –

Смежные вопросы