Hadoop Map任务:读取指定输入文件的内容

时间:2013-10-15 10:37:00

标签: java hadoop mapreduce cloudera hadoop-partitioning

我对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 个答案:

答案 0 :(得分: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);
                    ...
    }

答案 1 :(得分:0)

首先在 FileSplit 的帮助下获取mapper中输入目录的路径。然后将其附加到包含所有这些行的文件名,并使用 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....
}