1、什么是Query Server
1)先认识一下Phoenix重客户端架构
在重客户端中,业务代码调用Phoenix提供的API,Phoenix将SQL转换为Hbase中API,再通过Hbase的客户端调用Hbase的服务,完成数据读写。
通过这个图我们也可以看到,Phoenix的核心功能都是在RegionServer上执行,将处理下推到服务端,以致在大数据情况下查询速度在毫秒级别。
这样的一个架构,业务应用重度融合了Phoenix和hbase客户的逻辑,依赖的jar包都几百M.
2)Phoenix轻客户端
1)从上图可知轻客户端只需要依赖一个Phoenix Client就可以,Server端变得更多了。
2)Query Server是一个HTTP Server(内置了一个Jetty),基于Apache Calcite Avatica实现
3)多个Query Server可通过负载均衡统一访问入口 ,满足高可用(如果采用Nginx,需要启用用会话保持)。
2、为什么要用Query Server
1)客户端依赖上百M的包;
2)重客户端依赖的jar太多,会经常导致包有冲突;
3)满足不了不同客户端的接入的需要;
4)一旦服务端升级,就需要升级客户端。
使用Query Server的好处
1)Query server是无状态的,可以很容易扩展
2)整个计算都在Server端,降低了客户端的要求,同时提供数据处理性能。对于重客户端架构,客户端会有计算的逻辑,如排序、聚合等操作会在客户端多线程去处理,这样就对客户端有要求了。如:一个大表上百个region,那一个线程对应一个region,这对客户端要求可想而知。
3)客户端不需要直接访问zookeeper和hbase
4)支持更多语言 客户端
3、如何使用Query Server
1)如何部署:见之前Phoenix入门的文章
https://mp.youkuaiyun.com/mp_blog/creation/editor/119700537
2)设置环境变量
//设置queryserver heapsize 1G,默认=1g
export PHOENIX_QUERYSERVER_OPTS=-Xmx1G
//设置日志目录,默认在/tmp/phoenix
export PHOENIX_QUERYSERVER_LOG_DIR=日志目录
3)启动QueryServer
如果之前已经将phoenix的目录加入到了环境变量中,那直接执行
queryserver.py start
若没有配置环境变量,那进入phoenix的bin目录下,执行
./queryserver.py start
4、客户端访问方式
JDBC URL格式: jdbc:phoenix:thin:url=<scheme>://<server-hostname>:<port>[;option=value,....]
<scheme>:传输协议 ,当前只支持http
<server-hostname>:queryserver的host或IP,也可以是负载器的host或ip
<port>:默认端口是8765
4.1、通过 ./sqlline-thin.py 脚本访问:
./sqlline-thin.py http://QueryServer的IP:8765
4.2、通过JDBC URL访问(java版本)
<dependency>
<groupId>com.aliyun.phoenix</groupId>
<artifactId>ali-phoenix-shaded-thin-client</artifactId>
<version>5.2.5-HBase-2.x</version>
</dependency>
static String driver="org.apache.phoenix.queryserver.client.Driver";
static String url="jdbc:phoenix:thin:url=http://IP:8765;serialization=PROTOBUF";
static private Connection conn;
/**
* 获取连接
* @throws Exception
*/
public static void initResource() throws Exception{
Class.forName(driver);
try {
Properties info=new Properties();
info.setProperty("phoenix.schema.isNamespaceMappingEnabled","true");
conn = DriverManager.getConnection(url,info);
}catch (Exception ex){
ex.printStackTrace();
}
stat = conn.createStatement();
}
5、注意事项
1)queryserver推荐使用Protocol Buffers作为序列化方式,主要是性能会更好
2)轻客户端查询时对于date类型为yyyy-MM-dd,time类型格式为:HH:mm:ss,对于对date字段作特殊处理。具体见:https://mp.youkuaiyun.com/mp_blog/creation/editor/113091745