我在tomcat中运行一个Java应用程序,该程序将zip文件复制到HDFS。这工作正常,我可以使用hdfs dfs -ls查看文件。
现在,我有一个要求,我需要使用ProcessBuilder生成一个子Java进程并将该文件复制到HDFS。产生的子进程具有相同的sys pro和sys env。但是,使用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);
}