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