示例#1
0
def mapfn(k, v):
  import sys
  sys.path.append("../dfs/")
  import client as dfs
  N = 1000

  for l in dfs.get_file_content(v):
    l = l.strip()
    if len(l) == 0:
      continue
    cols = l.split(" ")
    if len(cols) != 2 and len(cols) != 4:
      sys.stderr.write("Malformed record len=%d: %s" %(len(cols), str(l)))
      continue

    docid = cols[0]
    outlinks = [] if cols[1] == "==" else cols[1].split(",")
    if len(cols) == 4:
      rank = float(cols[2])
      iter_num = int(cols[3])
    else:
      rank = 1.0/N
      iter_num = 0

    if len(outlinks) == 0:
      for d in range(0, N):
        yield str(d), ("rank", rank/N)
    else:
      for d in outlinks:
        yield str(d), ("rank", rank / len(outlinks))
    yield docid, ("outlinks", cols[1])
    yield docid, ("iter", iter_num + 1)
def mapfn(k, v):
    import util

    filename, pagetitle = v.split(" ", 1)
    print v

    import sys

    sys.path.append("../dfs/")

    import client as dfs

    words = {}
    for l in dfs.get_file_content(filename):
        for word in l.encode("utf-8").split():
            words[word] = True
    for word in words:
        yield util.encode_term(word), filename
示例#3
0
      outlinks = v[1]
    elif v[0] == "iter":
      iter_num = v[1]
    else:
      sys.stderr.write("Malformed reduce task: key=%s value=%s" % (k, str(vs)))

  if iter_num is None:
    sys.stderr.write("Malformed reduce task (no iter num): key=%s value=%s" % (k, str(vs)))
    return
  new_rank = 0.85 * new_rank + 0.15 / N
  out_filename = "/class04/iter%d/%s" % (iter_num, WORKER_NAME)
  print "%s %s %f %d" % (k, outlinks, new_rank, iter_num)

  return out_filename

s = mincemeat.Server() 

import argparse
# читаем список файлов, из которых состоят матрицы
parser = argparse.ArgumentParser()
parser.add_argument("--toc", required = True)
args = parser.parse_args()

graph_files = [l for l in dfs.get_file_content(args.toc)]
# и подаем этот список на вход мапперам
s.map_input = mincemeat.MapInputSequence(graph_files) 
s.mapfn = mapfn
s.reducefn = reducefn

results = s.run_server(password="") 
# и записывает список документов для каждого терма во временный файл
def reducefn(k, vs):
    import util

    if len(k) > 100:
        print "Skipping posting list for term %s" % (util.decode_term(k))
        return {}
    with open("tmp/plist/%s" % k, "w") as plist:
        plist.write("\n".join(vs))
    return {}


s = mincemeat.Server()

# читаем оглавление корпуса википедии
wikipedia_files = [l for l in dfs.get_file_content("/wikipedia/__toc__")]
# и подаем этот список на вход мапперам
s.map_input = mincemeat.MapInputSequence(wikipedia_files)
s.mapfn = mapfn
s.reducefn = reducefn

results = s.run_server(password="")

# Второй Map-Reduce читает временные файлы и отображает первую букву файла в терм
def mapfn1(k, v):
    yield k[0:1], v


# свертка собирает все списки вхождений для термов, начинающихся на одну и ту же букву,
# составляет из них словарь, сериализует его и записывает в файл на DFS
def reducefn1(k, vs):