Файлы кэширования Hadoop DistributedCache без абсолютного пути?

Я нахожусь в процессе перехода на YARN, и кажется, что поведение DistributedCache изменилось.

Раньше я бы добавил некоторые файлы в кеш следующим образом:

for (String file : args) {
   Path path = new Path(cache_root, file);
   URI uri = new URI(path.toUri().toString());
   DistributedCache.addCacheFile(uri, conf);
}

Путь обычно выглядит так

/some/path/to/my/file.txt

Который ранее существовал в HDFS и, по сути, оказался бы в DistributedCache как

/$DISTRO_CACHE/some/path/to/my/file.txt

Я мог бы сделать символическую ссылку на него в моем текущем рабочем каталоге и использовать с DistributedCache.getLocalCacheFiles()

С YARN кажется, что этот файл вместо этого попадает в кеш как:

/$DISTRO_CACHE/file.txt

т. е. часть «пути» URI файла была удалена, и осталось только имя файла.

Как работает с разными абсолютными путями, заканчивающимися одним и тем же именем файла? Рассмотрим следующий случай:

DistributedCache.addCacheFile("some/path/to/file.txt", conf);
DistributedCache.addCacheFile("some/other/path/to/file.txt", conf);

Возможно, кто-то мог бы использовать фрагменты:

DistributedCache.addCacheFile("some/path/to/file.txt#file1", conf);
DistributedCache.addCacheFile("some/other/path/to/file.txt#file2", conf);

Но это кажется излишне сложным в управлении. Представьте себе сценарий, в котором это аргументы командной строки, вам каким-то образом нужно управлять этими двумя именами файлов, хотя разные абсолютные пути определенно будут конфликтовать в DistributedCache и, следовательно, необходимо повторно сопоставить эти имена файлов с фрагментами и распространить как таковые на остальную часть программа?

Есть ли более простой способ управлять этим?


person cobralucha    schedule 17.03.2015    source источник


Ответы (1)


Попробуйте добавить файлы в Job

Скорее всего, это то, как вы на самом деле настраиваете задание, а затем получаете к ним доступ в Mapper.

Когда вы настраиваете работу, вы собираетесь сделать что-то вроде

    job.addCacheFile(new Path("cache/file1.txt").toUri());
    job.addCacheFile(new Path("cache/file2.txt").toUri());

Затем в вашем коде сопоставления URL-адреса будут храниться в массиве, к которому можно получить доступ следующим образом.

    URI file1Uri = context.getCacheFiles()[0];
    URI file2Uri = context.getCacheFiles()[1];

Надеюсь, это поможет вам.

person Gaurav Mishra    schedule 17.03.2015
comment
Это тоже сработает, но получить файлы на самом деле не проблема. Часть, где он отбрасывает относительный путь, делает его проблематичным по двум причинам: если файл был аргументом, я не могу просто распространить аргумент, поскольку он не будет найден (путь отброшен). Также 2 файла с одинаковым именем файла (но разными путями) теперь конфликтуют (без каких-либо исключений или ошибок). Это не было проблемой до YARN, так как путь был добавлен как есть в DistributedCache. - person cobralucha; 18.03.2015