Java Hadoop映射任务:读取指定输入文件的内容

Java Hadoop映射任务:读取指定输入文件的内容,java,hadoop,mapreduce,cloudera,hadoop-partitioning,Java,Hadoop,Mapreduce,Cloudera,Hadoop Partitioning,我对Hadoop环境相当陌生。最近,我运行了一个基本的mapreduce程序。它很容易跑 现在,我在输入路径目录中有一个包含以下内容的输入文件 fileName1 fileName2 fileName3 ... 我需要一行一行地读取这个文件,并在指定的输出目录中创建一个具有这些名称(即fileName1、fileName2等)的新文件 我编写了下面的映射实现,但没有成功 public void map(LongWritable key, Text value, OutputCollector&

我对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();
        }
公共void映射(可长写键、文本值、OutputCollector输出、Reporter)
抛出IOException{
字符串文件名=value.toString();
字符串路径=outputFilePath+File.separator+文件名;
File newFile=新文件(路径);
newFile.mkdirs();
createNewFile();
}
有人能解释一下我错过了什么吗


谢谢

我认为您应该开始学习文件系统类,我认为您只能在分布式文件系统中创建文件。这里有一个代码示例,我打开了一个文件进行读取,您可能只需要一个FSDataOutputStream。在映射器中,可以从上下文类中获取配置

    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....
}

请阅读MR/Hadoop的基础知识,进行一些练习并发布一个查询。@PraveenSripati:请告诉我需要在这里做什么。..FSDataInputStream不推荐使用。您必须使用BufferedReader。(请参阅DataInputStream中的更多信息)