Phoenix重客户端
Phoenix是HBase之上的SQL层,它为HBase赋予了NEWSQL的特性,支持了大多数的标准SQL特性,并提供了JDBC的访问接口,使得我们在应用程序中能够方便的集成使用。其架构如图:
从其架构来看,Phoenix结构上划分为客户端和服务端两部分:
- 客户端包括应用程序开发,将SQL进行解析优化生成QueryPlan,进而转化为HBase Scans,调用HBase API下发查询计算请求,并接收返回结果;
- 服务端主要是利用HBase的协处理器,处理二级索引、聚合及JOIN计算等。
这种架构我们称之为重客户端架构,也是目前Phoenix使用最广泛的方式,但是这种方式存在一些使用上的缺陷:
- 应用程序与Phoenix core绑定使用,需要引入Phoenix内核依赖,目前一个单独Phoenix重客户端集成包已达120多M;
- 运维不便,Phoenix仍在不断优化和发展,一旦Phoenix版本更新,那么应用程序也需要对应升级版本并重新发布;
- 仅支持Java API,其他语言开发者不能使用Phoenix。
Phoenix轻客户端
针对重客户端使用问题,Phoenix社区引入了轻客户端架构,如图所示:
轻客户端架构将Phoenix分为三部分:
- 瘦客户端是用户最小依赖的JDBC驱动程序,与Phoenix依赖进行解耦,支持Java、Python、Go等多种语言客户端;
- QueryServer是一个单独部署的HTTP服务,接收轻客户端的RPC请求,并将SQL转发给Phoenix Core进行解析优化执行;
- Phoenix Server与重客户端架构相同。
轻客户端JDBC连接串格式为:
jdbc:phoenix:thin:url=http://<server-hostname>:<port>[;option=value...]
其中
server-hostname:为QueryServer的主机名或IP
port:为QueryServer的端口号,默认为8765
Phoenix还提供了轻客户端命令行工具sqlline-thin.py,可以方便的进行测试使用。
QueryServer介绍
QueryServer基于Calcite的Avatica组件实现,内部嵌入了独立的Jetty HttpServer,支持Protobuf和JSON两种RPC传输协议,其中Protobuf是默认协议,提供比JSON更高效的通信方式。
由于QueryServer是无状态的,可以部署在HBase集群的每台RegionServer上,通过HTTP负载均衡器将多个客户端的请求分发在多个QueryServer上。
总结与展望
Phoenix轻客户端使业务端应用程序更加轻薄,业务开发人员无需再花费精力在底层Phoenix升级及运维,更加专注于业务本身,同时提供给非Java开发人员使用Phoenix的一种途径。
相比较重客户端,轻客户端实现增加了RPC请求链路,在性能上略有降低,阿里云HBase团队后续会进一步优化轻客户端读写性能。
阿里云HBase2.x版本已经支持Phoenix5.x的轻客户端模式,详细使用请参考:
产品入口:
链接:https://cn.aliyun.com/product/hbase
云HBase SQL服务使用文档
链接:https://help.aliyun.com/document_detail/104059.html?spm=a2c4g.11174283.6.606.11fc3c2ewByoQn