我正在尝试从java包装程序运行一个yarn作业。 mapreduce jar有两个输入:
除了这些,我有一个输出目录。 processbuilder代码如下:
HEADER_PATH = INPUT_DIRECTORY+"/HEADER/*.tsv";
INPUT_FILES = INPUT_DIRECTORY+"/DATA/";
OUTPUT_DIRECTORY = OUTPUT_DIRECTORY+"/";
ProcessBuilder mapRProcessBuilder = new ProcessBuilder("yarn","jar",JAR_LOCATION,"-Dmapred.job.queue.name=name","-Dmapred.reduce.tasks=500",HEADER_PATH,INPUT_DIRECTORY,OUTPUT_DIRECTORY);
System.out.println(mapRProcessBuilder.command().toString());
Process mapRProcess = mapRProcessBuilder.start();
在运行时,我收到以下错误:
线程中的异常" main" java.io.FileNotFoundException:请求 文件/input/path/dir1/HEADER/*.tsv不存在。
但是当我运行相同的命令时:
yarn jar jarfile.jar -Dmapred.job.queue.name=name -Dmapred.reduce.tasks=500 /input/path/dir1/HEADER/*.tsv /input/Dir /output/Dir/
一切正常。
从java运行命令时会出现什么问题导致此问题?
答案 0 :(得分:1)
在这种情况下,*
被视为文字字符串的一部分而不是通配符。因此,globbing不会扩展到您想要的路径名。
如果目录中只有一个文件,为什么不能找到它的路径,而是将其作为参数传递
例如
File dir = new File(INPUT_DIRECTORY+"/HEADER);
if (dir.list().length > 0)
String HEADER_PATH = dir.list()[0].getAbsolutePath();