1397535668 发表于 2017-3-3 09:06:32

apache phoenix4.6配置tracing

apache phoenix4.6配置tracing

1.前言
  phoenix从4.1.0版本开始就加入了收集每个请求的traces的功能,这可以让你看到每个重要的步骤(例如查询操作或者插入操作)。phoenix通过利用cloudera公司的HTrace库(HTrace是一个用java写的用于分布式系统的追踪框架,源码托管在github上)实现与Hbase追踪工具的无缝整合,而更进一步,phoenix还把这些追踪的指标保存到了phoenix表中(hadoop1不支持把数据写到phoenix表)。
  Tracing Web Application顾名思义是一个web应用,可以跑在jetty服务器上,主要就是将trace的数据可视化,有助于预测和分析查询信息和系统模型,可分为几个功能模块:


[*]
[*]根据输入的数据限制,以行列出最近的traces记录
[*]根据输入trace id,以树型拓扑的形式显示所有属于该trace的踪迹  
[*]将trace按description进行分类,以饼图,条形图等展示各分类比例
[*]将trace按所在运行主机进行分类,以饼图,条形图等展示各分类比例
[*]以x轴为时间,显示同一个trace id的trace耗时

  总的来说,trace数据就一个表(9个字段,主要几个:trace_id,parent_id,description,start_time,end_time等),trace web只是以不同角度对数据进行描述。

2.服务端配置
  前提是Hbase已经与phoenix集成,即可以正常使用phoenix的基础功能(建表,sql查询等),然后再配置hbase服务端支持phoenix的tracing。hbase已经默认自带了hadoop-metrics2-hbase.properties配置文件,位于conf目录下,所以编辑所有节点的文件内容,加入以下配置: 



hbase.sink.tracing.class=org.apache.phoenix.trace.PhoenixMetricsSink
hbase.sink.tracing.writer-class=org.apache.phoenix.trace.PhoenixTableMetricsWriter
hbase.sink.tracing.context=tracing
  由于本人使用的是CDH,所以在cloudera manager页面找到hbase配置项:Hadoop 度量 2 高级配置代码段(安全阀),并在输入框中加入以上内容,重启hbase集群。

3.客户端配置

3.1配置hadoop-metrics2-phoenix.properties文件
  以sqlline为例,配置文件位于phoenix发行包的bin目录下,不用修改,使用默认配置即可。如果在程序中通过jdbc连接,把文件拷贝过去即可,默认的内容为:



phoenix.sink.tracing.class=org.apache.phoenix.trace.PhoenixMetricsSink
phoenix.sink.tracing.writer-class=org.apache.phoenix.trace.PhoenixTableMetricsWriter
phoenix.sink.tracing.context=tracing

3.2配置phoenix.trace.frequency属性值
  phoenix.trace.frequency有3个可配置的值:


[*]
[*]never:默认值
[*]always:对所有请求都进行追踪
[*]probability:以某种频率对请求进行追踪,搭配phoenix.trace.probability.threshold配置进行使用,默认是0.05

  注意:probability值可以在进行JDBC连接时作为一个连接属性进行配置,示例:



# Enable tracing on every request
Properties props = new Properties();
props.setProperty("phoenix.trace.frequency", "always");
Connection conn = DriverManager.getConnection("jdbc:phoenix:localhost", props);
# Enable tracing on 50% of requests
props.setProperty("phoenix.trace.frequency", "probability");
props.setProperty("phoenix.trace.probability.threshold", 0.5)
Connection conn = DriverManager.getConnection("jdbc:phoenix:localhost", props);
  也可以通过在$phoenix_home/bin/hbase-site.xml配置文件中配置phoenix.trace.frequency,但这种方式只支持两个值:never,always:



<configuration>
<property>
<name>phoenix.trace.frequency</name>
<value>always</value>
</property>
</configuration>

4.创建trace表
  本文开始时已经提及到了,trace数据将会保存在phoenix表中,默认的表为 SYSTEM.TRACING_STATS,创建表的DDL语句为:



CREATE TABLE SYSTEM.TRACING_STATS (
trace_id BIGINT NOT NULL,
parent_id BIGINT NOT NULL,
span_id BIGINT NOT NULL,
description VARCHAR,
start_time BIGINT,
end_time BIGINT,
hostname VARCHAR,
tags.count SMALLINT,
annotations.count SMALLINT,
CONSTRAINT pk PRIMARY KEY (trace_id, parent_id, span_id)
)
  如果想要修改默认表,可以修改hbase的配置,如hbase-site.xml:



<property>
<name>phoenix.trace.statsTableName</name>
<value>表名</value>
</property>

5.启动Tracing Web Application
  通过命令 ./bin/traceserver.py start对web服务进行启动,正常启动后可以访问http://localhost:8864。不过出现了不正常的情况,在执行命令后,查看启动日志以现了该错误:错误: 找不到或无法加载主类 org.apache.phoenix.tracingwebapp.http.Main.经过Google还是没找到什么解决方法,倒是找到了两个比较相近的issues:

  https://issues.apache.org/jira/browse/PHOENIX-2186
  https://issues.apache.org/jira/browse/PHOENIX-2659
  最后懒得浪费时间在上面折腾了,看了一下Phoenix源码中的phoenix-tracing-webapp模块,其实就4个类,其它的都是前台页面相关的。于是把源码导入到eclipse里面,修改一下相关代码以及环境:

5.1修改phoenix连接配置
  找到ConnectionFactory类,修改PHOENIX_HOST属性(默认是localhost)以及PHOENIX_PORT属性(默认是2181),使得指向正确集群,以下的本人的配置:



protected static String PHOENIX_HOST = "master";
protected static int PHOENIX_PORT = 2182;

5.2加入phoenix-core-4.6.0-HBase-1.0.jar依赖包
  Trace Web Application会通过jdbc的方式连接trace表获取数据,所以要加入phoenix-core-4.6.0-HBase-1.0.jar,否则会报找不到的错误。

5.3修改TraceServlet类源码
  在进行5.1和5.2步骤的操作后,通过运行Main类已经可以把web服务启动,也可以访问到http://localhost:8864/页面了,但是页面死活没有数据显示,于是在浏览器F12进行调试,可以看到页面是有向后台发送请求并且后台也已经正常返回数据到前台,而报的错误则是一些js的错误,而且是解析json时出错:



SyntaxError: Unexpected string in JSON at position 11
at Object.parse (native)
at fromJson (http://localhost:8864/js/lib/angular.js:1072:14)
at defaultHttpResponseTransform (http://localhost:8864/js/lib/angular.js:8618:16)
at http://localhost:8864/js/lib/angular.js:8703:12
at forEach (http://localhost:8864/js/lib/angular.js:323:20)
  ........
  通过观察后台返回的数据,发现数据根本就不是json格式的数据,使用就像这种(注意加红字体处):[{"count":2","end_time":147520457138......,不细心看还真看不出个所以然,定位到了问题就容易解决了,经调试知道是TraceServlet类的getJson方法有问题:



protected String getJson(String json) {     #调试过程中发现json已经是标准的json字符中了
String output = json.toString().replace("_id\":", "_id\":\"")
.replace(",\"hostname", "\",\"hostname")
.replace(",\"parent", "\",\"parent")
.replace(",\"end", "\",\"end");  #想不明白为什么还要replace,正是因为做了该操作才使得前台拿到错误的数据
return output;
}
  其实传进来的json参数已经是标准的json字符串了,想不明白,这里为什么要做一堆replace操作,导致了上面本来应该是2的却变成了2",稍微修改一下这个方法:



protected String getJson(String json) {
return json;   #直接返回行了
}
  并重新启动web服务,访问http://localhost:8864/,可以看到已经正常了:

  

6.参考
  http://phoenix.apache.org/tracing.html
页: [1]
查看完整版本: apache phoenix4.6配置tracing