Задача Hadoop Map: чтение содержимого указанного входного файла

Я довольно новичок в среде Hadoop. Недавно я запустил базовую программу mapreduce. Было легко бежать.

Теперь у меня есть входной файл со следующим содержимым в каталоге пути ввода

fileName1
fileName2
fileName3
...

Мне нужно прочитать строки этого файла одну за другой и создать новый файл с этими именами (например, fileName1, fileName2 и т. Д.) В указанном выходном каталоге.

Я написал приведенную ниже реализацию карты, но она не сработала

public void map(LongWritable key, Text value, OutputCollector<Text, IntWritable> output, Reporter reporter)
                throws IOException {

            String fileName = value.toString();
            String path = outputFilePath + File.separator + fileName;
            File newFile = new File(path);

            newFile.mkdirs();
            newFile.createNewFile();
        }

Может кто-нибудь объяснить мне, что я пропустил?

Спасибо

2 ответа

Я думаю, вы должны начать изучать класс FileSystem, я думаю, что вы можете создавать файлы только в распределенной файловой системе. Вот пример кода, где я открыл файл для чтения, вам, вероятно, просто нужен FSDataOutputStream. В вашем маппере вы можете получить свою конфигурацию из класса Context.

    Configuration conf = job.getConfiguration();
    Path inFile = new Path(file);
    try {
        FileSystem fs;
        fs = FileSystem.get(conf);

        if (!fs.exists(inFile))
            System.out.println("Unable to open settings file: "+file);

        FSDataInputStream in = fs.open(inFile);
                    ...
    }

Прежде всего, получите путь к входному каталогу внутри вашего картографа с помощью FileSplit. Затем добавьте его к имени файла, который содержит все эти строки, и прочитайте строки этого файла, используя FSDataInputStream. Что-то вроде этого:

public void map(Object key, Text value, Context context)
                    throws IOException, InterruptedException {

        FileSplit fileSplit = (FileSplit)context.getInputSplit();
        FileSystem fs = FileSystem.get(context.getConfiguration());
        FSDataInputStream in = fs.open(new Path(fileSplit.getPath().getParent() + "/file.txt"));
        while(in.available() > 0){
                    FSDataOutputStream out = fs.create(new Path(in.readLine()));
        }
       //Proceed further....
}
Другие вопросы по тегам