运行 来自 java 程序的纱线作业使用 ProcessBuilder 给出文件不存在错误

Running yarn job from java program using ProcessBuilder gives file does not exist error

我正在尝试从 java 包装器程序 运行 纱线作业。 mapreduce jar 接受两个输入:

  1. 一个头文件:我不知道文件名,只知道位置和文件扩展名,而且那个位置只有一个文件
  2. A 输入文件目录

除此之外,我还有一个输出目录。 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();

在 运行 上,我收到以下错误:

Exception in thread "main" java.io.FileNotFoundException: Requested file /input/path/dir1/HEADER/*.tsv does not exist.

但是当我 运行 与 :

相同的命令时
yarn jar jarfile.jar -Dmapred.job.queue.name=name -Dmapred.reduce.tasks=500 /input/path/dir1/HEADER/*.tsv /input/Dir /output/Dir/

一切正常。

当 运行ning 来自 java 的命令导致此问题时,可能是什么问题?

在这种情况下,* 被视为文字字符串的一部分,而不是通配符。因此,通配符不会扩展到您想要的路径名。

如果目录中只有一个文件,为什么不找到它的路径并将其作为参数传递

例如

File dir = new File(INPUT_DIRECTORY+"/HEADER);
if (dir.list().length > 0)
    String HEADER_PATH = dir.list()[0].getAbsolutePath();