3

https://github.com/michaelfairley/mincemeatpy/zipball/v0.1.2から例を含む mincemeat.py をダウンロードしました

example.py は次のとおりです。

#!/usr/bin/env python
import mincemeat

    data = ["Humpty Dumpty sat on a wall",
            "Humpty Dumpty had a great fall",
            "All the King's horses and all the King's men",
            "Couldn't put Humpty together again",
           ]

datasource = dict(enumerate(data))

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

ワードカウントプログラムに使用されます。

ネットワーク内の 2 台のコンピューターを LAN で接続しました。サーバーとして 1 台のコンピューターを使用し、その上で example.py を実行しました。クライアントとしての 2 台目のコンピューターで、次のコマンド ライン ステートメントを使用して mincemeat.py を実行しました。

python mincemeat.py -p changeme server-IP

それは正常に動作します。

現在、ルーターを介してLAN内の3台のコンピューターを接続しています。次に、1 台のマシンがサーバーとして機能し、その上で example.py を実行し、残りの 2 台のマシンをクライアント マシンとして実行します。

タスクを 2 台のクライアント マシンに分散したいと考えています。では、map と reduce のタスクを 2 台のコンピューターに分散するプロセスはどのようなものでしょうか。example.py で定義されたタスクを、それぞれ固有の IP を持つ 2 つのクライアント コンピューターに分散するにはどうすればよいですか?

4

1 に答える 1

2

デフォルトの例には 50 語しか含まれていません。したがって、ウィンドウを切り替えて 2 番目のクライアントを開始するまでに、最初のクライアントはテキストの処理を完了しています。代わりに、大きなテキスト ファイルで同じことを実行すると、2 番目のクライアントを追加できます。以下は動作するはずです。この例では、Project Gutenberg の小説Ulyesses (~1.5 MB)のプレーン テキスト形式を使用しました。

私のマシン (Intel Xeon@ 3.10 GHz) では、2 つのクライアントで 30 秒もかかりませんでした。そのため、より大きなファイルまたはファイルのリストを使用するか、2 番目のクライアントをすばやく起動してください。

#!/usr/bin/env python
import mincemeat

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

novel_name = 'Ulysses.txt'

# The data source can be any dictionary-like object
datasource = {novel_name:file_contents(novel_name)}

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

ファイルのディレクトリの場合は、次の例を使用します。フォルダ内のすべてのテキスト ファイルをダンプしますtextfiles

#!/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
于 2013-05-22T14:29:28.907 に答える