Распределенный кэш Hadoop

Я прочитал учебные пособия от Apache и Yahoo по DistributedCache. Я все еще смущен одной вещью, хотя. Предположим, у меня есть файл, который я хочу скопировать на все узлы данных. Итак, я использую DistributedCache.addCacheFile(new URI(hdfsPath),job) в драйвере задания, чтобы сделать файл доступным. Затем я вызываю DistributedCache.getLocalCacheFiles(job) внутри своего Mapper.

Теперь я хочу создать массив в узле данных на основе содержимого этого файла, чтобы при каждом запуске map() он мог обращаться к элементам массива. Я могу сделать это? Я в замешательстве, потому что, если я прочитаю кэшированный файл и создам массив в классе Mapper, кажется, что он будет создавать массив для каждого нового ввода в Mapper, а не только один раз для каждого Mapper. Как на самом деле работает эта часть (т.е. где/когда я должен создать массив)?


person occasionalUser    schedule 25.04.2012    source источник
comment
Я думаю, что, возможно, нашел ответ на свой вопрос. Похоже, что метод configure() автоматически вызывается при создании экземпляра Mapper. Таким образом, для создания массива следует использовать configure(). Это вне метода map(), поэтому это происходит только один раз. Я надеюсь, что это правильно!   -  person occasionalUser    schedule 25.04.2012


Ответы (1)


Здесь смешано несколько понятий. Datanode не имеет прямого отношения к DistributedCache. Это концепция слоя MapReduce.
Желание повторно использовать один и тот же производный файл из кэша между преобразователями несколько противоречит функциональной природе парадигмы MR. Картографы должны быть логически независимыми.
То, что вам нужно, это своего рода оптимизация, которая имеет смысл, если предварительная обработка кэшированного файла для картографов относительно дорогая
Вы можете сделать это в некоторой степени, сохранив предварительно обработанные данные в какой-то статической переменной, ленивая оценка, и настроить hadoop на повторное использование виртуальных машин между задачами. Это не решение духа "MR", но оно должно работать.
Лучшим решением будет предварительная обработка кэшированного файла до формы, при которой его использование маппером будет дешевым.
Давайте предположим, что вся идея является своего рода оптимизацией - в противном случае чтение и обработка файла для каждого сопоставления просто прекрасны.
Можно констатировать, что если подготовка файла для каждого маппера намного дешевле, чем сама обработка карты, или намного дешевле, чем накладные расходы на запуск маппера - все в порядке.
Под формой я подразумеваю формат файла, который может быть очень эффективно преобразован в нужную нам структуру в памяти. Например, если нам нужен поиск в данных, мы можем хранить данные уже отсортированными. Это избавит нас от сортировки каждый раз, что, как правило, гораздо дороже, чем последовательное чтение с диска
Если в вашем случае это свойства в каком-то скромном количестве (пусть тысячи) могу предположить, что их чтение и инициализация не имеют существенного значения по сравнению с одним картографом

person David Gruzman    schedule 25.04.2012
comment
Я хочу, чтобы Картографы были независимыми. Я просто хочу, чтобы у каждого из них была копия одних и тех же данных (например, идентификатор пользователя из ввода передается как ключ, и у меня есть некоторые свойства пользователя, хранящиеся в файле, к которому я хочу получить доступ). Я подумал, что вместо того, чтобы каждый раз передавать свойства как часть ввода, было бы лучше указать их один раз (для всех пользователей) в одном файле на каждом узле. Я не уверен, что понимаю, что вы имели в виду под предварительной обработкой кэшированного файла в форме. Можете ли вы объяснить, что вы подразумеваете под формой здесь? - person occasionalUser; 25.04.2012
comment
Я добавил некоторые пояснения к ответу. - person David Gruzman; 25.04.2012
comment
Спасибо за дополнительное пояснение! - person occasionalUser; 25.04.2012