>我需要在 AWS S3 和我们的本地 HDFS 之间复制文件,我尝试使用 Distcp Java API,但它的问题是在 distcp 结束时它称为 System.exit(),这也停止了我的应用程序,所以如果我有多个文件夹/文件要复制并且我使用了多个线程,每个线程执行一个 distcp 命令, 完成 distcp 的第一个线程将停止应用程序,从而停止 distcp 的其余部分,还有其他方法可以避免这种情况,我知道我可以编写自己的 MR 作业来完成复制,但想知道是否有其他选择
我的代码:
List<Future<Void>> calls = new ArrayList<Future<Void>>();
for (String dir : s3Dirs) {
final String[] args = new String[4];
args[0] = "-log";
args[1] = LOG_DIR;
args[2] = S3_DIR;
args[3] = LOCAL_HDFS_DIR
calls.add(_exec.submit(new Callable<Void>() {
@Override
public Void call() throws Exception {
try {
DistCp.main(args); <-- Distcp command
} catch (Exception e) {
System.out.println("Failed to copy files from " + args[2] + " to " + args[3]);
}
return null;
}
}));
}
for (Future<Void> f : calls) {
try {
f.get();
} catch (Exception e) {
LOGGER.error("Error while distcp", e);
}
}
Distcp main()
public static void main(String argv[]) {
int exitCode;
try {
DistCp distCp = new DistCp();
Cleanup CLEANUP = new Cleanup(distCp);
ShutdownHookManager.get().addShutdownHook(CLEANUP,
SHUTDOWN_HOOK_PRIORITY);
exitCode = ToolRunner.run(getDefaultConf(), distCp, argv);
}
catch (Exception e) {
LOG.error("Couldn't complete DistCp operation: ", e);
exitCode = DistCpConstants.UNKNOWN_ERROR;
}
System.exit(exitCode); <--- exit here
}
我以前使用过distcp,从未遇到过System.exit()问题,即使有多个线程也是如此。尝试,而不是像那样使用 Distcp,使用 ToolRunner 调用 distcp 调用(就像在 hadoop 工具包中的 Distcp 测试用例中使用一样)。Distcp 测试用例使用 ToolRunner 来运行 distcp,它允许您使用多个线程运行它。我正在从上面的链接复制代码片段:
public void testCopyFromLocalToLocal() throws Exception {
Configuration conf = new Configuration();
FileSystem localfs = FileSystem.get(LOCAL_FS, conf);
MyFile[] files = createFiles(LOCAL_FS, TEST_ROOT_DIR+"/srcdat");
ToolRunner.run(new DistCp(new Configuration()),
new String[] {"file:///"+TEST_ROOT_DIR+"/srcdat",
"file:///"+TEST_ROOT_DIR+"/destdat"});
assertTrue("Source and destination directories do not match.",
checkFiles(localfs, TEST_ROOT_DIR+"/destdat", files));
deldir(localfs, TEST_ROOT_DIR+"/destdat");
deldir(localfs, TEST_ROOT_DIR+"/srcdat");
}