java—我可以调用传递jvm参数的主方法吗?

vd2z7a6w  于 2021-06-02  发布在  Hadoop
关注(0)|答案(1)|浏览(404)

我的目的是调试hadoop的一些东西。运行hadoop程序的命令是:

bin/hadoop jar path/to/hadoop-mapreduce-examples-2.2.0.jar wordcount /wordcount /output

这个命令将调用runjar.java的main()方法。我可以通过在hadoop-env.sh中添加以下内容将jvm参数传递给runjar.java的main()方法:

HADOOP_OPTS="$HADOOP_OPTS -Xdebug -Xrunjdwp:transport=dt_socket,server=y,address=9000"

但是runjar.java的main()中的代码是:

ClassLoader loader =
  new URLClassLoader(classPath.toArray(new URL[0]));
Class<?> mainClass = Class.forName(mainClassName, true, loader);
Method main = mainClass.getMethod("main", new Class[] {
  Array.newInstance(String.class, 0).getClass()
});
main.invoke(null, new Object[] { newArgs });

我可以传递一些jvm参数吗( -Xdebug -Xrunjdwp:transport=dt_socket,server=y,address=8999 )调用此方法

main.invoke(null, new Object[] { newArgs });

这样我就可以远程调试runjar.java调用的main方法

nvbavucw

nvbavucw1#

不,jvm已经启动了。
唯一的方法是通过使用启动一个新的jvm来运行jar Runtime.getRuntime().exec() 或者 ProcessBuilder 以及 Process 班级。
这可能会起作用,而且您不需要传递参数,因为您实际上可以调用脚本:

Runtime.getRuntime().exec(
        "bin/hadoop jar path/to/hadoop-mapreduce-examples-2.2.0.jar " +
        "wordcount /wordcount /output");

相关问题