Обрабатываются ли каталоги символическими ссылками кэша Hadoop?

Я пытаюсь выяснить, поддерживают ли каталоги символические ссылки, созданные кешем Hadoop.

  • Хорошо работает в распределенном режиме
  • Не работает в локальном режиме
  • Javadoc/документация очень скудна и ничего не говорит об этом

Укороченная версия

Я ожидаю, что DistributedCache.addCacheFile(URI.create("file:/tmp/myfile#foo/bar"), conf) сделает /tmp/myfile доступным в текущем рабочем каталоге под именем foo/bar.

На кластере все нормально, а в локальном режиме не работает. По сути, LocalDistributedCacheManager.setup пытается создать символическую ссылку, используя ln -s /tmp/myfile $cwd/foo/bar, но foo никогда не создается.

Подробные требования

Я хочу добавить один или несколько Avro SortedKeyValueFile в распределенный кэш Hadoop.

SortedKeyValueFile похожи на Hadoop MapFile. На самом деле они представляют собой каталог, состоящий из двух файлов: файла индекса и файла данных. Эти два файла должны иметь определенное имя (index и data) и должны находиться в одном каталоге.

Если я хочу иметь возможность поместить хотя бы два из этих «файлов» в распределенный кеш, я не могу свести файлы в корневой каталог. Я должен сохранить/определить файловую иерархию.

Установка: Hadoop 2.6.0/CDH 5.4/Crunch. Поскольку я использую Crunch, мне приходится использовать устаревший API DistributedCache, поскольку Job.addCachefile() не доступен.

Вопросы, на которые нужно ответить

  • Это ошибка в локальном режиме или я злоупотребляю распределенным кешем?
  • Как люди помещают такие вещи, как MapFile или SortedKeyValueFile в кеш Hadoop?

person Clément MATHIEU    schedule 07.10.2015    source источник


Ответы (1)


Это ошибка в локальном режиме или я злоупотребляю распределенным кешем?

Распределенный кеш не поддерживается в локальном режиме. Он будет работать только в псевдораспределенном режиме или в кластерном режиме.

Как люди помещают такие вещи, как MapFile или SortedKeyValueFile, в кеш Hadoop?

Вы должны поместить все в файл и поместить его в HDFS, а в карте прочитать его из файла и поместить в хэш-карту.

Как читать из распределенного кеша:

@Override
        protected void setup(Context context) throws IOException,InterruptedException
        {
            Path[] filelist=DistributedCache.getLocalCacheFiles(context.getConfiguration());
            for(Path findlist:filelist)
            {
                if(findlist.getName().toString().trim().equals("mapmainfile.dat"))
                {

                    fetchvalue(findlist,context);
                }
            }

        }
        public void fetchvalue(Path realfile,Context context) throws NumberFormatException, IOException
        {
            BufferedReader buff=new BufferedReader(new FileReader(realfile.toString()));
           //read the file and put it in hashMap
        }

Добавление файла в распределенный кеш:

DistributedCache.addCacheFile(new URI("/user/hduser/test/mapmainfile.dat"),conf);
person Vignesh I    schedule 07.10.2015
comment
1- Вы можете поставить точку останова в LocalDistributedCacheManager.setup(), чтобы увидеть, что распределенный кеш настроен даже в локальном режиме (возможно, это ограничение Pig?). 2- SortedKeyValueFile используются намеренно, использование коллекции в памяти не является опцией. Я могу окончательно скопировать два файла в локальную файловую систему в начале каждой попытки. Но это сводит на нет эффективность распределенного кеша и потребовало бы дополнительного кода для устранения беспорядка в локальном беспорядке. - person Clément MATHIEU; 07.10.2015
comment
У него нет способа справиться с этим, вместо того, чтобы говорить об этом как об ограничении. Когда мы запускаем задание в локальном режиме, оно не создает никакого локального каталога данных, следовательно, нет места для файлов кеша. Это то, что документ (developer.yahoo.com/hadoop/tutorial/module5. html#auxdata) говорит: «В качестве предостережения: если вы используете локальный JobRunner в Hadoop (т. е. что произойдет, если вы вызовете JobClient.runJob() в программе, в которой нет или пустой файл hadoop-conf.xml доступен ), то локальный каталог данных не создается; вызов getLocalCacheFiles() вернет пустой набор результатов». - person Vignesh I; 07.10.2015
comment
Действительно, попытка каталога не создается в локальном режиме. Однако распределенный кеш уже давно поддерживает символические ссылки (должно быть включено на MR1, включено по умолчанию на MR2). Символическая ссылка создается в текущем каталоге для каждого файла. По умолчанию он имеет то же имя, что и исходный файл; но добавление фрагмента в URI позволяет вам изменить его (и AFAIU его относительный путь тоже). В локальном режиме CWD — это место, где вы запускаете JVM, и bit.ly/1NnyyHc создает символические ссылки. Однако #/foo/name поддерживается распределенным режимом, но не локальным режимом (требуется некоторый mkdir перед ln). - person Clément MATHIEU; 07.10.2015