0

突然複数の出力が宛先に出力を書き込まない。

複数の出力のカスタム実装を使用します。ここで、次のように変更しました。

  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");
    }
  }
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 を自由に使用できない場合は、hadoop に依存するのではなく、自分でHDFS / S3に書き込むことをお勧めします。

于 2013-03-18T20:43:06.073 に答える