赞
踩
对当前单独部署的HiveMetaStore服务进行指标监控。
验证步骤
场景一:
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.metastore.metrics.enabled
:true
指定指标功能实现类
hive.service.metrics.class
:org.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.frequency
: 5s
指标输出到hadoop2组件指标中的名称
hive.service.metrics.hadoop2.component
:"hivemetestore"
指标输出到hadoop2组件指标中的时间间隔
hive.service.metrics.hadoop2.frequency
:30s
在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) {
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。