-1

我对 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();
        }

有人可以解释一下我错过了什么吗?

谢谢

4

2 回答 2

0

First of all get the path of the input directory inside your mapper with the help of FileSplit. Then append it to the name of the file which contains all these lines and read the lines of this file using FSDataInputStream. Something like this :

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....
}
于 2013-10-15T17:29:58.090 回答
0

我认为您应该开始学习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);
                    ...
    }
于 2013-10-15T11:35:38.810 回答