【问题标题】:HBase with JMX exporter BindException带有 JMX 导出器 BindException 的 HBase
【发布时间】:2019-06-10 08:09:31
【问题描述】:

我已经在 Ambari HDP 上部署了 HBase。我尝试使用 JMX 导出器获取 HBase 指标,因此我在“hbase-env”中添加了下一个配置:

export HBASE_OPTS="$HBASE_OPTS -javaagent:/opt/jmx_exporter/jmx_exporter_javaagent.jar=7174:/opt/jmx_exporter/hbase/hbase.yml"

我运行 HBase 没有问题,但是当我尝试访问 hbase shell 时,它会抛出下一个错误:

Exception in thread "main" java.lang.reflect.InvocationTargetException
at sun.reflect.NativeMethodAccessorImpl.invoke0 (Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke (NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke (DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke (Method.java:497)
at sun.instrument.InstrumentationImpl.loadClassAndStartAgent (InstrumentationImpl.java:386)
at sun.instrument.InstrumentationImpl.loadClassAndCallPremain (InstrumentationImpl.java:401)
Caused by: java.net.BindException: The address is already being used
at sun.nio.ch.Net.bind0 (Native Method)
at sun.nio.ch.Net.bind (Net.java:437)
at sun.nio.ch.Net.bind (Net.java:429)
at sun.nio.ch.ServerSocketChannelImpl.bind (ServerSocketChannelImpl.java:223)
at sun.nio.ch.ServerSocketAdaptor.bind (ServerSocketAdaptor.java:74)
at sun.net.httpserver.ServerImpl.bind (ServerImpl.java:133)
at sun.net.httpserver.HttpServerImpl.bind (HttpServerImpl.java:54)
at io.prometheus.jmx.shaded.io.prometheus.client.exporter.HTTPServer. <init> (HTTPServer.java:145)
at io.prometheus.jmx.shaded.io.prometheus.jmx.JavaAgent.premain (JavaAgent.java:49)
... 6 more
FATAL ERROR in native method: processing of -javaagent failed
Aborted

我已经尝试更改 JMX 导出器的端口,但总是抛出 BindException。如果我在 Hbase-env 中删除 JMX 导出器的行,它工作正常,我可以访问 hbase shell。

【问题讨论】:

    标签: hbase jmx ambari hdp


    【解决方案1】:

    基于下一篇文章:https://blog.godatadriven.com/hbase-prometheus-monitoring,我将以下内容添加到 /usr/bin/hbase,因此如果端口可用,它只会在第一次将指标导出到那里。

    if [ `lsof -n -i:7000 | grep LISTEN | wc -l` == "0" ]; then
      export HBASE_OPTS="$HBASE_OPTS -javaagent:/opt/jmx_exporter/jmx_exporter_javaagent.jar=7000:/opt/jmx_exporter/hbase/hbase.yml"
    fi
    

    问题是,每次你尝试启动 HBase 的服务时,都会出现端口冲突,所以它失败了。

    【讨论】:

      【解决方案2】:

      对我来说也是如此。即使我将以下代码放在 /bin/hbase 中,我仍然会收到此错误:

      [root@xxx ~]# hbase shell 检查端口 7000 - 端口 7000 未使用 - 使用端口 7000 用法:-javaagent:/path/to/JavaAgent.jar=[host:]:收集器已注册,提供名称:jmx_exporter_build_info

      用于 {7000..8010} 中的端口;做

          if [ `lsof -n -i:$port | grep LISTEN | wc -l` == "1" ]; then
                  echo "Checking port $port - port $port in use"
          else
                  echo "Checking port $port - port $port not in use - using port $port"
                  export HBASE_OPTS="$HBASE_OPTS -javaagent:/hdptmp/jmx_prometheus_javaagent-0.16.0.jar=$port:/hdptmp/hbase_jmx_config.yaml"
                  break
          fi
      

      完成

      【讨论】:

        【解决方案3】:

        不要写 $HBASE_OPTS 这样它就不会被再次调用,这就是你得到那个错误的原因。如果您将 javaagent:/opt/jmx_exporter/jmx_exporter_javaagent.jar=7174:/opt/jmx_exporter/hbase/hbase.yml" 粘贴到任何 env 文件中,则不需要编写 $Hbase,如果您将它们写入 lib 文件夹,那么它应该导出到 env 文件。

        取出 $HBASE_OPTS 就可以了。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2020-02-24
          • 2020-02-26
          • 1970-01-01
          • 2018-04-17
          • 2021-05-21
          • 2015-06-29
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多