2013-10-01 2 views
3

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

a b 
a c 
b c 
b d 

Я использую подход, основанный на Graph, который рассматривает слова как узлы и сопутствующие слова есть ребро между ними. Мой алгоритм должен вычислить степень всех узлов. Я успешно написал Map-Reduce работу, чтобы вычислить общую степень, которая выводит следующее:

a 2 
b 3 
c 2 
d 1 

В настоящее время вывод записывается обратно в файл, но то, что я хочу вместо этого, чтобы захватить результат в, скажем, java.util.HashMap. Затем я хочу использовать это HashMap в другом задании Reduce, чтобы вычислить окончательное сходство.

Вот мои вопросы:

  1. Можно ли захватить результаты сократить работу в памяти (List, Map). Если да, то как?
  2. Это лучший подход? Если нет, как мне с этим справиться?
+0

Если я правильно понял, вам нужен как вход вашего первого задания, так и вывод вашего первого задания для запуска второго? В любом случае должно быть возможно просто каскадировать два задания. Насколько велика будет ожидаемая хэшмап? (вы могли бы поставить его в распределенный кеш для второго задания) – DDW

+0

Вы правы! Мне нужно как вход первого задания, так и вывод первого задания для выполнения второго задания. HashMap может занимать до нескольких десятков тысяч записей. – codemaniac

ответ

1

Есть две возможности: или вы читаете данные в своей карте/сокращаете задачу из распределенной файловой системы. Или вы добавляете его непосредственно в распределенный кеш. Я просто гугл распределенного размера кэша, и его можно контролировать: «Параметр local.cache.size контролирует размер DistributedCache По умолчанию он установлен в 10 Гб.»

Link to cloudera blog

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

Добавление файла в распределенной кэш происходит следующим образом:

ЧИТАТЬ в вашем картографа:

Path[] uris = DistributedCache.getLocalCacheFiles(context.getConfiguration()); 
String patternsFile = uris[0].toString(); 
BufferedReader in = new BufferedReader(new FileReader(patternsFile)); 

ДОБАВИТЬ в DbCache:

DistributedCache.addCacheFile(new URI(file), job.getConfiguration()); 

время создавая вторую работу.

Дайте мне знать, если это трюк.

+0

Если это отвечает на ваш вопрос, пожалуйста, принимайте как ответ, чтобы закрыть ' – DDW

Смежные вопросы