突然多个输出没有将任何输出写入目的地。
我使用多个输出的自定义实现,其中,我刚刚更改了:
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");
}
}
答案 0 :(得分:0)
您可能会注意到方法checkTokenName()
是为了确保输出名称有效。现在,您正在尝试修改MultipleOutputs
的不可分割的部分。首先不允许使用/
,:
,.
和-
这样的字符有很多原因:
您可能已经注意到,对于以下命名输出:
//为作业定义基于单个文本的输出“文本” MultipleOutputs.addNamedOutput(job,“text”,TextOutputFormat.class, LongWritable.class,Text.class); 输出文件名为text-0000,text0001等。
因此,如果你想在不同的目录中写,那么最好去覆盖MultipleTextOutputFormat
;如果你不能自由使用旧API,那么你最好自己写HDFS / S3,而不是依靠hadoop来做。