множественный ввод в Mapper в hadoop - PullRequest
1 голос
/ 05 февраля 2012

Я пытаюсь отправить два файла в редуктор hadoop. Я пробовал DistributedCache, но все, что я положил с помощью addCacheFile в main, похоже, не возвращается с getLocalCacheFiles в маппере.

сейчас я использую FileSystem для чтения файла, но я работаю локально, поэтому я могу просто отправить имя файла. Хотите знать, как это сделать, если я работал на реальной системе Hadoop.

есть ли в любом случае отправлять значения в маппер, кроме файла, который он читает?

Ответы [ 2 ]

0 голосов
/ 05 февраля 2012

У меня также было много проблем с кешем рассылки и параметрами отправки.Для меня работают следующие параметры:

Для использования распределенного кэша: для меня было кошмаром получить URL / путь к файлу в HDFS в Map или Reduce, но с символической ссылкой это работало в методе run ()задание

DistributedCache.addCacheFile(new URI(file+"#rules.dat"), conf);
DistributedCache.createSymlink(conf);

и затем читать в заголовке Map или Reduce, перед методами

public static FileSystem hdfs;

, а затем в методе setup () Map или Reduce

hdfs = FileSystem.get(new Configuration()).open(new Path ("rules.dat"));

Для параметров: отправьте некоторые значения в Map или Reduce (это может быть имя файла для открытия из HDFS):

public int run(String[] args) throws Exception {
    Configuration conf = new Configuration();
    ...
    conf.set("level", otherArgs[2]); //sets variable level from command line, it could be a filename
    ...
}

, затем в классе Map или Reduce просто:

int level = Integer.parseInt(conf.get("level")); //this is int, but you can read also strings, etc.
0 голосов
/ 05 февраля 2012

Если распределенный кеш подходит вам - это путь.

getLocalCacheFiles работает по-разному в локальном режиме и в распределенном режиме.(это на самом деле не работает в локальном режиме).

Просмотрите эту ссылку: http://developer.yahoo.com/hadoop/tutorial/module5.html найдите фразу: В качестве предостережения:

...