我想为我的hadoop作业(而不是JobTracker,DataNode或其他东西,为实际作业)启用JMX监视。我正在寻找一种可能性,可以使用jconsole从本地计算机连接到正在运行作业的主机/群集/节点,并检索一些监视值。因此,我需要对JMX的远程访问。

我尝试向MAPRED_MAP_TASK_JAVA_OPTSMAPRED_REDUCE_TASK_JAVA_OPTS添加一些选项:


新增中
-Dcom.sun.management.jmxremote.authenticate=fals-Dcom.sun.management.jmxremote.ssl=false -Dcom.sun.management.jmxremote.local.only=false -Djava.net.preferIPv4Stack=true对我没有帮助,因为我不知道如何使用jconsole连接到JMX。端口被打开,但是每当我尝试使用jconsole连接时,都会出现“表中没有此类对象”错误。
-Dcom.sun.management.jmxremote.authenticate=fals-Dcom.sun.management.jmxremote.ssl=false -Dcom.sun.management.jmxremote.local.only=false -Djava.net.preferIPv4Stack=true -Dcom.sun.management.jmxremote.port=1412确实按预期工作:我可以使用hostname:1412连接到jconsole。此处的主要问题:由于映射器/还原器可能在同一节点上运行多次,并且端口无法使用两次,因此第二次启动映射器/还原器失败,但出现异常。


有什么解决方案可以让我在Hadoop工作中使用JMX?这个问题与我刚才问的the other question有关,后者试图在另一个层次上提出问题。

最佳答案

我认为您的问题的答案可以在这里找到:
https://forums.oracle.com/message/4798165#4798165

基本上,可以使用-Dcom.sun.management.jmxremote.port = 0,然后检查日志以查找JMX连接器服务器正在侦听的端口。

这样做的技巧之一是,您必须将根记录器的日志级别更改为CONFIG。根据群集的配置和访问级别,可能很难修改logging.properties文件来执行此操作。

另一种方法是指定java.util.logging.config.class指向您自己的类以进行日志记录配置。您可以使用您的代码轻松分发此类。这样一来,无需访问本地文件系统即可轻松更改根日志级别。

我尚未在Hadoop集群上实际测试过这种方法,但是我希望它可以工作。

关于java - 在Hadoop作业中启用JMX,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/17813385/

10-11 01:08