突然多个输出没有写入任何输出到目标。
我使用多个输出的自定义实现,其中,我只是更改了:
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条答案
按热度按时间3yhwsihp1#
正如你可能注意到的方法
checkTokenName()
确保输出名称有效。现在,您正试图修改MultipleOutputs
你不应该这样。角色喜欢的原因有很多/
,:
,.
以及-
首先不允许:许多文件系统不允许在文件名中包含这些字符
使用multipleoutputs,可以写入多个文件,但在指定的目录中,而不是在任何所需的位置。
您可能已经注意到,对于以下命名输出:
//为job multipleoutputs.addnamedoutput(job,“text”,textoutputformat.class,longwritable.class,text.class)定义其他基于单个文本的输出“text”;输出文件名将是text-0000、text0001等。
所以如果你想在不同的目录下写,那么最好去重写
MultipleTextOutputFormat
; 如果您不能自由地使用旧的api,那么最好自己编写hdfs/s3,而不是依赖hadoop来完成。