繁体   English   中英

为 Hadoop2 配置 Prometheus JMX 导出器

[英]Configuring Prometheus JMX exporter for Hadoop2

我正在尝试使用 Prometheus JMX 导出器从在 ec2 实例上运行的 Hadoop2 守护程序中抓取指标:

  • hadoop名称节点
  • hadoop数据节点
  • 纱线资源管理器
  • 纱线节点管理器

我正在尝试将 JMX 导出器作为带有所有四个守护程序的 Java 代理运行。 为此,我在hadoop-env.shyarn-env.sh添加了yarn-env.sh

export HADOOP_NAMENODE_OPTS="$HADOOP_NAMENODE_OPTS -javaagent:/home/ec2-user/jmx_exporter/jmx_prometheus_javaagent-0.10.jar=9102:/home/ec2-user/jmx_exporter/prometheus_config.yml"
export HADOOP_DATANODE_OPTS="$HADOOP_DATANODE_OPTS -javaagent:/home/ec2-user/jmx_exporter/jmx_prometheus_javaagent-0.10.jar=9102:/home/ec2-user/jmx_exporter/prometheus_config.yml"
export YARN_RESOURCEMANAGER_OPTS="$YARN_RESOURCEMANAGER_OPTS -javaagent:/home/ec2-user/jmx_exporter/jmx_prometheus_javaagent-0.10.jar=9102:/home/ec2-user/jmx_exporter/prometheus_config.yml"
export YARN_NODEMANAGER_OPTS="$YARN_NODEMANAGER_OPTS -javaagent:/home/ec2-user/jmx_exporter/jmx_prometheus_javaagent-0.10.jar=9102:/home/ec2-user/jmx_exporter/prometheus_config.yml"

资源管理器指标 NumAllSources 的示例 prometheus_config.yml 如下:

rules:
 - pattern: Hadoop<service=ResourceManager, name=MetricsSystem, sub=Stats><>NumAllSources
   name: sources
   labels:
    app_id: "hadoop_rm"

当我使用新配置和 java_opts 重新启动资源管理器或其他守护程序时,出现以下异常:

Exception in thread "main" java.lang.reflect.InvocationTargetException
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:606)
at sun.instrument.InstrumentationImpl.loadClassAndStartAgent(InstrumentationImpl.java:382)
at sun.instrument.InstrumentationImpl.loadClassAndCallPremain(InstrumentationImpl.java:397)
Caused by: java.lang.IllegalArgumentException: Collector already registered that provides name: jmx_scrape_duration_seconds
at io.prometheus.jmx.shaded.io.prometheus.client.CollectorRegistry.register(CollectorRegistry.java:54)
at io.prometheus.jmx.shaded.io.prometheus.client.Collector.register(Collector.java:128)

任何建议如何解决这个问题?

虽然@chanhou 的解决方案可行,但我想将我的编辑保留在hadoop-env.sh ,所以我选择了

if ! grep -q <<<"$HADOOP_NAMENODE_OPTS" jmx_prometheus_javaagent; then
        HADOOP_NAMENODE_OPTS="$HADOOP_NAMENODE_OPTS -javaagent:/home/caesarli/platform/jmx_prometheus_javaagent-0.12.0.jar=11099:/home/caesarli/platform/hadoop-2.8.4/etc/hadoop/jmx-name.yaml"
fi

HADOOP_DATANODE_OPTS类似。

那是因为-javaagent opts 在调用/usr/local/hadoop/sbin/hadoop-daemon.sh start datanode时在$HADOOP_OPTS多次声明,而hadoop-daemon.sh最终会调用/usr/local/hadoop/bin/hdfs启动相关服务。

在这个过程中,它会多次hadoop-config.sh ,如果你在 shell 脚本/usr/local/hadoop/bin/hdfs echo $HADOOP_OPTS那么你会在那里找到多个-javaagent

一种解决方法是在/usr/local/hadoop/bin/hdfs声明HADOOP_OPTS=$HADOOP_OPTS -javaagent:...以确保只有一个-javaagent出现在HADOOP_OPTS

我认为这是因为您对所有注册使用相同的端口 (9102),更改端口会有所帮助。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM