使用ProcessBuilder从java程序运行yarn作业,文件不存在错误

时间:2016-12-08 04:54:23

标签: java hadoop mapreduce yarn

我正在尝试从java包装程序运行一个yarn作业。 mapreduce jar有两个输入:

  1. 头文件:我不知道文件的名称,但是不知道位置和文件扩展名,并且该位置只有一个文件
  2. 输入文件目录
  3. 除了这些,我有一个输出目录。 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运行命令时会出现什么问题导致此问题?

1 个答案:

答案 0 :(得分:1)

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

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

例如

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