hadoop从mapper写入新文件

4ngedf3f  于 2021-06-02  发布在  Hadoop
关注(0)|答案(1)|浏览(526)

我试图写一个程序,需要一个巨大的数据集,然后运行一些查询使用 mapreduce . 我有这样的代码:

public static class MRMapper
   extends Mapper<LongWritable, Text, Text, IntWritable>{
String output2="hdfs://master:9000/user/xxxx/indexln.txt";
  FileSystem Phdfs =FileSystem.get(new Configuration());
 Path fname1=new Path(output2);
BufferedWriter out=new BufferedWriter(new OutputStreamWriter(Phdfs.create(fname1,true)));
private final static IntWritable one = new IntWritable(1);
private Text word = new Text();
    long max=0;

public void map(LongWritable key, Text value, Context context
                ) throws IOException, InterruptedException {
    String binln = Long.toBinaryString(0x8000000000000000L | key).substring(1);
    out2.write(binln+"\n");
    out2.flush();
    String line = value.toString();
    String [] ST = line.split(",");
                    long val=Math.abs(Long.parseLong(ST[2]));
                    if (max < val){
                                    max= val;
                    }
                    else{
                            word.set(line);
                            context.write(word, val);
                     }
 }
}

我想做的是建立一个 indexfile 在Map绘制器中。Map程序将使用它来访问输入文件的特定区域。Map程序根据索引读取输入文件的一部分,然后将读取的部分和读取的行数打印到输出中。我使用一个Map器与9减少。
我的问题是,是否可以创建/写入与map函数中的输出文件不同的文件,以及reducer是否可以读取在mapper中打开的文件?如果是的话,我是在正确的道路上,还是完全错了,或者 mapreduce 这不是办法吗?我很抱歉,如果这个问题听起来太愚蠢,但我实际上是一个傻瓜 hadoop . 努力学习。谢谢

yk9xbfzb

yk9xbfzb1#

你确定你使用的是单个Map器吗?因为hadoop创建的Map器数量非常接近输入拆分的数量(更多细节)。
输入分割的概念也非常重要:它意味着非常大的数据文件被分割成几个chunck,每个chunck分配给一个Map器。因此,除非您完全确定只使用了一个Map器,否则您将无法控制正在处理的文件的哪一部分,也无法控制任何类型的全局索引。
话说回来,在mapreduce中使用一个mapper和根本不使用mapreduce是一样的:)也许错误是我的,我假设你只有一个文件要分析,是这样吗?
如果您有几个大数据文件,场景会发生变化,为每个文件创建一个Map器可能是有意义的,但是您必须创建自己的Map器 InputSplit 并覆盖 isSplitable 总是返回的方法 false .

相关问题