Apache Phoenix 5.2 配置参数详解

Apache Phoenix 5.2.1(配 HBase 2.4.18)配置参数详解,涵盖 HBase 服务端键、Phoenix 客户端属性及生产配置模板,附实测默认值与查看/修改方法。

Apache PhoenixApache Phoenix2026/10/11

Apache Phoenix 5.2 配置参数详解

目标:本文详解 Apache Phoenix 5.2.1(配 HBase 2.4.18、JDK 11)的关键配置参数,覆盖参数查看/修改方式、HBase 服务端键、Phoenix 客户端属性及按内存/磁盘/场景区分的生产配置模板;默认值与实测值均已在 Ubuntu 22.04.5 环境实测/对照官方文档核实。

一、环境信息

项值
操作系统Ubuntu 22.04.5 LTS(x86_64)
账号root
JDKOpenJDK 11.0.32.1(JAVA_HOME=/usr/lib/jvm/java-11-openjdk-amd64)
HBase2.4.18(/opt/hbase,单机 standalone,本地文件系统)
Phoenix5.2.1(/opt/phoenix,sqlline version 1.9.0)
服务端配置文件/opt/hbase/conf/hbase-site.xml、/opt/hbase/conf/hbase-env.sh
客户端配置入口sqlline.py/psql.py 的 PHOENIX_OPTS 环境变量;应用侧 JDBC URL/hbase-site.xml

二、前置条件

  1. 已按同专栏《Ubuntu 22.04 安装 Apache Phoenix 5.2 指南》安装并能启动 HBase + Phoenix(本机 /opt/hbase、/opt/phoenix)。
  2. HBase 与 Phoenix 为 Java 进程,所有 JVM 堆参数限制在 256–512MB(服务端 HBASE_HEAPSIZE、客户端 PHOENIX_OPTS)。
  3. 改配置需重启 HBase 生效(/opt/hbase/bin/restart-hbase.sh 或 stop-hbase.sh + start-hbase.sh)。

三、参数查看与修改方式

3.1 查看 HBase 运行时生效值(HBaseConfTool)

hbase org.apache.hadoop.hbase.util.HBaseConfTool <key> 可读取某配置键的运行时生效值(合并默认值 + hbase-site.xml 覆盖),本环境实测:

/opt/hbase/bin/hbase org.apache.hadoop.hbase.util.HBaseConfTool hbase.rootdir
./tmp/hbase
/opt/hbase/bin/hbase org.apache.hadoop.hbase.util.HBaseConfTool hbase.zookeeper.quorum
127.0.0.1
/opt/hbase/bin/hbase org.apache.hadoop.hbase.util.HBaseConfTool hbase.cluster.distributed
false

3.2 修改服务端配置

编辑 /opt/hbase/conf/hbase-site.xml,在 <configuration>...</configuration> 内增改 <property>:

<property>
  <name>phoenix.query.timeoutMs</name>
  <value>600000</value>
</property>

修改后重启 HBase:/opt/hbase/bin/restart-hbase.sh(或 stop-hbase.sh 再 start-hbase.sh)。

⚠️ 注意:改 hbase-site.xml 后必须重启 HBase 才生效;改 hbase-env.sh 同理。

3.3 修改客户端配置(PHOENIX_OPTS)

sqlline/psql 客户端通过环境变量 PHOENIX_OPTS 传入 JVM 参数(实测脚本内含 ' $PHOENIX_OPTS ' 拼接)。堆限制示例:

PHOENIX_OPTS="-Xms256m -Xmx256m" /opt/phoenix/bin/sqlline.py localhost:2181

Phoenix 客户端属性(如 phoenix.query.timeoutMs)推荐写进客户端侧 hbase-site.xml 或 JDBC URL(jdbc:phoenix:localhost:2181;phoenix.query.timeoutMs=10000)。验证生效堆:

PHOENIX_OPTS="-Xms256m -Xmx256m" /opt/phoenix/bin/sqlline.py localhost:2181 &
ps -ef | grep [s]qlline

ps 命令行中即可看到 -Xms256m -Xmx256m。

四、参数总览

Phoenix 配置分两类:HBase 服务端键(随 HBase 协处理器加载,须配在 hbase-site.xml)与 Phoenix 客户端属性(配在客户端侧 hbase-site.xml 或 JDBC URL)。核心参数表如下(默认值来自 Phoenix 官方配置文档):

参数所属默认值说明
phoenix.query.timeoutMs客户端600000单条查询客户端超时(毫秒)
phoenix.query.threadPoolSize客户端128客户端线程池大小(集群越大需越大)
phoenix.mutate.maxSize客户端500000客户端批量前最大缓行行数
phoenix.mutate.batchSize客户端1000UPSERT SELECT/DELETE 自动提交批次行数
phoenix.query.maxSpoolToDiskBytes客户端1024000000并行结果落盘上限,超出查询失败
phoenix.query.useIndexes客户端true是否使用二级索引优化查询
phoenix.connection.autoCommit客户端false新连接默认是否开启自动提交
phoenix.table.default.store.nulls客户端false建表默认是否显式存储 NULL
phoenix.schema.dropMetaData服务端true删 Phoenix 表是否连带删 HBase 表
phoenix.coprocessor.maxMetaDataCacheSize服务端20480000服务端元数据缓存上限(20MB)
phoenix.query.maxServerCacheBytes服务端104857600单个子查询结果哈希前上限(100MB)
hbase.regionserver.handler.count服务端30RegionServer RPC 处理线程数(实测默认 30)
hbase.hregion.memstore.flush.size服务端134217728MemStore 触发刷写阈值(实测默认 128MB)
hbase.client.scanner.timeout.period服务端60000扫描 RPC 超时(实测默认 60000ms)

五、HBase 服务端关键参数详解(含实测值)

5.1 hbase.rootdir

HBase 数据根目录。单机本地文件系统默认 ./tmp/hbase(实测值),生产分布式(HDFS)为 hdfs://namenode:9000/hbase。

<property>
  <name>hbase.rootdir</name>
  <value>./tmp/hbase</value>
</property>

5.2 hbase.zookeeper.quorum

ZooKeeper 仲裁地址,Phoenix 客户端(sqlline)连接入口。单机默认 127.0.0.1(实测值);集群写多个 ZK 节点。

<property>
  <name>hbase.zookeeper.quorum</name>
  <value>127.0.0.1</value>
</property>

5.3 hbase.zookeeper.property.clientPort

ZooKeeper 客户端端口,单机默认 2181(实测值)。改后 sqlline 连接串同步改。

<property>
  <name>hbase.zookeeper.property.clientPort</name>
  <value>2181</value>
</property>

5.4 hbase.cluster.distributed

是否分布式集群模式。false = 单机 standalone(本地文件系统,仅开发);生产必须 true。

⚠️ 注意:false + 本地文件系统必须配 hbase.unsafe.stream.capability.enforce=false;该组合不可用于生产。

5.5 hbase.regionserver.handler.count

RegionServer RPC 处理线程数,默认 30(实测值)。高并发读多可上调到 50–100。

<property>
  <name>hbase.regionserver.handler.count</name>
  <value>30</value>
</property>

5.6 hbase.hregion.memstore.flush.size

单个 Region MemStore 触发刷写阈值,默认 134217728(128MB,实测值)。内存充足可上调以提升写吞吐。

5.7 hbase.client.scanner.timeout.period

客户端扫描 RPC 超时,默认 60000ms(实测值)。大表/长任务需增大,避免扫描中途超时。

5.8 hbase.unsafe.stream.capability.enforce

本地文件系统运行开关,单机必须设 false(实测值);生产(HDFS)应删除或设 true。

六、Phoenix 客户端属性详解

6.1 phoenix.query.timeoutMs

单条查询客户端超时,默认 600000(10 分钟)。构建大索引/长查询调大;需要快速失败的场景调小。

<property>
  <name>phoenix.query.timeoutMs</name>
  <value>600000</value>
</property>

6.2 phoenix.query.threadPoolSize

客户端线程池大小,默认 128。集群机器/核心越多调大(如 256/512),提升并行查询吞吐。

6.3 phoenix.query.useIndexes

是否启用二级索引,默认 true。显式禁用 false 可临时绕过问题索引排查(生产一般保持 true)。

6.4 phoenix.connection.autoCommit

新连接默认自动提交,默认 false。需要在客户端控制事务边界;应用批量写入时可开自动提交降低复杂度。

6.5 phoenix.mutate.maxSize

客户端批量提交前最大缓行行数,默认 500000。批量 UPSERT 超过该值强制提交一次,控制单批内存。

6.6 phoenix.mutate.batchSize

UPSERT SELECT/DELETE 执行时的自动提交批次,默认 1000。可经连接属性 UpsertBatchSize 覆盖。

6.7 phoenix.schema.dropMetaData

删 Phoenix 表是否连带删底层 HBase 表,默认 true。生产慎用,误删会连带清空底层数据;需保留 HBase 表时设 false。

6.8 phoenix.query.maxServerCacheBytes

单个子查询结果(哈希处理前)大小上限,默认 104857600(100MB)。超出抛 MaxServerCacheSizeExceededException(多见于 join 的子查询)。

6.9 phoenix.table.default.store.nulls

建表默认 STORE_NULLS 标志,默认 false(NULL 不显式落盘)。需显式保存 NULL 行为时改 true。

七、生产配置模板

7.1 开发/测试模板(2GB 内存、普通磁盘、功能验证)

适用:开发机、功能联调、Demo。单机 standalone,本地文件系统。

<configuration>
  <property><name>hbase.cluster.distributed</name><value>false</value></property>
  <property><name>hbase.tmp.dir</name><value>./tmp</value></property>
  <property><name>hbase.unsafe.stream.capability.enforce</name><value>false</value></property>
  <property><name>phoenix.query.timeoutMs</name><value>600000</value></property>
</configuration>

JVM(hbase-env.sh / PHOENIX_OPTS):

export HBASE_HEAPSIZE=512m
export PHOENIX_OPTS="-Xms256m -Xmx256m"

7.2 生产 OLTP 模板(16GB 内存、NVMe SSD、在线读写低延迟)

适用:在线交易/查询类业务,读多写多均衡,要求低延迟。分布式集群(hbase.cluster.distributed=true),HDFS 存储,多 ZK。

<configuration>
  <property><name>hbase.cluster.distributed</name><value>true</value></property>
  <property><name>hbase.rootdir</name><value>hdfs://namenode:9000/hbase</value></property>
  <property><name>hbase.zookeeper.quorum</name><value>zk1:2181,zk2:2181,zk3:2181</value></property>
  <property><name>hbase.regionserver.handler.count</name><value>50</value></property>
  <property><name>hbase.hregion.memstore.flush.size</name><value>268435456</value></property>
  <property><name>hbase.client.scanner.timeout.period</name><value>120000</value></property>
  <property><name>phoenix.query.timeoutMs</name><value>120000</value></property>
  <property><name>phoenix.query.threadPoolSize</name><value>256</value></property>
  <property><name>phoenix.mutate.batchSize</name><value>2000</value></property>
</configuration>

7.3 生产分析模板(32GB 内存、NVMe SSD、大数据量 OLAP)

适用:大数据量复杂查询、聚合分析,读重写少,容忍较长查询时间。需把查询/扫描超时调大,内存充分给到 MemStore 与客户端线程池。

<configuration>
  <property><name>hbase.cluster.distributed</name><value>true</value></property>
  <property><name>hbase.rootdir</name><value>hdfs://namenode:9000/hbase</value></property>
  <property><name>hbase.zookeeper.quorum</name><value>zk1:2181,zk2:2181,zk3:2181</value></property>
  <property><name>hbase.regionserver.handler.count</name><value>100</value></property>
  <property><name>hbase.hregion.memstore.flush.size</name><value>536870912</value></property>
  <property><name>hbase.client.scanner.timeout.period</name><value>300000</value></property>
  <property><name>phoenix.query.timeoutMs</name><value>600000</value></property>
  <property><name>phoenix.query.threadPoolSize</name><value>512</value></property>
  <property><name>phoenix.query.maxSpoolToDiskBytes</name><value>2147483648</value></property>
  <property><name>phoenix.groupby.spillable</name><value>true</value></property>
</configuration>

💡 说明:生产模板中的 HDFS 地址、ZK 地址需按实际集群替换;JVM 堆严格限制在 256–512MB(服务端 HBASE_HEAPSIZE、客户端 PHOENIX_OPTS),改后以 jps -v 复核 -Xmx 实际生效值。

八、常见问题(FAQ)

Q1:改了 hbase-site.xml 后参数不生效。 HBase 启动时一次加载配置,改后必须重启:/opt/hbase/bin/restart-hbase.sh(或 stop-hbase.sh + start-hbase.sh)。可用 HBaseConfTool 复核生效值。

Q2:客户端属性写在哪、服务端属性写在哪。 客户端属性(如 phoenix.query.timeoutMs、phoenix.connection.autoCommit)写客户端侧 hbase-site.xml 或 JDBC URL;服务端属性(如 phoenix.schema.dropMetaData、hbase.regionserver.*)写服务端各节点 hbase-site.xml 并重启集群。

Q3:phoenix.query.timeoutMs 默认超时导致长查询报错。 默认 600000(10 分钟)对超大分析不够,调到所需值并同步把 hbase.client.scanner.timeout.period 相应调大,否则会先触发扫描超时。

Q4:join 查询报 MaxServerCacheSizeExceededException。 增大 phoenix.query.maxServerCacheBytes(默认 100MB),或改写查询避免大哈希子查询。

Q5:如何确认 JVM 堆真的生效。 改堆后重启对应进程,用 jps -v | grep 进程名 与 ps -ef | grep [j]ava 查看命令行,确认出现目标 -Xms/-Xmx 值。

九、参考链接