【问题标题】:Creating a large number of multiple outputs创建大量的多个输出
【发布时间】:2012-10-19 04:38:42
【问题描述】:

我正在创建大量输出文件,例如 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!

【问题讨论】:

  • 请编码以获得更快的答案。
  • 我已经粘贴了reduce类中导致异常的部分代码
  • mos 是 hadoop 中 Multiple Outputs 的对象

标签: java hadoop mapreduce distributed


【解决方案1】:

问题是所有的 reducer 都在尝试使用相同的命名方案编写文件。 这样做的原因是因为

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

根据数据的特性而不是reducer的身份设置文件名。

你有几个选择:

  1. 重做您的地图作业,以便发出的密钥与您在此作业中计算的哈希值相匹配。这将确保每个减速器都有一个值范围。

    1. 在文件名中包含一个对每个映射器都唯一的标识符。这将为每个减速器留下一组零件文件。

您能否解释一下为什么在这里使用多个输出?我不认为你需要。

【讨论】:

  • 我希望输出位于不同的文件中,因为未来 map reduce 作业中不同的 reduce 类将使用不同的输出。但是,现在如果想要包含一个映射器/缩减器唯一的标识符,我无法在作业 conf MultipleOutputs.getNamedOutput() 中设置它。如果我没有在作业配置中设置它,那么我将得到未定义的命名输出。 :( 有什么建议吗?
  • 在我之前的评论中请注意:它是 MultipleOutputs.addNamedOutput
  • 是的,这里的诀窍是创建一个自定义的输出格式。但是,我强烈建议您考虑是否要在减速器中指定文件名。
  • 谢谢,它有帮助。我更改了多个输出,现在我使用唯一的文件名直接写入 fs.. 我没有遇到错误..
猜你喜欢
  • 2020-07-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-12-23
  • 2014-10-15
  • 1970-01-01
  • 2021-06-21
相关资源
最近更新 更多