Получение имени файла в картографе Hadoop с использованием Hadoop Pipes

Как я могу получить имя входного файла, который выполняется в hadoop mapper в Hadoop Pipes?

Я могу легко получить имя файла в редукторе карт на основе Java, например

FileSplit fileSplit = (FileSplit)context.getInputSplit(); Строка имя файла = fileSplit.getPath().getName(); System.out.println("Имя файла"+имя файла); System.out.println("Каталог и имя файла"+fileSplit.getPath().toString());

но как я могу попасть в С++;

Пожалуйста, помогите мне

Спасибо


person surya    schedule 24.12.2012    source источник


Ответы (6)


Для заданий потоковой передачи/каналов конфигурация задания сериализуется для обработки переменных среды.

Свойство конфигурации задания, определяющее входной файл, называется map.input.file. Файл PipeMapRed, который запускает программу C++, отвечает за эту сериализацию (метод configure, строка 151) и обеспечивает экранирование имен свойств конфигурации задания (строка addJobConfToEnvironment метода 206/266) - это означает, что все символы, отличные от a-Za-z0-9, заменяются символами подчеркивания (метод safeEnvVarName, строки 276/284) - поэтому фактическая переменная среды, которую вы ищете в своей программе на С++, будет называться map_input_file.

Я не программист на С++, поэтому не могу рассказать вам, как получить переменные окружения, но уверен, что это достаточно просто.

person Chris White    schedule 27.12.2012
comment
Я обнаружил, что в моем задании на хаупе, согласно системному журналу, PipeMapRed занимает большую часть всего времени работы, это около 10 минут, а процесс сопоставления занимает менее 1 минуты, почему? - person Alcott; 03.04.2013

Если вы используете HADOOP 2.x с Python:

file_name = os.environ['mapreduce_map_input_file']
person Boggio    schedule 26.06.2014

Анализируя переменную среды mapreduce_map_input_file(новая) или map_input_file(устаревшая), можно получить имя входного файла карты.

Примечание.
Две переменные среды чувствительны к регистру, все буквы должны быть строчными.

person zeekvfu    schedule 23.07.2014

Выяснил, как это сделать в Python:

import os
filename = os.environ['map_input_file']

имя файла — это переменная, которую вы хотите — это даст вам имя файла, над которым работает картограф.

Некоторые другие полезные переменные среды:

  • mapred_job_id = полный идентификатор задания
  • mapred_tip_id = идентификатор этой конкретной задачи сопоставления или редьюсера
person Suman    schedule 07.03.2013

Я боролся с той же проблемой. И я нашел решение.

void map(HadoopPipes::MapContext& context) {                                                                                         
    string path;
    path = context.getInputSplit();                                                                                                    
    path.erase(path.end()-1);
}

Я разместил только чтение части имени файла. Метод getInputSplit() возвращает полный путь к файлу + какой-то неизвестный символ в конце. Мне нужен чистый путь к файлу, поэтому удалите конечный символ строки. Я понятия не имею, почему в конец строки добавляется символ weired, но давайте воспользуемся им, просто удалив конечный символ~!

person Joffrey    schedule 25.03.2014

Ниже код сможет распечатать имя файла

filepath = os.environ['mapreduce_map_input_file']

filename = os.path.split(filepath)[-1]

print filename
person Sridhar Pothamsetti    schedule 28.06.2020
comment
Пожалуйста, не добавляйте один и тот же ответ на несколько вопросов. Ответьте на лучший и пометьте остальные как дубликаты. См. раздел Можно ли добавлять повторяющиеся ответы на несколько вопросов? - person Machavity♦; 28.07.2020