Linux 从Map Reduce调用系统命令

Linux 从Map Reduce调用系统命令,linux,hadoop,command,mapreduce,Linux,Hadoop,Command,Mapreduce,我想从map reduce程序调用一个系统命令。我希望此命令只运行一次,但似乎无法识别该命令。我的测试命令是: hadoop dfs-mv/user/test/somefile1/user/test/somefile2 我使用以下命令发出命令: String envp[] = new String[1]; envp[0] = "Path=" + System.getProperty("java.library.path"); Process p = Runtime.getRuntime().ex

我想从map reduce程序调用一个系统命令。我希望此命令只运行一次,但似乎无法识别该命令。我的测试命令是:
hadoop dfs-mv/user/test/somefile1/user/test/somefile2

我使用以下命令发出命令:

String envp[] = new String[1];
envp[0] = "Path=" + System.getProperty("java.library.path");
Process p = Runtime.getRuntime().exec("hadoop fs -mv /user/test/somefile1 /user/test/somefile2", envp);
我有两个问题

  • 哪里是放置此代码的最佳位置,以便它只执行一次

  • 为什么我发出此命令的环境没有实际运行此命令

  • 我在其他命令中也注意到了这一点

    我在发出hadoop命令时没有收到错误,但是移动没有发生。如果我从linux命令行运行相同的命令,它确实有效。

    一些评论:

  • hadoop dfs-mv
    假定源和目标的文件系统是hdfs,除非在参数中给出模式(例如
    file:///user/test/somefile1
  • 如果您是在Hadoop工具或Job.configure中运行此命令,那么,当您可以在Java中以本机方式调用它时(如
    srcPath.getFileSystem(cfg).rename(srcPath,dstPath)
    ,为什么要生成一个单独的进程(其退出代码似乎被忽略,因此没有错误)

  • 在本例中,我的文件是HDFS。我想发出一个系统命令,似乎我的环境不合作。这只是一个示例,所以我不会按照建议使用本机Java。我已经尝试过按照其他海报的建议向shell发布,sh-e
    hadoop fs-mv/my/hdfs/file/test.txt/my/hdfs/file/test2.txt
    这也没有产生我预期的结果。进程对象的退出代码是什么?您还可以将进程对象的stderr和stdout捕获为InputStreams。当我将完全限定路径添加到hadoop-/opt/hadoop/bin时,我能够发出命令并看到正确的结果。