uch*_*n21 5 java reduce hadoop mapreduce hdfs
我正在尝试编写一个程序,它接受一个庞大的数据集,然后使用它运行一些查询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);
}
}
}
Run Code Online (Sandbox Code Playgroud)
我想要做的是indexfile在映射器中构建一个.这将用于由映射器访问输入文件的特定区域.映射器根据索引读取输入文件的一部分,然后将读取的部分和读取的行数打印到输出.我正在使用一台带有9个减速器的映射器.
我的问题是,是否可以创建/写入与map函数中的输出文件不同的文件,还是,reducer可以读取mapper中打开的文件吗?如果是的话,我是在正确的道路上还是完全错了,或者可能mapreduce不是这样的?如果这个问题听起来太棒了,我很抱歉,但我实际上是一个菜鸟hadoop.想学习.谢谢
您确定您使用的是单个映射器吗?因为 Hadoop 创建的映射器数量非常接近输入拆分的数量(更多详细信息)。
输入分割的概念也非常重要:这意味着非常大的数据文件被分割成几个块,每个块分配给一个映射器。因此,除非您完全确定只使用一个映射器,否则您将无法控制正在处理文件的哪一部分,并且将无法控制任何类型的全局索引。
话虽这么说,在 MapReduce 中使用单个映射器与根本不使用 MapReduce 是一样的:) 也许错误是我的,我假设你只有一个文件需要分析,是这样吗?
如果您有多个大数据文件,则场景会发生变化,为每个文件创建一个映射器可能是有意义的,但您必须创建自己的映射器InputSplit并isSplitable通过返回always 来覆盖该方法false。