Phoenix查询服务器提供了与Phoenix和HBase交互的另一种方法。很快,这将允许从JVM以外的环境进行访问。
概述
Phoenix4.4引入了一个独立的服务器,公开了连接Phoenix的“thin”客户端。它是基于Apache Calcite的一个Avatica组件。查询服务器由代表客户端管理Phoenix连接的Java服务器组成。客户端实现目前是一个具有最小依赖性的JDBC驱动程序。目前支持两种传输机制:JSON和Protocol Buffers(默认情况下从Phoenix 4.7开始可用)。还有一个使用thin客户机的sqlline脚本。
Avatica仍处于其生命周期的相对早期阶段。随着Protobuf传输的引入,Avatica正朝着与提供的thin JDBC驱动程序向后兼容的方向发展。JSON API没有这样的向后兼容性保证。
重复一遍,不保证与JSON传输向后兼容;然而,与Protobuf传输的兼容性正在稳定下来(尽管还没有经过充分的测试,不足以被称为“保证”)。
安装
在4.x和5.0发布的查询服务器及其JDBC客户端是标准Phoenix发行版的一部分。它们不需要额外的依赖关系。
在5.0版本之后,查询服务器被解压缩到phoenix-queryserver仓库中,其版本号被重置为1.0。在撰写本文时,还没有独立查询服务器的发布版本。
使用
服务端
服务器组件是通过bin/queryserver.py管理的。其用法如下
bin/queryserver.py [start|stop]
在没有参数调用时,查询服务器将在前台启动,日志记录将定向到控制台。
第一个参数是守护进程的可选start或stop命令。当提供了这两种方法中的任何一种时,它将对守护进程(如果它存在的话)采取适当的操作。
任何后续的参数都被传递给主类(main class)进行解释。
服务器被打包在一个独立的jar中,phoenix-server-<version>-runnable.jar。这个jar和类路径上的HBASE_CONF_DIR是启动服务器所需的全部内容。
客户端
Phoenix提供了两种与查询服务器交互的机制。独立的phoenix-<version>-thin-client.jar中提供了一个JDBC驱动程序。脚本bin/sqlline-thin.py可用于命令行。
JDBC连接字符串的组成如下:
jdbc:phoenix:thin:url=<scheme>://<server-hostname>:<port>[;option=value...]
<scheme>指定与服务器通信时使用的传输协议(http或https)。
<server-hostname>提供服务的主机的名称。
<port>主机正在监听的端口号。默认值是8765,不过这是可配置的(参见下文)。
Avatica文档中提供了可以通过JDBC URL字符串提供的选项的完整列表。
脚本bin/sqlline-thin.py的行为与它的同级的脚本bin/sqlline.py相同。它支持以下使用选项。
bin/sqlline-thin.py [[scheme://]host[:port]] [sql_file]
第一个可选参数是一个连接URL,如前所述。如果没有提供,scheme默认为http、主机到本地主机、端口到8765。
bin/sqlline-thin.py http://localhost:8765
第二个可选参数是要从中读取命令的sql文件。
在线API文档
API本身被记录在Apache Calcite项目中,因为它是Avatica API——在Phoenix中没有定义在线API。
- JSON API
-
Protocol Buffer API
有关使用Avatica的其他语言构建客户机的更多信息,请随时联系Apache Calcite开发邮件列表。
伪装
默认情况下,Phoenix查询服务器代表最终用户执行查询。HBase权限是根据终端用户而不是Phoenix查询服务器的身份强制执行的。在某些情况下,可能希望以其他用户的身份执行查询—这称为“伪装”。这可以使可信用户有权为其他用户运行查询的工作流。
这可以通过设置配置属性phoenix.queryserver.withRemoteUserExtractor为true。可以修改查询服务器的URL以包含所需的请求参数。例如,要让“bob”以“alice”的身份运行查询,可以使用以下JDBC URL:
jdbc:phoenix:thin:url=http://localhost:8765?doAs=alice
检查标准的Hadoop“proxyuser”配置键,以验证是否允许“真正的”远程用户模拟“doAs”用户。有关如何配置这些规则的更多信息,请参阅Hadoop文档。
警告:HBase 0.98和1.1 Phoenix版本没有端到端测试覆盖,因为在那些HBase版本中缺少与测试相关的代码。虽然我们预计在这些Phoenix发布线上不会出现问题,但我们建议用户进行额外的测试,以验证没有问题。
度量
默认情况下,Phoenix查询服务器通过JMX公开各种Phoenix全局客户端指标(适用于HBase版本1.3及以上)。度量标准的列表在这里。
PQS指标在内部使用Hadoop指标2进行指标发布。因此,它发布各种与JVM相关的指标。可以根据某些标记过滤指标,这些标记可以通过类路径上的hbase-site.xml中指定的属性进行配置。配置部分提供了进一步的详细信息。
配置
务器组件分布在许多java包中,因此有效的日志配置需要更新多个包。默认的服务器日志配置设置如下日志级别:
log4j.logger.org.apache.calcite.avatica=INFO
log4j.logger.org.apache.phoenix.queryserver.server=INFO
log4j.logger.org.eclipse.jetty.server=INFO
在撰写本文时,底层Avatica组件遵循以下配置选项。它们通过hbase-site.xml配置公开。
与服务器实例化相关的配置:
属性 | 描述 |
---|---|
phoenix.queryserver.http.port | 指定服务器将监听的端口,默认是8765 |
phoenix.queryserver.metafactory.class | Avatica的Meta.Factory类去实例化 |
phoenix.queryserver.serialization | 传输/序列化格式,PROTOBUFJSON其中之一。 |
和HTTPS相关配置(在撰写本文时,HTTPS支持仅在未绑定的phoenix-queryserver 1.0.0-SNAPSHOT版本中可用。):
属性 | 描述 |
---|---|
phoenix.queryserver.tls.enabled | 控制QueryServer是否使用HTTPS传输的布尔值。在使用HTTPS时,还必须提供密钥和trustore文件及其密码。 |
phoenix.queryserver.tls.keystore | 包含HTTPS服务的私钥的密钥存储库文件 |
phoenix.queryserver.tls.keystore.password | 包含HTTPS私有密钥的密钥存储库文件的密码 |
phoenix.queryserver.tls.truststore | 包含HTTPS证书的密钥存储库文件 |
phoenix.queryserver.tls.truststore.password | 包含HTTPS证书的密钥存储库文件的密码 |
与连接到安全集群的服务器相关的配置:
属性 | 描述 |
---|---|
hbase.security.authentication | 当设置为“kerberos”时,服务器将尝试在启动Phoenix连接之前登录。 |
phoenix.queryserver.keytab.file | 查找keytab文件的密钥。 |
phoenix.queryserver.kerberos.principal | 身份验证时使用的kerberos主体。如果phoenix.queryserver.kerberos.http。未配置主体,此指定的主体还将用于验证SPNEGO连接和连接到HBase。 |
phoenix.queryserver.http.keytab.file | 用于验证SPNEGO连接的keytab文件。如果phoenix.queryserver.kerberos.http,则必须指定此配置。主要配置。.如果此属性未定义,则将使用phoenix.queryserver.keytab.file。 |
phoenix.queryserver.http.kerberos.principal | 验证SPNEGO连接时使用的kerberos主体。如果此属性未定义,则将使用phoenix.queryserver.kerberos.principal。 |
phoenix.queryserver.kerberos.http.principal | 弃用,使用phoenix.queryserver.http.kerberos.principal代替。 |
phoenix.queryserver.kerberos.allowed.realms | 除了PQS的HTTP主体领域之外,应该允许通过SPNEGO使用PQS进行身份验证的Kerberos领域的逗号分隔列表。 |
phoenix.queryserver.dns.nameserver | DNS域名 |
phoenix.queryserver.dns.interface | 要查询DNS的网络接口的名称。 |
配置和服务端缓存相关配置:
属性 | 描述 |
---|---|
avatica.connectioncache.concurrency | 连接缓存并发级别。默认是10。 |
avatica.connectioncache.initialcapacity | 连接缓存初始容量。默认是100。 |
avatica.connectioncache.maxcapacity | 连接缓存的最大容量。接近这一点时,缓存将开始驱逐最近最少使用的连接对象。默认是1000。 |
avatica.connectioncache.expiryduration | 连接缓存过期时间。任何超过此值的连接都将被丢弃。默认为10分钟。 |
avatica.connectioncache.expiryunit | 连接缓存过期单元。应用于在avatica.connectioncache.expiryunit中提供的值的单位修改器。默认是分钟。 |
与服务器语句缓存相关的配置:
属性 | 描述 |
---|---|
avatica.statementcache.concurrency | 语句缓存并发级别。默认是100。 |
avatica.statementcache.initialcapacity | 语句缓存初始容量。默认是1000。 |
avatica.statementcache.maxcapacity | 语句缓存最大容量。接近这一点时,缓存将开始驱逐最近最少使用的语句对象。默认是10000。 |
avatica.statementcache.expiryduration | 语句缓存过期时间。任何超过此值的语句都将被丢弃。默认为5分钟。 |
avatica.statementcache.expiryunit | 语句缓存过期单元。应用于在avatica.statementcache.expiryunit中提供的值的单元修改器。默认是分钟。 |
伪装相关配置:
属性 | 描述 |
---|---|
phoenix.queryserver.withRemoteUserExtractor | 布尔值控制是否应该从该用户发出的HTTP请求参数中提取要模拟的远程用户,而不是从HTTP验证的用户名(这是缺省值)提取。 |
phoenix.queryserver.remoteUserExtractor.param | 用于提取用户名以执行查询的HTTP请求参数的名称。 |
度量相关配置:
属性 | 描述 |
---|---|
phoenix.client.metrics.tag | 用于过滤由PQS在hadoop-metrics2.properties中发出的Phoenix全局客户端度量的类别的标签 |
查询服务器附加功能
Phoenix查询服务器是水平可伸缩的,这意味着它是一个自然适合的附加功能,比如服务发现和负载平衡。
负载均衡
查询服务器可以使用现成的HTTP负载平衡器,如Apache HTTP服务器、nginx或HAProxy。使用这些负载平衡器的主要要求是实现必须实现“sticky session”(当客户机与后端服务器通信时,该客户机将继续与后端服务器通信)。查询服务器还提供了一些使用ZooKeeper实现负载平衡的绑定功能。
基于ZooKeeper的负载均衡器功能,自动注册PQS实例在ZooKeeper,然后允许客户端查询可用的服务器列表。与上面提到的其他实现不同,此实现要求客户端使用广告信息来进行路由决策。在这方面,这种基于zookeper的方法更类似于服务发现层,而不是传统的负载平衡器。在ZooKeeper中,这个负载平衡器实现不支持基于sasl (Kerberos)的acl(请参阅PHOENIX-4085)。
以下是用于配置此负载均衡器的配置属性(与基于zookeper的负载平衡器相关的配置):
属性 | 描述 | 默认 |
---|---|---|
phoenix.queryserver.loadbalancer.enabled | PQS应该在ZooKeeper中注册负载均衡器 | false |
phoenix.queryserver.base.path | PQS实例应该将自己注册到zk的哪一个目录中 | /phoenix |
phoenix.queryserver.service.name | 一个惟一的名称,用于从其他实例标识此PQS实例。 | queryserver |
phoenix.queryserver.zookeeper.acl.username | 要为digest zookeeper ACL设置的名称,可选。 | phoenix |
phoenix.queryserver.zookeeper.acl.password | 位digest zookeeper ACL设置密码 | phoenix |