Disco/MapReduce: использование результатов предыдущей итерации в качестве входных данных для новой итерации
В настоящее время я реализую PageRank на дискотеке. В качестве итерационного алгоритма результаты одной итерации используются в качестве входных данных для следующей итерации.
У меня есть большой файл, который представляет все ссылки, где каждая строка представляет страницу, а значения в строке представляют страницы, на которые она ссылается.
Для Диско я разбиваю этот файл на N кусков, затем запускаю MapReduce в течение одного раунда. В результате я получаю набор (page, rank) кортежей.
Я хотел бы скормить это звание к следующей итерации. Тем не менее, теперь мой картограф нуждается в двух входных данных: графическом файле и страницах.
- Я хотел бы "сжать" вместе файл графика и ранги страниц, чтобы каждая строка представляла страницу, ее рейтинг и ссылки.
- Так как этот файл графа разделен на N порций, мне нужно разделить вектор PageRank на N параллельных порций и сжать области векторов PageRank на порции графа.
Все это кажется более сложным, чем необходимо, и, как довольно простая операция (с наиболее существенным алгоритмом mapreduce), мне кажется, что я упускаю что-то в Disco, что действительно может упростить подход.
Какие-нибудь мысли?
1 ответ
Похоже, вы захотите использовать init_map для первого прохода, а затем iter_map для каждой последующей итерации.
Смотрите: http://discoproject.org/doc/faq.html
Можете ли вы вывести объект python, который включает исходящие ссылки вместо просто кортежей (page,rank)?
Другой вариант заключается в том, чтобы исходящие ссылки указывались где-то на странице (dict, memcache, kyotocabinet и т. Д.) И просматривали их с помощью функции отображения. Если вы объединяете вещи с помощью Disco, я не думаю, что вы захотите объединить вещи в середине рабочего процесса.