0

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

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

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

在方法中,如下图。但同样的工作一直在工作,突然间它不工作了。它没有向输出目录写入任何内容:

/home/用户/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");
    }
  }
4

1 回答 1

0

您可能会注意到,该方法checkTokenName()是确保输出名称有效。现在,您正在尝试修改MultipleOutputs您不应该修改的非常完整的部分。首先,不允许使用/,和等字符的原因有很多::.-

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

    // 为作业定义额外的基于单个文本的输出'text' MultipleOutputs.addNamedOutput(job, "text", TextOutputFormat.class, LongWritable.class, Text.class); 输出文件名将是 text-0000、text0001 等。

所以如果你想写在不同的目录中,那么最好去覆盖MultipleTextOutputFormat;如果您不能随意使用旧 API,那么您最好自己写入HDFS / S3,而不是依赖 hadoop 来做到这一点。

于 2013-03-18T20:43:06.073 回答