Apache Phoenix 5.2 配置参数详解
Apache Phoenix 5.2.1(配 HBase 2.4.18)配置参数详解,涵盖 HBase 服务端键、Phoenix 客户端属性及生产配置模板,附实测默认值与查看/修改方法。
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 |
| JDK | OpenJDK 11.0.32.1(JAVA_HOME=/usr/lib/jvm/java-11-openjdk-amd64) |
| HBase | 2.4.18(/opt/hbase,单机 standalone,本地文件系统) |
| Phoenix | 5.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 |
二、前置条件
- 已按同专栏《Ubuntu 22.04 安装 Apache Phoenix 5.2 指南》安装并能启动 HBase + Phoenix(本机
/opt/hbase、/opt/phoenix)。 - HBase 与 Phoenix 为 Java 进程,所有 JVM 堆参数限制在 256–512MB(服务端
HBASE_HEAPSIZE、客户端PHOENIX_OPTS)。 - 改配置需重启 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 | 客户端 | 1000 | UPSERT 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 | 服务端 | 30 | RegionServer RPC 处理线程数(实测默认 30) |
| hbase.hregion.memstore.flush.size | 服务端 | 134217728 | MemStore 触发刷写阈值(实测默认 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 值。
九、参考链接
- Apache Phoenix 官方配置文档:https://phoenix.apache.org/tuning.html
- Apache Phoenix 官网:https://phoenix.apache.org/
- HBase 参考手册(配置与重要参数):https://hbase.apache.org/book.html