Apache Phoenix(十九)新特性之指标
2020-03-04 本文已影响0人
我知他风雨兼程途径日暮不赏
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
}
}
});