Задача 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....
}