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

标签 java hadoop jvm

我的目的是我想调试一下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调用的主要方法

最佳答案

否,JVM已经启动。

唯一的方法是通过使用Runtime.getRuntime().exec()ProcessBuilderProcess类启动新的JVM来运行JAR。

这可能会解决问题,并且您不需要传递参数,因为您可以实际调用脚本:

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

关于java - 我可以调用传递jvm参数的main方法吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31778943/

相关文章:

java - 使用 Java 从 XML 中提取数据

hadoop - Mapreduce combinefileinputformat java.lang.reflect.InvocationTargetException 而两个作业访问相同的数据

java - 设置最大堆大小是否会影响字符串池大小?

java.net.SocketException : Unrecognized Windows Sockets error: 0: JVM_Bind (JBOSS)

java - 如何从外部不相关的代码读取正在运行的 Swing GUI 的 TextField 或 Cell 值?

java接口(interface)避免强制转换

java - 有序集合和排序集合有什么区别?

java - IP 地址更改时收到通知

hadoop - Kafka Spark 流式传输 : unable to read messages

hadoop - 如何从Web应用程序将作业提交到hadoop集群?