Disco/MapReduce: использование результатов предыдущей итерации в качестве входных данных для новой итерации

В настоящее время я реализую PageRank на дискотеке. В качестве итерационного алгоритма результаты одной итерации используются в качестве входных данных для следующей итерации.

У меня есть большой файл, который представляет все ссылки, где каждая строка представляет страницу, а значения в строке представляют страницы, на которые она ссылается.

Для Диско я разбиваю этот файл на N кусков, затем запускаю MapReduce в течение одного раунда. В результате я получаю набор (page, rank) кортежей.

Я хотел бы скормить это звание к следующей итерации. Тем не менее, теперь мой картограф нуждается в двух входных данных: графическом файле и страницах.

  1. Я хотел бы "сжать" вместе файл графика и ранги страниц, чтобы каждая строка представляла страницу, ее рейтинг и ссылки.
  2. Так как этот файл графа разделен на N порций, мне нужно разделить вектор PageRank на N параллельных порций и сжать области векторов PageRank на порции графа.

Все это кажется более сложным, чем необходимо, и, как довольно простая операция (с наиболее существенным алгоритмом mapreduce), мне кажется, что я упускаю что-то в Disco, что действительно может упростить подход.

Какие-нибудь мысли?

1 ответ

Похоже, вы захотите использовать init_map для первого прохода, а затем iter_map для каждой последующей итерации.

Смотрите: http://discoproject.org/doc/faq.html

Можете ли вы вывести объект python, который включает исходящие ссылки вместо просто кортежей (page,rank)?

Другой вариант заключается в том, чтобы исходящие ссылки указывались где-то на странице (dict, memcache, kyotocabinet и т. Д.) И просматривали их с помощью функции отображения. Если вы объединяете вещи с помощью Disco, я не думаю, что вы захотите объединить вещи в середине рабочего процесса.

Другие вопросы по тегам