【问题标题】:Hadoop writing to a new file from mapperHadoop 从映射器写入新文件
【发布时间】:2015-07-17 19:38:58
【问题描述】:

我正在尝试编写一个程序,该程序需要一个庞大的数据集,然后使用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。映射器将使用它来访问输入文件的特定区域。映射器根据索引读取输入文件的一部分,然后将读取的部分和读取的行数打印到输出。我正在使用一个带有 9 个减速器的映射器。

  • 我的问题是,是否可以在 map 函数中创建/写入与输出文件不同的文件,并且 reducer 是否可以读取在 mapper 中打开的文件?如果是,我是在正确的道路上还是完全错误的,或者mapreduce 不是这样的方式?如果这个问题听起来太菜鸟,我深表歉意,但我实际上是 hadoop 的菜鸟。努力学习。谢谢

【问题讨论】:

    标签: java hadoop mapreduce hdfs reduce


    【解决方案1】:

    您确定您使用的是单个映射器吗?因为 Hadoop 创建的映射器数量非常接近输入拆分的数量 (more details)。

    输入分割的概念也很重要:它意味着非常大的数据文件被分割成几个块,每个块分配给一个映射器。因此,除非您完全确定只使用了一个映射器,否则您将无法控制正在处理文件的哪一部分,并且您将无法控制任何类型的全局索引。

    话虽如此,在 MapReduce 中使用单个映射器与根本不使用 MapReduce 是一样的 :) 也许是我的错误,我假设您只有一个要分析的文件,是这样吗?

    如果您有多个大数据文件,场景会发生变化,为每个文件创建一个映射器可能有意义,但您必须创建自己的 InputSplit 并通过返回覆盖 isSplitable 方法总是false

    【讨论】:

    • 谢谢。是的,我有一个大小为 50GB 的文件。所以最好的选择是不使用 MapReduce?
    • 由于您的需要,大数据文件好像不能拆分。因此,恕我直言,使用 MapReduce 没有任何意义,因为您将只强制使用一个映射器,最终与使用单个“传统”过程相同。 MapReduce 的强大之处在于将问题拆分为更小的问题,这些问题的过程分布在整个机器集群中。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-01-06
    • 1970-01-01
    • 1970-01-01
    • 2011-04-12
    • 2017-03-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多