0


【Hive实战】 HiveMetaStore的指标分析

HiveMetaStore的指标分析(一)

文章目录

背景

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

目标部署架构

#mermaid-svg-DLwZhXdmTErftLEL {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-DLwZhXdmTErftLEL .error-icon{fill:#552222;}#mermaid-svg-DLwZhXdmTErftLEL .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-DLwZhXdmTErftLEL .edge-thickness-normal{stroke-width:2px;}#mermaid-svg-DLwZhXdmTErftLEL .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-DLwZhXdmTErftLEL .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-DLwZhXdmTErftLEL .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-DLwZhXdmTErftLEL .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-DLwZhXdmTErftLEL .marker{fill:#333333;stroke:#333333;}#mermaid-svg-DLwZhXdmTErftLEL .marker.cross{stroke:#333333;}#mermaid-svg-DLwZhXdmTErftLEL svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-DLwZhXdmTErftLEL .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-DLwZhXdmTErftLEL .cluster-label text{fill:#333;}#mermaid-svg-DLwZhXdmTErftLEL .cluster-label span{color:#333;}#mermaid-svg-DLwZhXdmTErftLEL .label text,#mermaid-svg-DLwZhXdmTErftLEL span{fill:#333;color:#333;}#mermaid-svg-DLwZhXdmTErftLEL .node rect,#mermaid-svg-DLwZhXdmTErftLEL .node circle,#mermaid-svg-DLwZhXdmTErftLEL .node ellipse,#mermaid-svg-DLwZhXdmTErftLEL .node polygon,#mermaid-svg-DLwZhXdmTErftLEL .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-DLwZhXdmTErftLEL .node .label{text-align:center;}#mermaid-svg-DLwZhXdmTErftLEL .node.clickable{cursor:pointer;}#mermaid-svg-DLwZhXdmTErftLEL .arrowheadPath{fill:#333333;}#mermaid-svg-DLwZhXdmTErftLEL .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-DLwZhXdmTErftLEL .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-DLwZhXdmTErftLEL .edgeLabel{background-color:#e8e8e8;text-align:center;}#mermaid-svg-DLwZhXdmTErftLEL .edgeLabel rect{opacity:0.5;background-color:#e8e8e8;fill:#e8e8e8;}#mermaid-svg-DLwZhXdmTErftLEL .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-DLwZhXdmTErftLEL .cluster text{fill:#333;}#mermaid-svg-DLwZhXdmTErftLEL .cluster span{color:#333;}#mermaid-svg-DLwZhXdmTErftLEL div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-DLwZhXdmTErftLEL :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;}
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.enabledif(conf.getBoolVar(ConfVars.METASTORE_METRICS)){
   try{
   MetricsFactory.init(conf);}catch(Exception e){
   // log exception, but ignore inability to startLOG.error("error in Metrics init: "+ e.getClass().getName()+" "+ e.getMessage(), e);}}Lock startLock =newReentrantLock();Condition startCondition = startLock.newCondition();AtomicBoolean startedServing =newAtomicBoolean();// 方法中会启动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。

privateclassMonitorimplementsRunnable{
   @Overridepublicvoidrun(){
   Stopwatch sw =newStopwatch();// 获取GC情况,GC次数和GC耗时msMap<String,GcTimes> gcTimesBeforeSleep =getGcTimes();while(shouldRun){
   
        sw.reset().start();try{
   // 监控线程自我休眠500msThread.sleep(SLEEP_INTERVAL_MS);}catch(InterruptedException ie){
   return;}// 上次查询时间-减去休眠就是暂停的耗时long extraSleepTime = sw.elapsed(TimeUnit.MILLISECONDS)-SLEEP_INTERVAL_MS;Map<String,GcTimes> gcTimesAfterSleep =getGcTimes();// warnThresholdMs默认10000msif(extraSleepTime > warnThresholdMs){
   

本文转载自: https://blog.csdn.net/weixin_43820556/article/details/140020059
版权归原作者 顧棟 所有, 如有侵权,请联系我们删除。

“【Hive实战】 HiveMetaStore的指标分析”的评论:

还没有评论