Java 创建大量多个输出

Java 创建大量多个输出,java,hadoop,mapreduce,distributed,Java,Hadoop,Mapreduce,Distributed,我正在创建大量的输出文件,例如500个。我已经被创建为异常,如下所示。当输出文件数量较少时,程序会自行恢复。例如,如果它有50个文件,尽管发生了此异常,但在多次打印此异常后,程序将成功开始运行 但是,对于许多文件,它最终会失败,出现IOException 我已粘贴错误,然后将代码粘贴到下面: 12/10/29 15:47:27 INFO mapred.JobClient: Task Id : attempt_201210231820_0235_r_000004_3, Status : FAIL

我正在创建大量的输出文件,例如500个。我已经被创建为异常,如下所示。当输出文件数量较少时,程序会自行恢复。例如,如果它有50个文件,尽管发生了此异常,但在多次打印此异常后,程序将成功开始运行

但是,对于许多文件,它最终会失败,出现
IOException

我已粘贴错误,然后将代码粘贴到下面:

 12/10/29 15:47:27 INFO mapred.JobClient: Task Id : attempt_201210231820_0235_r_000004_3, Status : FAILED
    org.apache.hadoop.ipc.RemoteException: org.apache.hadoop.hdfs.protocol.AlreadyBeingCreatedException: failed to create file /home/users/mlakshm/preopa406/data-r-00004 for DFSClient_attempt_201210231820_0235_r_000004_3 on client 10.0.1.100, because this file is already being created by DFSClient_attempt_201210231820_0235_r_000004_2 on 10.0.1.130
            at org.apache.hadoop.hdfs.server.namenode.FSNamesystem.recoverLeaseInternal(FSNamesystem.java:1406)
我已经粘贴了代码:

在Reduce方法中,我有以下逻辑来生成输出:

                      int data_hash = (int)data_str.hashCode();
                      int data_int1 = 0;
                      int k = 500;
                      int check1 = 0;
                      for (int l = 10; l>0; l++)
                      {

                       if((data_hash%l==0)&&(check1 == 0))
                       {
                       check1 = 1;
                       int range = (int) k/10;

                       String check = "true";


                      while(range > 0 && check.equals("true"))
                                        {

                                     if(data_hash % range-1 == 0)
                                        {                                                        
                                                check = "false";
                                        data_int1 = range*10;

                                     }
                                        }


                            }

                            }

                               mos.getCollector("/home/users/mlakshm/preopa407/cdata"+data_int1, reporter).collect(new Text(t+" "+alsort.get(0)+" "+alsort.get(1)), new Text(intersection));

                        PLs help!

问题是所有的reducer都试图用相同的命名方案编写文件。 它这么做的原因是

mos.getCollector("/home/users/mlakshm/preopa407/cdata"+data_int1, reporter).collect(new Text(t+" "+alsort.get(0)+" "+alsort.get(1)), new Text(intersection));
设置的文件名基于数据的特征,而不是减速器的标识

您有两个选择:

  • 修改映射作业,以便发出的键与在此作业中计算的哈希匹配。这将确保每个减速器都有一个值范围

  • 在文件名中包含一个标识符,该标识符不适用于每个映射程序。这将为每个减速器留下一组零件文件

  • 您能解释一下为什么在这里使用多个输出吗?我想你没必要

    请输入代码以获得更快的答案。我已将导致exceptionmos是Hadoop中多个输出的对象的代码部分粘贴到reduce类中。我希望输出位于不同的文件中,因为将来map reduce作业中的不同reduce类将使用不同的输出。但是,现在如果想要包含映射器/还原器所特有的标识符,我不能在job conf multipleoutput.getNamedOutput()中设置它。如果我没有在job conf中设置,那么我将得到未定义的命名输出:有什么建议吗?在我之前的评论中,请注意:这是多输出。ADAMNEDUDPUTPY,这里的诀窍是创建自定义输出格式。但是,我强烈敦促您考虑是否要在减速器中指定文件名。谢谢,它帮助了。我改变了多个输出,现在我直接写入FS,具有独特性。文件名..我不会面对这个错误。。