HiveMetaStore的指标分析(一)
文章目录
背景
对当前单独部署的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-site.xml相关配置
元数据服务的指标相关配置
-
开启指标功能
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
源码部分(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) {
文章评论