Apache Phoenix(十九)新特性之指标

Phoenix给出了各种指标,这些指标提供了对Phoenix客户机在执行各种SQL语句时发生的情况的洞察。这些指标在客户端JVM中以两种方式收集:

  • 请求水平指标:在单独的SQL语句级别收集
  • 全局指标:在客户端JVM级别收集

请求水平指标有助于以更细粒度的级别计算Phoenix执行的每条SQL语句的工作量。这些指标可以分为三类:

  • 变异指标
  • 扫描任务指标
  • 总体查询指标

变异指标(Mutation Metrics)

  • MUTATION_BATCH_SIZE:突变的批量大小
  • MUTATION_BYTES:突变的大小(以字节为单位)
  • MUTATION_COMMIT_TIME:提交突变所需要的时间

扫描任务指标(Scan Task Metrics)

  • NUM_PARALLEL_SCANS:并行执行的扫描次数。
  • SCAN_BYTES:扫描读取的字节数
  • MEMORY_CHUNK_BYTES:内存管理器分配的字节数
  • MEMORY_WAIT_TIME:等待通过内存管理器分配内存所需的时间(以毫秒为单位)
  • SPOOL_FILE_SIZE:以字节创建的spool文件的大小
  • SPOOL_FILE_COUNTER :创建的spool文件的数量
  • CACHE_REFRESH_SPLITS_COUNTER:Phoenix的元数据缓存由于分裂而刷新的次数
  • TASK_QUEUE_WAIT_TIME:任务必须在线程池执行器的队列中等待(以毫秒为单位)。
  • TASK_END_TO_END_TIME:任务从创建到完成所花费的毫秒时间。
  • TASK_EXECUTION_TIME:以毫秒为单位的任务执行时间。
  • TASK_EXECUTED_COUNTER:提交给线程池执行程序的任务数的计数器。
  • TASK_REJECTED_COUNTER:线程池执行程序拒绝的任务数的计数器。

总体查询指标(Overall Query Metrics)

  • QUERY_TIMEOUT_COUNTER:查询超时的次数
  • QUERY_FAILED_COUNTER:查询失败的次数
  • WALL_CLOCK_TIME_MS:整个查询执行所用的wall时间。
  • RESULT_SET_TIME_MS:使用resultSet.next()读取所有记录所用的wall时间
    下面是一些如何使用SQL语句级指标的例子:
  • 日志和报告查询执行细节,语句执行后可以用于分析。
  • 根据持续时间报告顶级SQL查询。要使用的指标:WALL_CLOCK_TIME_MS
  • 检查查询是否因为超时而失败。使用的指标:QUERY_TIMEOUT_COUNTER > 0。
  • 监视从HBase写入或读取SQL语句的字节数。要使用的指标:MUTATION_BYTES和SCAN_BYTES
  • 检查查询是否做了太多的工作,或者是否需要进行调优。可以使用的指标标准有:TASK_EXECUTED_COUNTER、TASK_QUEUE_WAIT_TIME、WALL_CLOCK_TIME_MS
  • 检查一个成功的查询是否面临线程饥饿,即线程池中的线程数量可能需要增加。TASK_EXECUTION_TIME和TASK_END_TO_END_TIME之间的比较大的差异就是这种情况的表现。
    可以为每个Phoenix JDBC连接打开/关闭请求级别指标。下面是一个如何做到这一点的例子:
 Properties props = new Properties();
    props.setProperty(QueryServices.COLLECT_REQUEST_LEVEL_METRICS, “true”);
    try (Connection conn = DriverManager.getConnection(getUrl(), props)) {
        .....
    }

一个典型的模式,一个如何可以获得的查询读取指标:

Map<String, Map<String, Long>> overAllQueryMetrics = null;
    Map<String, Map<String, Long>> requestReadMetrics = null;
    try (ResultSet rs = stmt.executeQuery()) {
          while(rs.next()) {
              .....
          }
          overAllQueryMetrics = PhoenixRuntime.getOverAllReadRequestMetrics(rs);
          requestReadMetrics = PhoenixRuntime.getRequestReadMetrics(rs);
          // log or report metrics as needed
          PhoenixRuntime.resetMetrics(rs);
    }

你也可以通过这样做来获得DML语句的写相关指标(每个表收集):

Map<String, Map<String, Long>> mutationWriteMetrics = null;
    Map<String, Map<String, Long>> mutationReadMetrics = null;
    try (Connection conn = DriverManager.getConnection(url)) {
          conn.createStatement.executeUpdate(dml1);
          ....
          conn.createStatement.executeUpdate(dml2);
          ...
          conn.createStatement.executeUpdate(dml3);
          ...
          conn.commit();
          mutationWriteMetrics = PhoenixRuntime.getWriteMetricsForMutationsSinceLastReset(conn);
          mutationReadMetrics = PhoenixRuntime.getReadMetricsForMutationsSinceLastReset(conn);
          PhoenixRuntime.resetMetrics(rs);
    }

另一方面,全局指标是在Phoenix客户机的JVM级别收集的。这些指标可以用来建立一个趋势,并从客户的角度来观察phoenix内部的发展趋势。除了上述报告的请求级指标外,全局指标还包括以下计数器:

  • MUTATION_SQL_COUNTER:计数器,用于突变sql语句的数目
  • SELECT_SQL_COUNTER:计数器的数量的sql查询
  • OPEN_PHOENIX_CONNECTIONS_COUNTER:打开phoenix连接的数量
    全局指标可能有助于监视和调优执行环境的各个方面。例如:指标TASK_REJECTED_COUNTER的增加可能是提交了太多工作的征兆,或者是phoenix线程池队列深度或线程数量或者两者都需要增加的事实。类似地,TASK_EXECUTION_TIME在一段时间内的峰值可能是几种情况的症状,包括超载的区域服务器、网络故障、客户端或区域服务器正在进行垃圾收集,等等。
    通过设置属性phoenix.query.global.metrics可以打开/关闭(默认情况下为打开)全局客户端指标集合。在客户端hbase-site.xml中启用true/false。下面是一个代码片段,展示了如何通过使用定期运行的调度作业来记录/报告全局指标:
   ScheduledExecutorService service = Executors.newScheduledThreadPool(1);
    service.submit(new Runnable() {

        @Override
        public void run() {
            Collection<GlobalMetric> metrics = PhoenixRuntime.getGlobalPhoenixClientMetrics();
            for (GlobalMetric m : metrics) {
                ... // log or report for trending purposes
            }

        }
    });
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容