我想为我的hadoop作业启用JMX监控(不适用于JobTracker,DataNode或其他内容,用于实际作业)。我正在寻找一种可能性,我可以使用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
。 主要问题:由于mapper / reducer可能会在同一节点上多次运行而端口无法使用两次,因此我的mapper / reducer第二次启动失败并出现异常。
是否有任何解决方案允许我在hadoop工作中使用JMX?这个问题与the other question有关,我刚刚问过哪个尝试在另一个层面上制定问题。
答案 0 :(得分:1)
我认为您的问题的答案可以在这里找到: https://forums.oracle.com/message/4798165#4798165
基本上,您可以使用-Dcom.sun.management.jmxremote.port = 0然后检查日志以查找JMX连接器服务器正在侦听的端口。
执行此操作的一个技巧是您必须将根记录器的日志级别更改为CONFIG。根据群集的配置和访问级别,可能很难修改logging.properties文件来执行此操作。
另一种方法是指定java.util.logging.config.class指向您自己的类来执行日志记录配置。您可以使用代码轻松分发此类。然后,在不访问本地文件系统的情况下更改根日志级别应该很容易。
我还没有在Hadoop集群上测试过这种方法,但我希望它能够正常工作。
答案 1 :(得分:0)
你必须相应地设置/etc/hadoop/hadoop-env.sh:
http://theholyjava.wordpress.com/2012/09/21/enabling-jmx-monitoring-for-hadoop-and-hive/
但是,我想知道这是否是执行此操作的最佳方式:如果要观察特定行为,最好隔离特定输入文件并针对本地伪群集进行调试,以及是否需要系统度量标准你可以做得比让Ganglia看起来更糟糕,因为它已经很好地融入了hadoop:
答案 2 :(得分:0)
对于仍在寻找答案的用户,设置MAPRED_MAP_TASK_JAVA_OPTS
配置实际上不起作用。相反,您将必须在程序驱动程序(Runner)上设置此配置,以便将其传播到映射器/还原器:
configuration.set("mapreduce.map.java.opts", "-Xmx1600m -Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.authenticate=false -Dcom.sun.management.jmxremote.ssl=false -Dcom.sun.management.jmxremote.port=8008");
同样,对于减速器,可以将变量设置为mapreduce.reduce.java.opts
。
查看是否有效。只需登录其中一台机器,然后运行ps aux | grep 8008
来查看JMX端口是否设置正确。