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

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

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

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

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

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

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

Есть мысли?

1 Ответ

1 голос
/ 13 сентября 2010

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

См .: http://discoproject.org/doc/faq.html#id7

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

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

...