为什么我的序列文件在hadoop mapper类中被读取了两次?

为什么我的序列文件在hadoop mapper类中被读取了两次?,hadoop,mapper,Hadoop,Mapper,我有一个有1264条记录的SequenceFile。每个记录的每个键都是唯一的。我的问题是,我的映射程序似乎正在读取该文件两次,或者正在读取该文件两次。为了进行健全性检查,我编写了一个小实用程序类来读取SequenceFile,实际上只有1264条记录(即SequenceFile.Reader) 在我的reducer中,每个Iterable应该只得到1条记录,但是,当我迭代Iterable(迭代器)时,每个键得到2条记录(每个键总是2条记录,而不是每个键1条或3条记录) 我的作业的日志输出如下所

我有一个有1264条记录的SequenceFile。每个记录的每个键都是唯一的。我的问题是,我的映射程序似乎正在读取该文件两次,或者正在读取该文件两次。为了进行健全性检查,我编写了一个小实用程序类来读取SequenceFile,实际上只有1264条记录(即SequenceFile.Reader)

在我的reducer中,每个Iterable应该只得到1条记录,但是,当我迭代Iterable(迭代器)时,每个键得到2条记录(每个键总是2条记录,而不是每个键1条或3条记录)

我的作业的日志输出如下所示。我不知道为什么,但为什么“要处理的总输入路径”是2?当我运行作业时,我尝试了-Dmapred.input.dir=/data和-Dmapred.input.dir=/data/part-r-00000,但进程的总路径仍然是2

欢迎提出任何意见

12/03/01 05:28:30 INFO jvm.JvmMetrics: Initializing JVM Metrics with processName=JobTracker, sessionId=
12/03/01 05:28:30 INFO input.FileInputFormat: Total input paths to process : 2
12/03/01 05:28:31 INFO mapred.JobClient: Running job: job_local_0001
12/03/01 05:28:31 INFO input.FileInputFormat: Total input paths to process : 2
12/03/01 05:28:31 INFO mapred.MapTask: io.sort.mb = 100
12/03/01 05:28:31 INFO mapred.MapTask: data buffer = 79691776/99614720
12/03/01 05:28:31 INFO mapred.MapTask: record buffer = 262144/327680
12/03/01 05:28:31 INFO mapred.MapTask: Starting flush of map output
12/03/01 05:28:31 INFO mapred.MapTask: Finished spill 0
12/03/01 05:28:31 INFO mapred.TaskRunner: Task:attempt_local_0001_m_000000_0 is done. And is in the process of commiting
12/03/01 05:28:31 INFO mapred.LocalJobRunner:
12/03/01 05:28:31 INFO mapred.TaskRunner: Task 'attempt_local_0001_m_000000_0' done.
12/03/01 05:28:31 INFO mapred.MapTask: io.sort.mb = 100
12/03/01 05:28:31 INFO mapred.MapTask: data buffer = 79691776/99614720
12/03/01 05:28:31 INFO mapred.MapTask: record buffer = 262144/327680
12/03/01 05:28:31 INFO mapred.MapTask: Starting flush of map output
12/03/01 05:28:31 INFO mapred.MapTask: Finished spill 0
12/03/01 05:28:31 INFO mapred.TaskRunner: Task:attempt_local_0001_m_000001_0 is done. And is in the process of commiting
12/03/01 05:28:31 INFO mapred.LocalJobRunner:
12/03/01 05:28:31 INFO mapred.TaskRunner: Task 'attempt_local_0001_m_000001_0' done.
12/03/01 05:28:31 INFO mapred.LocalJobRunner:
12/03/01 05:28:31 INFO mapred.Merger: Merging 2 sorted segments
12/03/01 05:28:31 INFO mapred.Merger: Down to the last merge-pass, with 2 segments left of total size: 307310 bytes
12/03/01 05:28:31 INFO mapred.LocalJobRunner:
12/03/01 05:28:32 INFO mapred.TaskRunner: Task:attempt_local_0001_r_000000_0 is done. And is in the process of commiting
12/03/01 05:28:32 INFO mapred.LocalJobRunner:
12/03/01 05:28:32 INFO mapred.TaskRunner: Task attempt_local_0001_r_000000_0 is allowed to commit now
12/03/01 05:28:32 INFO mapred.JobClient:  map 100% reduce 0%
12/03/01 05:28:32 INFO output.FileOutputCommitter: Saved output of task 'attempt_local_0001_r_000000_0' to results
12/03/01 05:28:32 INFO mapred.LocalJobRunner: reduce > reduce
12/03/01 05:28:32 INFO mapred.TaskRunner: Task 'attempt_local_0001_r_000000_0' done.
12/03/01 05:28:33 INFO mapred.JobClient:  map 100% reduce 100%
12/03/01 05:28:33 INFO mapred.JobClient: Job complete: job_local_0001
12/03/01 05:28:33 INFO mapred.JobClient: Counters: 12
12/03/01 05:28:33 INFO mapred.JobClient:   FileSystemCounters
12/03/01 05:28:33 INFO mapred.JobClient:     FILE_BYTES_READ=1320214
12/03/01 05:28:33 INFO mapred.JobClient:     FILE_BYTES_WRITTEN=1275041
12/03/01 05:28:33 INFO mapred.JobClient:   Map-Reduce Framework
12/03/01 05:28:33 INFO mapred.JobClient:     Reduce input groups=1264
12/03/01 05:28:33 INFO mapred.JobClient:     Combine output records=0
12/03/01 05:28:33 INFO mapred.JobClient:     Map input records=2528
12/03/01 05:28:33 INFO mapred.JobClient:     Reduce shuffle bytes=0
12/03/01 05:28:33 INFO mapred.JobClient:     Reduce output records=2528
12/03/01 05:28:33 INFO mapred.JobClient:     Spilled Records=5056
12/03/01 05:28:33 INFO mapred.JobClient:     Map output bytes=301472
12/03/01 05:28:33 INFO mapred.JobClient:     Combine input records=0
12/03/01 05:28:33 INFO mapred.JobClient:     Map output records=2528
12/03/01 05:28:33 INFO mapred.JobClient:     Reduce input records=2528
我的mapper类非常简单。它读取一个文本文件。在每一行中,它都会在行中附加“m”

public class MyMapper extends Mapper<LongWritable, Text, LongWritable, Text> {

 private static final Log _log = LogFactory.getLog(MyMapper.class);

 @Override
 public void map(LongWritable key, Text value, Context context) throws IOException, InterruptedException {
  String s = (new StringBuilder()).append(value.toString()).append("m").toString();
  context.write(key, new Text(s));
  _log.debug(key.toString() + " => " + s);
 }
}
public class MyReducer extends Reducer<LongWritable, Text, LongWritable, Text> {

private static final Log _log = LogFactory.getLog(MyReducer.class);

@Override
public void reduce(LongWritable key, Iterable<Text> values, Context context) throws IOException, InterruptedException {
 for(Iterator<Text> it = values.iterator(); it.hasNext();) {
  Text txt = it.next();
  String s = (new StringBuilder()).append(txt.toString()).append("r").toString();
  context.write(key, new Text(s));
  _log.debug(key.toString() + " => " + s);
  }
 }
}
我的输入数据如下所示

T, T
T, T
T, T
F, F
F, F
F, F
F, F
T, F
F, T
0   T, Tmr
0   T, Tmr
6   T, Tmr
6   T, Tmr
12  T, Tmr
12  T, Tmr
18  F, Fmr
18  F, Fmr
24  F, Fmr
24  F, Fmr
30  F, Fmr
30  F, Fmr
36  F, Fmr
36  F, Fmr
42  T, Fmr
42  T, Fmr
48  F, Tmr
48  F, Tmr
在运行我的作业之后,我得到如下输出

T, T
T, T
T, T
F, F
F, F
F, F
F, F
T, F
F, T
0   T, Tmr
0   T, Tmr
6   T, Tmr
6   T, Tmr
12  T, Tmr
12  T, Tmr
18  F, Fmr
18  F, Fmr
24  F, Fmr
24  F, Fmr
30  F, Fmr
30  F, Fmr
36  F, Fmr
36  F, Fmr
42  T, Fmr
42  T, Fmr
48  F, Tmr
48  F, Tmr
我的工作安排有问题吗?我尝试了以下方法来运行我的作业,在这种方法中,文件只被读取一次。为什么会这样?System.out.println(inpath)和System.out.println(outpath)的值是相同的!帮忙

public class MyJob2 {

public static void main(String[] args) throws Exception {
    Configuration conf = new Configuration();
    String[] otherArgs = new GenericOptionsParser(conf, args).getRemainingArgs();
    if (otherArgs.length != 2) {
      System.err.println("Usage: MyJob2 <in> <out>");
      System.exit(2);
    }

    String sInput = args[0];
    String sOutput = args[1];

    Path input = new Path(sInput);
    Path output = new Path(sOutput);

    System.out.println("input = " + input);
    System.out.println("output = " + output);

    Job job = new Job(conf, "dummy job");
    job.setMapOutputKeyClass(LongWritable.class);
    job.setMapOutputValueClass(Text.class);
    job.setOutputKeyClass(LongWritable.class);
    job.setOutputValueClass(Text.class);

    job.setMapperClass(MyMapper.class);
    job.setReducerClass(MyReducer.class);

    FileInputFormat.addInputPath(job, input);
    FileOutputFormat.setOutputPath(job, output);

    job.setJarByClass(MyJob2.class);

    int result = job.waitForCompletion(true) ? 0 : 1;
    System.exit(result);
 }
}
公共类MyJob2{
公共静态void main(字符串[]args)引发异常{
Configuration conf=新配置();
String[]otherArgs=新的GenericOptionsParser(conf,args);
if(otherArgs.length!=2){
System.err.println(“用法:MyJob2”);
系统出口(2);
}
字符串sInput=args[0];
字符串sOutput=args[1];
路径输入=新路径(sInput);
路径输出=新路径(sOutput);
System.out.println(“输入=”+输入);
System.out.println(“output=“+output”);
作业作业=新作业(conf,“虚拟作业”);
setMapOutputKeyClass(LongWritable.class);
job.setMapOutputValueClass(Text.class);
job.setOutputKeyClass(LongWritable.class);
job.setOutputValueClass(Text.class);
setMapperClass(MyMapper.class);
job.setReducerClass(MyReducer.class);
addInputPath(作业,输入);
setOutputPath(作业,输出);
job.setJarByClass(MyJob2.class);
int result=作业。等待完成(true)?0:1;
系统退出(结果);
}
}

我从hadoop邮件列表中获得了帮助。我的问题是下面这行

FileInputFormat.addInputPath(job, input);
这一行只是将输入追加回config。在注释掉这一行之后,现在只读取一次输入文件。事实上,我也注释掉了另一行

FileOutputFormat.setOutputPath(job, output);

一切都正常。

我从hadoop邮件列表中得到了帮助。我的问题是下面这行

FileInputFormat.addInputPath(job, input);
这一行只是将输入追加回config。在注释掉这一行之后,现在只读取一次输入文件。事实上,我也注释掉了另一行

FileOutputFormat.setOutputPath(job, output);

一切都正常。

我也遇到过类似的问题,但原因不同:linux显然创建了我的输入文件(~input.txt)的隐藏副本,所以这是获取此错误的第二种方法

我也遇到过类似的问题,但原因不同:linux显然创建了我的输入文件(~input.txt)的隐藏副本,所以这是获取此错误的第二种方法

嗯。。没有任何代码,无法回答此问题。如果您可以在配置作业的地方发布run()方法,我想这会很有用。如果您仍然可以访问job-conf.xml文件,那么发布job-conf.xml文件也会很有帮助。抱歉,我花了一段时间,添加了与我实际使用的类似的伪代码。即使使用伪代码,如果您复制/粘贴/构建jar并运行它,您仍然会看到每一行都被读取了两次。。没有任何代码,无法回答此问题。如果您可以在配置作业的地方发布run()方法,我想这会很有用。如果您仍然可以访问job-conf.xml文件,那么发布job-conf.xml文件也会很有帮助。抱歉,我花了一段时间,添加了与我实际使用的类似的伪代码。即使使用伪代码,如果您复制/粘贴/构建jar并运行它,您仍然会看到每一行都被读取了两次。。。。正在获取以下错误。。。。线程“main”java.io.IOException中的异常:没有在job中指定输入路径注意,他确实设置了两次输入路径,都是在命令行上使用-D命令,并使用addInputPath再次添加路径。所以你不得不选择其中的一个……而我已经试过了。。。。正在获取以下错误。。。。线程“main”java.io.IOException中的异常:没有在job中指定输入路径注意,他确实设置了两次输入路径,都是在命令行上使用-D命令,并使用addInputPath再次添加路径。因此,您必须选择其中一个。。