Я нахожусь в процессе перехода на 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 и, следовательно, необходимо повторно сопоставить эти имена файлов с фрагментами и распространить как таковые на остальную часть программа?
Есть ли более простой способ управлять этим?