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.csdn.net/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.csdn.net/mp_blog/creation/editor/113091745

参考文档:https://phoenix.apache.org/server.html

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐