Hadoop 如何在Mapreduce中为1个文本文件设计1个映射器

Hadoop 如何在Mapreduce中为1个文本文件设计1个映射器,hadoop,mapreduce,Hadoop,Mapreduce,我正在hadoop 2.9.0上运行Mapreduce 我的问题是: 我有一些文本文件,大约10-100个文本文件。每个文件的大小都非常小,但由于我的逻辑问题,我需要一个映射器来处理一个文本文件。这些映射器的结果将由我的还原器聚合 我需要设计使映射器的数量始终等于文件的数量。如何在Java代码中做到这一点?我需要扩展什么样的函数 非常感谢 我不得不做一些非常类似的事情,也遇到了类似的问题。 我实现这一点的方法是输入一个文本文件,其中包含每个文件的路径,例如,文本文件将包含此类信息: /path/

我正在hadoop 2.9.0上运行Mapreduce

我的问题是:

我有一些文本文件,大约10-100个文本文件。每个文件的大小都非常小,但由于我的逻辑问题,我需要一个映射器来处理一个文本文件。这些映射器的结果将由我的还原器聚合

我需要设计使映射器的数量始终等于文件的数量。如何在Java代码中做到这一点?我需要扩展什么样的函数


非常感谢

我不得不做一些非常类似的事情,也遇到了类似的问题。 我实现这一点的方法是输入一个文本文件,其中包含每个文件的路径,例如,文本文件将包含此类信息:

/path/to/filea
/path/to/fileb
/a/different/path/to/filec
/a/different/path/to/another/called/filed
我不确定您希望地图绘制者具体做什么,但在创建作业时,您希望执行以下操作:

public static void main( String args[] ) {
    Job job = Job.getInstance(new Configuration(), 'My Map reduce application');
    job.setJarByClass(Main.class);
    job.setMapperClass(CustomMapper.class);
    job.setInputFormatClass(NLineInputFormat.class);
    ...
}
您的CustomMapper.class将像这样扩展映射器:

public class CustomMapper extends Mapper<LongWritable, Text, <Reducer Key>, <Reducer Value> {

    public void map(LongWritable key, Text value, Context context) throws IOException, InterruptedException {
        Configuration configuration = context.getConfiguration();
        ObjectTool tool = new ObjectTool(configuration, new Path(value.toString()));

        context.write(<reducer key>, <reducer value>);
    }

}
其中ObjectTool是另一个类,它处理您想要对文件实际执行的操作

让我大致解释一下它在做什么,这里的魔力是job.setInputFormatClassNLineInputFormat.class,但它到底在做什么

它实质上是接受您的输入,并按每行分割数据,然后将每行数据发送给映射器。通过让文本文件以新行包含每个文件,可以在映射器和文件之间创建1:1的关系。此设置的一个重要补充是,它允许您为要处理的文件创建高级工具

我用它在HDFS中创建了一个压缩工具,当我研究这种方法时,很多人基本上都是将文件读入标准输出并以这种方式进行压缩,然而,当对原始文件和正在压缩和解压缩的文件进行校验和时,结果是不同的。这是由于这些文件中的数据类型造成的,并且没有简单的方法实现可写字节。可以看到有关文件分类的信息

该链接还引用了以下内容:

public static void main( String args[] ) {
    Job job = Job.getInstance(new Configuration(), 'My Map reduce application');
    job.setJarByClass(Main.class);
    job.setMapperClass(CustomMapper.class);
    job.setInputFormatClass(NLineInputFormat.class);
    ...
}
org.apache.hadoop.mapred.lib.NLineInputFormat是这里的魔法。它基本上告诉作业为每个映射任务提供一个文件


希望这有帮助

谢谢你的帮助。根据您的建议,我了解了有关NLineInputFormat的更多信息。如果我有一个文件,其中每一行都是不同的内容,我可以通过如下设置使每个内容都有映射器,对吗?:job.setInputFormatClassNLineInputFormat.class;NLineInputFormat.addInputPathjob,新路径参数[0];job.getConfiguration.setIntmapreduce.input.lineinputformat.LinesMap,1;job.getConfiguration.setIntmapreduce.input.lineinputformat.LinesMap,1;不应该是必要的,因为这正是NLineInputFormat为您所做的。至于你的其他代码,那应该没问题。我可能会尝试FileInputFormat.setInputPathsjob,新的Pathargs[0];相反,只是检查一下这是否对你有效?如果是这样的话,对那些做出贡献的人来说,获得他们应得的声誉是件好事。如果这对你有效,那么将这个问题标记为已接受的答案并投票是使用SO时应该做的事情