设为首页 收藏本站
查看: 2753|回复: 0

[经验分享] apache phoenix4.6配置tracing

[复制链接]

尚未签到

发表于 2017-3-3 09:06:32 | 显示全部楼层 |阅读模式
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/,可以看到已经正常了:

   DSC0000.png

6.参考
  http://phoenix.apache.org/tracing.html

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-349488-1-1.html 上篇帖子: Spring Boot自动配置类 下篇帖子: Spring Boot快速开发Web项目
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表