Почему файл не указан с помощью hdfs dfs -ls при копировании из дочернего процесса Java, порожденного с помощью ProcessBuilder - PullRequest
0 голосов
/ 15 мая 2019

У меня в tomcat работает приложение Java, которое копирует zip-файл в HDFS.Это работает правильно, и я могу увидеть файл с помощью hdfs dfs -ls.Теперь у меня есть требование, что мне нужно порождать один дочерний процесс Java с помощью ProcessBuilder и копировать файл в HDFS.Дочерний процесс порожден теми же системными специалистами и системным окружением.Но файл не отображается с использованием hdfs dfs -ls.Ни исключения, ни ошибки.Странная вещь из этого дочернего процесса после копирования, если я использую I hdfs.exists(zipFile), он возвращает true, но файл не виден командой -ls.Я действительно запутался в этом поведении.Кто-нибудь когда-нибудь сталкивался с этой проблемой?любые подсказки или вводные данные, пожалуйста.

Код, который я использую для запуска процесса:

// setup the System properties of the new process
List<String> processArgsList = new ArrayList<>();
processArgsList.add(edcJava);
processArgsList.add("-cp");
processArgsList.add(classPath);
processArgsList.add("-DpreTask=true");
// add all the sys props to the list in format -Dk=v
Properties properties = System.getProperties();
properties.remove(SYS_PROP_JAVA_CLASS_PATH);
properties.forEach((k, v) -> processArgsList.add("-D" + k + "=" + v));
processArgsList.add(PRETASK_EXECUTION_MANAGER_CLASS);

ProcessBuilder processBuilder = new ProcessBuilder(processArgs);
File workingDir = new File(WORKING_DIR);
processBuilder.directory(workingDir);
processBuilder.redirectErrorStream(true);
Map<String, String> processEnv = processBuilder.environment();
sysEnv.forEach(processEnv::put);

// start the process
process = processBuilder.start();

// Start process output reader thread
InputStream inputStream = process.getInputStream();
ProcessStreamReader inputStreamHandler = new ProcessStreamReader(inputStream);
inputStreamHandler.start();

waitForProcessCompletion();

PRETASK_EXECUTION_MANAGER_CLASS - это класс, который будет выполняться в дочернем процессе, и онделает это:


String localSource = "/data/scripts/hugedata.zip";
String hdfsDest = getHdfsScannerStageLocation(resourceName) + File.separator + "OutputFile";
try {
    copyTo(localSource, hdfsDest, false);
} catch (Exception e) {
    e.printStackTrace();
}

public static void copyTo(String localResource, String hdfsLoc, boolean delLocal) throws Exception {
    FileSystem hdfs = openFs();
    Path hdfsStageLoc = getHdfsResourceLocation(hdfsLoc);

    Path localResourcePath = new Path(localResource);
    if (!hdfs.exists(hdfsStageLoc)) {
        hdfs.mkdirs(hdfsStageLoc);
    }
    hdfs.copyFromLocalFile(delLocal, localResourcePath, hdfsStageLoc);
    close(hdfs);
}

и ниже возвращает true и сообщение печатается.

if (HDFSUtils.isFileExist(hdfsDest + File.separator + hugedata.zip)) {
    System.out.println("File copied to hdfs successfully at location: " + dest);

}

...