Как получить имя файла/содержимое файла в качестве ввода ключа/значения для MAP при выполнении задания Hadoop MapReduce?

Я создаю программу для анализа файлов PDF, DOC и DOCX. Эти файлы хранятся в HDFS.

Когда я запускаю свою работу MapReduce, я хочу, чтобы функция карты имела имя файла в качестве ключа и двоичное содержимое в качестве значения. Затем я хочу создать потоковую программу чтения, которую я могу передать в библиотеку парсера PDF. Как я могу добиться того, чтобы пара ключ/значение для этапа сопоставления представляла собой имя файла/содержимое файла?

Я использую Hadoop 0.20.2

Это старый код, который запускает задание:

public static void main(String[] args) throws Exception {
 JobConf conf = new JobConf(PdfReader.class);
 conf.setJobName("pdfreader");

 conf.setOutputKeyClass(Text.class);
 conf.setOutputValueClass(IntWritable.class);

 conf.setMapperClass(Map.class);
 conf.setReducerClass(Reduce.class);

 conf.setInputFormat(TextInputFormat.class);
 conf.setOutputFormat(TextOutputFormat.class);

 FileInputFormat.setInputPaths(conf, new Path(args[0]));
 FileOutputFormat.setOutputPath(conf, new Path(args[1]));

 JobClient.runJob(conf);
}

Я знаю, что есть другие типы inputformat. Но есть ли тот, который делает именно то, что я хочу? Я нахожу документацию довольно расплывчатой. Если он есть, то как должны выглядеть типы входных данных функции Map?

Заранее спасибо!


person Christophe    schedule 19.04.2011    source источник
comment
Для новых читателей: обратите внимание на файлы Hadoop Archives (HAR) и Sequence, которые больше подходят для ввода в Hadoop.   -  person Christophe    schedule 16.05.2012


Ответы (3)


Решением этой проблемы является создание собственного класса FileInputFormat, который делает это. У вас есть доступ к имени входного файла из FileSplit, который получает этот FileInputFormat (getPath). Обязательно отмените isSplitable вашего FileInputformat, чтобы всегда возвращать false.

Вам также понадобится пользовательский RecordReader, который возвращает весь файл как одно значение «Record».

Будьте осторожны при работе с файлами, которые слишком велики. Вы эффективно загрузите весь файл в ОЗУ, а по умолчанию для трекера задач доступно только 200 МБ ОЗУ.

person Niels Basjes    schedule 20.04.2011
comment
Как обращаться с большими файлами? - person SRIDHARAN; 15.08.2017
comment
Просто: Выделите достаточно памяти. Если у вас есть файлы, размер которых превышает максимально возможную оперативную память, то это желание просто невыполнимо. - person Niels Basjes; 15.08.2017


Вы можете использовать WholeFileInputFormat (https://code.google.com/p/hadoop-course/source/browse/HadoopSamples/src/main/java/mr/wholeFile/?r=3)

В маппере имя файла вы можете получить с помощью этой команды:

public void map(NullWritable key, BytesWritable value, Context context) throws 
IOException, InterruptedException 
{       

Path filePath= ((FileSplit)context.getInputSplit()).getPath();
String fileNameString = filePath.getName();

byte[] fileContent = value.getBytes();

}
person Markovich    schedule 10.12.2013