【问题标题】:Multiple outputs suddenly not writing any output?多个输出突然不写任何输出?
【发布时间】:2013-03-17 14:51:04
【问题描述】:

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

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

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

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

/home/users/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");
    }
  }

【问题讨论】:

  • 您在哪里将输出写入该目录?
  • 那么你有例外吗?
  • 我没有遇到任何异常。但什么都没有写
  • 什么是输入字符串?
  • @MahalakshmiLakshminarayanan 但你没有写任何东西..

标签: java hadoop mapreduce elastic-map-reduce


【解决方案1】:

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

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

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

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

【讨论】:

  • 感谢您的回答。指南很有用。多个输出工作正常。我在配置方法中犯了一个错误,该方法通过分布式缓存读取使用多个输出写入的文件。我使用了configure(conf, reprter)而不是configure(conf),所以程序从来没有进入configure方法,也没有读取任何文件,我误认为是多个输出没有写入文件。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-09-06
  • 1970-01-01
  • 1970-01-01
  • 2021-09-18
  • 1970-01-01
相关资源
最近更新 更多