2015-01-29 5 views
1

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

Должен ли я сделать этот результат доступным для Mapper, используя распределенный кеш, или просто прочитать его с HDFS? Что более эффективно?

Этот файл не должен быть таким большим. Идея состоит в том, чтобы просто прочитать ее на этапе настройки и сохранить ее в памяти картографа.

Благодаря

ответ

0

Если файл является не то, что большой и будет считываться в установке на картографа, DistributedCache путь вперед. Конечно, если вы не читаете что-либо еще в этой второй работе, возникает вопрос о том, почему вы используете работу MapReduce.

Чтение из HDFS (то есть потоковая передача файла в картограф через InputFormat) и использование DistributedCache имеют два совершенно разных варианта использования. DistributedCache предназначен для небольших файлов, которые могут вписываться в память, тогда как чтение в Mapper с использованием InputFormat предназначено для больших распределенных наборов данных, которые могут обрабатываться только распределенным процессом.

Если ваш набор данных достаточно мал для использования в DistributedCache, вы можете просто использовать Java-задачу для его обработки и избежать больших накладных расходов MapReduce.

+0

Данные, считываемые в настройках, используются в картографе для каждой записи, поэтому мне это нужно. Но эти данные также меняются после каждой итерации, поэтому после каждой итерации мне нужно будет поместить эти данные в распределенный кеш, а затем прочитать их из картографа следующего задания. Ваш совет все еще считается? Чтобы быть более конкретным, есть две работы. Например, первое задание генерирует некоторое число через map-reduce. Вторая работа должна прочитать это число при настройке и делить все записи на это число. Я упрощаю, но вы понимаете. Так распределенный кеш все еще или чтение с выхода? – Marko

+0

Ah OK, поэтому у вас есть большой набор данных, который считывается во второе задание, а также малый вывод из первого задания. Возможно, стоит сделать это более явным в вашем вопросе. Ответ по-прежнему распространяется на DistributedCache, если только вы не выполняете взаимодействия с одним классом драйверов, и в этом случае вы можете просто добавить один номер, который вы создаете в первом задании, в объект Configuration, а затем просто вызвать его во втором задании. –

+0

Да, вы правы, я должен был быть более явным в своем вопросе. Я выполняю итерации из одного драйвера, но я не могу поместить результат из первого задания в Configuration, потому что он не такой маленький, это не число, но набор из не более 100-1000 массивов, в то время как каждый из них имеет 400 элементов (так что несколько MB). Я также считаю, что лучше использовать распределенный кеш в случае небольших файлов, но я не уверен, потому что это не тот же файл через итерации, поэтому я должен поместить его в Распределенный кеш после первой работы на итерации. Это лучшее решение, чем читать его с HDFS? – Marko

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