自学内容网 自学内容网

【Hive实战】 HiveMetaStore的指标分析

HiveMetaStore的指标分析(一)

背景

对当前单独部署的HiveMetaStore服务进行指标监控。

目标部署架构

HiveServer2组
Metastore组
mysql组
HiveServer2_1
HiveServer2_2
HiveServer2_3
Metastore1
Metastore2
Metastore3
master
slave

验证步骤

  • 场景一:

    Metastore服务开启监控,指标输出方式采用默认。HiveServer2采用直连数据库的方式创建MetaStoreClient,其配置文件中也开启了metastore指标监控,同时开启WebUI。

    现象:每个HiveServer2服务都可以通过WebUI看到指标dump。但是,每个HiveServer2的实际访问的指标并非从Metastore组中获取的指标。是Client端侧的指标,且每个节点之间没有关联。

  • 场景二:

    Metastore服务开启监控,指标输出方式采用默认。。HiveServer2采用连接Metastore服务组的方式工作,其配置文件中也开启了metastore指标监控,同时开启WebUI。

    现象:每个HiveServer2服务都可以通过WebUI看到指标dump。但是没有Metastore相关的指标。

结论:以上两种方式,通过HiveServer2的WebUI服务都无法获取到单独的Metastore的服务指标。

  • 场景三:

    单纯的开启Metastore服务的监控,并将指标输出json文件中。

    现象:每个Metastore服务都生成自己的json文件,但是目前的版本在更新问价的时候会无法.json文件,只会定时的更新.json.tmp文件。

说明,以目标部署架构为例,单纯的MetaStore服务的指标是单纯的自己输出的。要么读取json文件,通过开启服务的JMX,在通过分别访问各个Metastore节点的JMX服务获取指标。

hive-site.xml相关配置

元数据服务的指标相关配置

  • 开启指标功能

    hive.metastore.metrics.enabledtrue

  • 指定指标功能实现类

    hive.service.metrics.classorg.apache.hadoop.hive.common.metrics.metrics2.CodahaleMetrics

  • 指标输出的类型

    hive.service.metrics.reporter"JMX,CONSOLE,JSON_FILE,HADOOP2"

  • 指标输出的JSON文件位置

    hive.service.metrics.file.location:"/tmp/report.json"

  • 指标输出的JSON文件更新频率

    hive.service.metrics.file.frequency5s

  • 指标输出到hadoop2组件指标中的名称

    hive.service.metrics.hadoop2.component"hivemetestore"

  • 指标输出到hadoop2组件指标中的时间间隔

    hive.service.metrics.hadoop2.frequency30s

源码部分(hive2.3系)

HiveMetaStore.java文件中main方法内,会根据配置去决定是否启动指标服务类。

      //Start Metrics for Standalone (Remote) Mode - hive.metastore.metrics.enabled
      if (conf.getBoolVar(ConfVars.METASTORE_METRICS)) {
   
        try {
   
          MetricsFactory.init(conf);
        } catch (Exception e) {
   
          // log exception, but ignore inability to start
          LOG.error("error in Metrics init: " + e.getClass().getName() + " "
            + e.getMessage(), e);
        }
      }
      Lock startLock = new ReentrantLock();
      Condition startCondition = startLock.newCondition();
      AtomicBoolean startedServing = new AtomicBoolean();
      // 方法中会启动JvmPauseMonitor监控器
      startMetaStoreThreads(conf, startLock, startCondition, startedServing);
      // 方法中去实例化了HMSHandler,用户处理客户端过来的请求
      startMetaStore(cli.getPort(), ShimLoader.getHadoopThriftAuthBridge(), conf, startLock,
          startCondition, startedServing);

JvmPauseMonitor.java

用来监控JVM的暂停情况。通过Daemon线程,默认每隔500ms计算一次。jvm暂停统计级别分为warn和info级别。如果暂停超过1000ms则info级别次数+1,如果超过10000ms,则warn级别+1。

  private class Monitor implements Runnable {
   
    @Override
    public void run() {
   
      Stopwatch sw = new Stopwatch();
      // 获取GC情况,GC次数和GC耗时ms
      Map<String, GcTimes> gcTimesBeforeSleep = getGcTimes();
      while (shouldRun) {
   
        sw.reset().start();
        try {
   
          // 监控线程自我休眠500ms
          Thread.sleep(SLEEP_INTERVAL_MS);
        } catch (InterruptedException ie) {
   
          return;
        }
        // 上次查询时间-减去休眠就是暂停的耗时
        long extraSleepTime = sw.elapsed(TimeUnit.MILLISECONDS) - SLEEP_INTERVAL_MS;
        Map<String, GcTimes> gcTimesAfterSleep = getGcTimes();
        // warnThresholdMs默认10000ms
        if (extraSleepTime > warnThresholdMs) {
   

原文地址:https://blog.csdn.net/weixin_43820556/article/details/140020059

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!