apache phoenix4.6配置tracing

Phoenix Tracing 功能详解
本文详细介绍Phoenix 4.1.0版本引入的Tracing功能,包括服务端和客户端配置方法、Trace表创建及TracingWebApplication的部署过程。
部署运行你感兴趣的模型镜像

1.前言

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

  1. 根据输入的数据限制,以行列出最近的traces记录
  2. 根据输入trace id,以树型拓扑的形式显示所有属于该trace的踪迹  
  3. 将trace按description进行分类,以饼图,条形图等展示各分类比例
  4. 将trace按所在运行主机进行分类,以饼图,条形图等展示各分类比例
  5. 以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个可配置的值:

  1. never:默认值
  2. always:对所有请求都进行追踪
  3. 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

您可能感兴趣的与本文相关的镜像

ACE-Step

ACE-Step

音乐合成
ACE-Step

ACE-Step是由中国团队阶跃星辰(StepFun)与ACE Studio联手打造的开源音乐生成模型。 它拥有3.5B参数量,支持快速高质量生成、强可控性和易于拓展的特点。 最厉害的是,它可以生成多种语言的歌曲,包括但不限于中文、英文、日文等19种语言

### org.apache.hadoop.tracing 类或功能的使用方法 `org.apache.hadoop.tracing` 是 Hadoop 提供的一个模块,用于支持分布式追踪系统。它允许开发者通过配置 SpanReceiver 来捕获和记录分布式应用程序中的追踪信息[^1]。以下是关于 `org.apache.hadoop.tracing` 的详细说明以及其使用方法: #### 1. 功能概述 `org.apache.hadoop.tracing` 模块的核心功能是通过集成第三方追踪工具(如 HTrace)来实现分布式系统的追踪能力。Hadoop 的 tracing 功能可以通过以下方式启用: - 配置 SpanReceiver 来接收和处理追踪数据。 - 支持多种 SpanReceiver 实现,例如基于文件的日志记录器或远程服务。 #### 2. 主要类和接口 以下是 `org.apache.hadoop.tracing` 模块中的一些关键类和接口: - **SpanReceiverHost**: 提供对 SpanReceiver 的访问接口。 - **Tracer**: 负责创建和管理 Span 对象。 - **Span**: 表示一个操作的时间段,包含开始时间和结束时间,以及相关的元数据。 #### 3. 使用步骤 以下是启用和使用 Hadoop tracing 功能的基本方法: ##### (1) 配置 SpanReceiver 在 Hadoop 配置文件中(如 `core-site.xml`),添加 SpanReceiver 的相关配置。例如: ```xml <property> <name>hadoop.tracing.span.receivers</name> <value>org.apache.htrace.impl.FileSpanReceiver</value> </property> <property> <name>hadoop.tracing.span.receivers.file.path</name> <value>/path/to/tracing/logs</value> </property> ``` ##### (2) 启用 Tracing 通过设置环境变量或代码配置来启用 tracing 功能。例如,在代码中可以这样启用: ```java import org.apache.hadoop.tracing.Tracer; import org.apache.hadoop.conf.Configuration; public class TracingExample { public static void main(String[] args) throws Exception { Configuration conf = new Configuration(); Tracer tracer = Tracer.newInstance(conf, "MyTracer"); try (Tracer.Span span = tracer.startSpan("example-span")) { // 执行需要追踪的操作 } } } ``` ##### (3) 处理依赖问题 如果在运行时遇到 `java.lang.NoSuchMethodError` 或类似问题,可能是由于版本不匹配引起的。确保使用的 Hadoop 版本与 tracing 模块兼容。例如,如果使用的是 Hadoop 2.7.x,则需要确保所有依赖的 jar 包版本一致。 #### 4. 常见问题及解决方法 - **问题**: `java.lang.NoSuchMethodError: org.apache.hadoop.tracing.SpanReceiverHost.get` - **原因**: Hadoop 版本不匹配或缺少必要的 jar 包。 - **解决方法**: 确保 Hadoop 的 tracing 模块与当前使用的 Hadoop 版本一致,并删除或替换冲突的 jar 包[^1]。 - **问题**: 缺少 htrace 相关 jar 包。 - **解决方法**: 将正确的 htrace-core jar 包复制到 Hadoop 的 lib 目录下[^2]。 #### 5. 示例代码 以下是一个简单的 Java 示例,展示如何使用 Hadoop 的 tracing 功能: ```java import org.apache.hadoop.tracing.Tracer; import org.apache.hadoop.conf.Configuration; public class HadoopTracingExample { public static void main(String[] args) throws Exception { Configuration conf = new Configuration(); Tracer tracer = Tracer.newInstance(conf, "MyApplicationTracer"); try (Tracer.Span span = tracer.startSpan("my-operation")) { System.out.println("Operation is being traced..."); } } } ``` --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值