多个输出突然没有写入任何输出?

时间:2013-03-17 14:51:04

标签: java hadoop mapreduce elastic-map-reduce

突然多个输出没有将任何输出写入目的地。

我使用多个输出的自定义实现,其中,我刚刚更改了:

  if((ch == '/') || (ch == ':')||(ch == '-')||(ch =='.'))
      {
          continue;
      } 

在该方法中,如下所示。但同样一直在努力,突然间它无法正常工作。它没有在输出目录中写任何内容:

/家庭/用户/ mlakshm /

请帮助!!!

 private static void checkTokenName(String namedOutput) {
    if (namedOutput == null || namedOutput.length() == 0) {
      throw new IllegalArgumentException(
        "Name cannot be NULL or emtpy");
    }
    for (char ch : namedOutput.toCharArray()) {
      if ((ch >= 'A') && (ch <= 'Z')) {
        continue;
      }
      if ((ch >= 'a') && (ch <= 'z')) {
        continue;
      }
      if ((ch >= '0') && (ch <= '9')) {
        continue;
      }
      if((ch == '/') || (ch == ':')||(ch == '-')||(ch =='.'))
      {
          continue;
      }
      throw new IllegalArgumentException(
        "Name cannot be have a '" + ch + "' char");
    }
  }

1 个答案:

答案 0 :(得分:0)

您可能会注意到方法checkTokenName()是为了确保输出名称有效。现在,您正在尝试修改MultipleOutputs的不可分割的部分。首先不允许使用/:.-这样的字符有很多原因:

  1. 许多文件系统不允许 filename
  2. 中的某些字符
  3. 使用MultipleOutputs,可以写入多个文件但是在指定的目录中,而不是在任何所需的位置。
  4. 您可能已经注意到,对于以下命名输出:

    //为作业定义基于单个文本的输出“文本”  MultipleOutputs.addNamedOutput(job,“text”,TextOutputFormat.class,  LongWritable.class,Text.class); 输出文件名为text-0000,text0001等。

  5. 因此,如果你想在不同的目录中写,那么最好去覆盖MultipleTextOutputFormat;如果你不能自由使用旧API,那么你最好自己写HDFS / S3,而不是依靠hadoop来做。