CentOS 8 与 Ubuntu 22.04 安装 Apache Impala 4.5.3 指南
在 CentOS 8 与 Ubuntu 22.04 上从源码发行包与预构建二进制完整安装并验证 Apache Impala 4.5.3 的从 0 到 1 指南
CentOS 8 与 Ubuntu 22.04 安装 Apache Impala 4.5.3 指南
目标:在 CentOS 8 与 Ubuntu 22.04 两种操作系统上,从零完成 Apache Impala 4.5.3(MPP 分布式 SQL 查询引擎)的完整安装与验证,覆盖 JDK、Hadoop 3.3.6(HDFS 伪分布式)、Hive 3.1.3(standalone Metastore)、Impala 本体(statestored/catalogd/impalad 三个守护进程)全栈部署,并以 impala-shell 完成建表、插入、查询等验证。全文命令与回显均为真实环境执行结果:Ubuntu 22.04 章节在 Ubuntu 22.04.5 LTS 服务器上完成全流程验证;CentOS 8 章节在 CentOS 8.4.2105 服务器上实测,其守护进程受 glibc 2.28 限制无法启动的结论已如实记录并给出替代方案。
一、环境信息与版本选型
本文在两台独立服务器上分别完成实测,环境概述如下(各项细节见 3.1 与 4.1 的环境信息小节):
- CentOS 8 服务器:CentOS Linux release 8.4.2105,glibc 2.28(
ldd --version实测),主机名 impala-centos8,IP 172.17.0.29。 - Ubuntu 22.04 服务器:Ubuntu 22.04.5 LTS (Jammy Jellyfish),内核 6.8.0-138-generic,6 核 / 47 GiB 内存,主机名 impala-ubuntu2204,IP 172.17.0.54 与 192.168.112.2。
两台服务器使用相同的软件栈:Hadoop 3.3.6(HDFS 伪分布式,/opt/hadoop)、Hive 3.1.3(standalone Metastore,/opt/hive)、Apache Impala 4.5.3-RELEASE(/opt/impala)、JDK 17(CentOS 8 侧另装 JDK 8 供 Hive/Impala DEB 声明依赖)。
1.1 发行方式与安装路线
Apache Impala 官方提供源码 tarball 与预构建二进制运行包(DEB/RPM)。安装有两种路线:
- 二进制路线(本文第三章、第四章主线):使用 Impala 4.5.3 预构建 DEB 包(/tmp/impala.deb)解包部署到 /opt/impala,无需编译,直接进入依赖组件安装与配置。
- 源码路线:下载官方源码 tarball → 配置完整工具链(cmake、thrift、clang 等)自行编译 → 产出后端二进制。编译耗时且依赖重,可作为 CentOS 8 受 glibc 限制时的替代方案之一(见 3.12.1)。
1.2 获取并校验官方源码 tarball
Download URL(以 4.5.3 为例,可访问 Apache 归档目录查询最新版):
mkdir -p /opt/impala-src && cd /opt/impala-src
curl -sSL -o apache-impala-4.5.3.tar.gz \
https://archive.apache.org/dist/impala/4.5.3/apache-impala-4.5.3.tar.gz
ls -lh apache-impala-4.5.3.tar.gz
sha256sum apache-impala-4.5.3.tar.gz
实测回显:
-rw-r--r-- 1 root root 60M Oct 11 09:00 apache-impala-4.5.3.tar.gz
c822c9ba7a16220681d4acf2f0e9c53bf1adfffff4a5f9e47ebd606dfe2dcf93 apache-impala-4.5.3.tar.gz
解压并查看顶层结构:
tar -xzf apache-impala-4.5.3.tar.gz
ls -d apache-impala-4.5.3 && ls apache-impala-4.5.3
实测回显(顶层目录):
apache-impala-4.5.3
CMakeLists.txt LICENSE.txt README.md be bin common fe infra
java lib package security shell testdata tests www
💡 说明:源码树里
bin/是构建/开发辅助脚本(如buildall.sh、bootstrap_build.sh、start-impala-cluster.py),并不包含可直接运行的守护进程二进制;真正的impalad/catalogd/statestored二进制属于be/编译产物,由发行版预构建运行包提供。
1.3 版本选型
| 版本 | 性质 | 说明 |
|---|---|---|
| 4.5.3 | 当前最新 GA(Apache) | 源码 tarball 已发布;本文实测版本 |
| 4.5.2 / 4.5.0 | GA | 上游稳定线,可平滑升级到 4.5.3 |
| 4.x | GA | 现代版本,支持 Kudu 绑定、HS2 等现代协议 |
| 3.x | 更早稳定线 | 旧部署仍在用(CDH 6) |
选择建议:新环境优先 4.5.x;已有 CDH/Hadoop 发行版环境的,跟随发行版捆绑的 Impala 版本。
1.4 多方案对照与选择建议
| 维度 | Ubuntu 22.04(实测) | CentOS 8 | 源码自编译 |
|---|---|---|---|
| 安装方式 | 预构建运行包 + tar 解压 | 同左 | 下载源码 + 工具链编译 |
| 联网需求 | 需联网(获取包与仓库) | 需联网 | 需联网 |
| 系统支持 | 官方支持范围较广 | 已 EOL,需自行处理 | 与系统无关 |
| 前置 | JDK17 + HDFS + Metastore | 同左 | JDK17 + cmake/thrift/clang 等 |
| 监听端口 | 21000/21050/25000 等 | 同左 | 同左 |
| 优缺点 | 社区/发行版受益、快 | 存量 CDH 体系兼容 | 完全可控但构建繁重 |
建议:可联网的新环境选 Ubuntu 22.04 预构建包(本文第四章验证路径);存量 CDH/内网隔离环境沿用发行版捆绑版本或源码自编译。
二、前置条件
Impala 定位为"Hadoop 生态的分布式 SQL 查询引擎",其运行强依赖以下组件:
| 依赖 | 作用 | 是否必需 |
|---|---|---|
| HDFS(Hadoop NameNode+DataNode) | 存储层,建表/写入/扫描的数据存放 | 必需 |
| Hive Metastore | 元数据(库/表/分区/文件路径)的存放与访问 | 必需 |
| statestored | Impala 集群状态管理,各进程心跳与订阅 | 必需 |
| catalogd | 元数据目录服务,把 Hive 元数据同步给 impalad | 必需 |
| impalad | 查询协调与执行引擎(客户端连接入口) | 必需 |
| Kudu / Apache Ranger(可选) | Kudu 作为原生存储绑定、Ranger 做鉴权 | 可选 |
⚠️ 说明:Impala 常见部署形态是"HDFS + Hive Metastore + statestore + catalog + impalad"五件套。本文两章均采用单节点伪集群(一台服务器上跑齐 NameNode/DataNode/Metastore/三守护进程),满足演示与中小规模场景。
本机前置核验(Ubuntu 22.04 实测,Intel x86_64,JDK 环境由下文安装):
uname -r
nproc
free -h
实测回显:
6.8.0-138-generic
6
total used free shared buff/cache available
Mem: 47Gi 9.7Gi 17Gi 60Mi 19Gi 36Gi
三、CentOS 8 安装 Apache Impala 4.5.3
目标:在 CentOS 8 服务器上安装 Apache Impala 4.5.3(MPP 分布式 SQL 查询引擎)。本章完整覆盖前置依赖:yum 源修复、JDK 17/8、Hadoop 3.3.6(HDFS 伪分布式)、Hive 3.1.3(standalone Metastore)、Impala 本体(DEB 解包安装 + 依赖库补齐 + 配置),并按真实执行结果给出启动验证与已知限制。全程在 CentOS 8.4.2105 服务器上实际执行,命令与回显均为真实输出。
3.1 环境信息
| 项目 | 值 |
|---|---|
| 操作系统 | CentOS Linux release 8.4.2105 |
| glibc | 2.28(ldd --version 实测) |
| 主机名 | impala-centos8 |
| IP 地址 | 172.17.0.29 |
| JDK | OpenJDK 17.0.1 与 OpenJDK 1.8.0_312 并存,默认切换为 17 |
| Hadoop | 3.3.6(介质 /tmp/hadoop-3.3.6.tar.gz,697MB) |
| Hive | 3.1.3(介质 /tmp/hive.tar.gz → apache-hive-3.1.3-bin,312MB) |
| Impala | 4.5.3-RELEASE(介质 /tmp/impala.deb,577MB,Ubuntu 22.04 构建) |
| 系统管理用户 | root(密码 q1w2e3r4) |
端口规划:HDFS 9000/9870/9864;Hive Metastore 9083;Impala statestored 24000、catalogd 26000、impalad 21000/21050/25000。
3.2 前置条件
- root 权限执行全部命令。
- 安装介质已置于 /tmp(hadoop-3.3.6.tar.gz、hive.tar.gz、impala.deb)。
- 设置系统管理员密码(实测执行):
echo 'root:q1w2e3r4' | chpasswd
验证:
grep ^root /etc/shadow | cut -d: -f2 | cut -c1-4
真实回显:
$6$r
($6$ 为 SHA-512 加密前缀,密码已生效。)
- 写入 /etc/hosts 主机映射:
echo "172.17.0.29 impala-centos8" >> /etc/hosts
grep impala-centos8 /etc/hosts
真实回显:
172.17.0.29 impala-centos8
3.3 修复 yum 源(阿里云镜像)
CentOS 8 于 2024 年 5 月 EOL,官方源(mirrorlist.centos.org)已失效。将源切换为阿里云 centos-vault 归档镜像:
mkdir -p /etc/yum.repos.d.bak
mv /etc/yum.repos.d/*.repo /etc/yum.repos.d.bak/
cat > /etc/yum.repos.d/CentOS-Aliyun.repo <<"EOF"
[baseos]
name=CentOS-8-BaseOS
baseurl=https://mirrors.aliyun.com/centos-vault/8.5.2111/BaseOS/$basearch/os/
gpgcheck=0
enabled=1
[appstream]
name=CentOS-8-AppStream
baseurl=https://mirrors.aliyun.com/centos-vault/8.5.2111/AppStream/$basearch/os/
gpgcheck=0
enabled=1
[powertools]
name=CentOS-8-PowerTools
baseurl=https://mirrors.aliyun.com/centos-vault/8.5.2111/PowerTools/$basearch/os/
gpgcheck=0
enabled=1
[extras]
name=CentOS-8-Extras
baseurl=https://mirrors.aliyun.com/centos-vault/8.5.2111/extras/$basearch/os/
gpgcheck=0
enabled=1
EOF
yum clean all
yum makecache
真实回显:
18 files removed
CentOS-8-BaseOS 588 kB/s | 4.6 MB 00:07
CentOS-8-AppStream 391 kB/s | 8.4 MB 00:22
CentOS-8-PowerTools 417 kB/s | 2.3 MB 00:05
CentOS-8-Extras 16 kB/s | 10 kB 00:00
Metadata cache created.
补充:dpkg 工具不在基础源中,需启用 EPEL 后安装(见 3.6.1)。
3.4 安装 JDK 17 与 JDK 8
yum install -y java-17-openjdk-devel java-1.8.0-openjdk-devel \
krb5-workstation cyrus-sasl-lib cyrus-sasl-plain cyrus-sasl-gssapi \
openssl-libs hostname glibc-langpack-en
真实回显(安装结果摘要):
java-1.8.0-openjdk-devel.x86_64 1:1.8.0.312.b07-2.el8_5 appstream
java-17-openjdk-devel.x86_64 1:17.0.1.0.12-2.el8_5 appstream
Complete!
将 JDK 17 设为系统默认并验证:
alternatives --set java /usr/lib/jvm/java-17-openjdk-17.0.1.0.12-2.el8_5.x86_64/bin/java
java -version
真实回显:
openjdk version "17.0.1" 2021-10-19 LTS
验证 JDK 8(Hive/Impala DEB 声明依赖):
/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.312.b07-2.el8_5.x86_64/bin/java -version
真实回显:
openjdk version "1.8.0_312"
OpenJDK Runtime Environment (build 1.8.0_312-b07)
3.5 安装 Hadoop 3.3.6(HDFS 伪分布式)
3.5.1 解包
tar -xzf /tmp/hadoop-3.3.6.tar.gz -C /opt
mv /opt/hadoop-3.3.6 /opt/hadoop
ls /opt/hadoop/
真实回显:
LICENSE-binary LICENSE.txt NOTICE-binary NOTICE.txt README.txt
bin etc include lib libexec logs sbin share
3.5.2 配置环境与 HDFS 参数
追加 /opt/hadoop/etc/hadoop/hadoop-env.sh(CentOS 8 上 Hadoop 3.3.6 以 root 运行必须定义 HDFS_*_USER,否则 start-dfs.sh 报 no HDFS_DATANODE_USER defined):
cat >> /opt/hadoop/etc/hadoop/hadoop-env.sh <<"EOF"
export JAVA_HOME=/usr/lib/jvm/java-17-openjdk-17.0.1.0.12-2.el8_5.x86_64
export HADOOP_HOME=/opt/hadoop
export PATH=$PATH:$HADOOP_HOME/bin:$HADOOP_HOME/sbin
export HDFS_NAMENODE_USER=root
export HDFS_DATANODE_USER=root
export HDFS_SECONDARYNAMENODE_USER=root
export HDFS_JOURNALNODE_USER=root
export HDFS_ZKFC_USER=root
EOF
core-site.xml:
<?xml version="1.0"?>
<configuration>
<property><name>fs.defaultFS</name><value>hdfs://impala-centos8:9000</value></property>
<property><name>hadoop.tmp.dir</name><value>/opt/hadoop/tmp</value></property>
</configuration>
hdfs-site.xml:
<?xml version="1.0"?>
<configuration>
<property><name>dfs.replication</name><value>1</value></property>
<property><name>dfs.namenode.name.dir</name><value>/opt/hadoop/namenode</value></property>
<property><name>dfs.datanode.data.dir</name><value>/opt/hadoop/datanode</value></property>
</configuration>
3.5.3 格式化 NameNode
export HADOOP_HOME=/opt/hadoop
export JAVA_HOME=/usr/lib/jvm/java-17-openjdk-17.0.1.0.12-2.el8_5.x86_64
/opt/hadoop/bin/hdfs namenode -format -force
真实回显(节选):
2026-10-07 09:23:05,137 INFO namenode.NameNode: SHUTDOWN_MSG:
/************************************************************
SHUTDOWN_MSG: Shutting down NameNode at 5268eb139c18/172.17.0.29
************************************************************/
3.5.4 启动 NameNode 与 DataNode
说明:本服务器未安装 openssh,start-dfs.sh 会因 ssh: command not found 中断(实测报错),改用 Hadoop 官方 --daemon 方式逐个启动:
/opt/hadoop/bin/hdfs --daemon start namenode
/opt/hadoop/bin/hdfs --daemon start datanode
验证进程与端口:
ps aux | grep -E "proc_namenode|proc_datanode" | grep -v grep | awk '{print $2}'
for p in 9000 9870 9864; do
timeout 2 bash -c "echo > /dev/tcp/impala-centos8/$p" 2>/dev/null && echo "$p OPEN" || echo "$p CLOSED"
done
真实回显:
1404
1491
9000 OPEN
9870 OPEN
9864 OPEN
3.5.5 HDFS 读写验证
/opt/hadoop/bin/hdfs dfs -mkdir -p /tmp/centostest
/opt/hadoop/bin/hdfs dfs -ls /tmp/
真实回显:
Found 1 items
drwxr-xr-x - root supergroup 0 2026-10-07 09:24 /tmp/centostest
3.6 安装 Hive 3.1.3(standalone Metastore)
3.6.1 解包
tar -xzf /tmp/hive.tar.gz -C /opt
mv /opt/apache-hive-3.1.3-bin /opt/hive
ls /opt/hive/
真实回显:
LICENSE NOTICE RELEASE_NOTES.txt bin binary-package-licenses conf
3.6.2 配置 hive-site.xml
cat > /opt/hive/conf/hive-site.xml <<"EOF"
<?xml version="1.0"?>
<configuration>
<property>
<name>hive.metastore.uris</name>
<value>thrift://impala-centos8:9083</value>
</property>
<property>
<name>hive.metastore.schema.verification</name>
<value>false</value>
</property>
<property>
<name>javax.jdo.option.ConnectionURL</name>
<value>jdbc:derby:/opt/hive/metastore_db;create=true</value>
</property>
<property>
<name>javax.jdo.option.ConnectionDriverName</name>
<value>org.apache.derby.jdbc.EmbeddedDriver</value>
</property>
<property>
<name>javax.jdo.option.ConnectionUserName</name>
<value>APP</value>
</property>
<property>
<name>hive.metastore.dml.events</name>
<value>true</value>
</property>
<property>
<name>hive.metastore.event.db.notification.api.auth</name>
<value>false</value>
</property>
<property>
<name>datanucleus.schema.autoCreateAll</name>
<value>true</value>
</property>
</configuration>
EOF
要点:dml.events=true 使 HMS 产生 DML 事件(catalogd 轮询依赖);datanucleus.schema.autoCreateAll=true 让 Derby 首次启动自动建表。
3.6.3 启动 Metastore
export HADOOP_HOME=/opt/hadoop
export JAVA_HOME=/usr/lib/jvm/java-17-openjdk-17.0.1.0.12-2.el8_5.x86_64
nohup /opt/hive/bin/hive --service metastore > /opt/hive/metastore.log 2>&1 &
验证(等待约 20 秒后):
timeout 2 bash -c "echo > /dev/tcp/impala-centos8/9083" && echo "9083 OPEN"
grep -iE "error|exception" /opt/hive/metastore.log | head -3
真实回显:
9083 OPEN
(日志无 error/exception,Metastore 正常。)
3.7 安装 Impala 4.5.3(DEB 解包)
Impala 官方发布二进制为 DEB/RPM。在 CentOS 8 上使用 dpkg-deb -x 解包 DEB 后手动布署到 /opt/impala。
3.7.1 安装 dpkg 工具
基础源无 dpkg,启用 EPEL 后安装(EPEL 8 仍在线维护):
yum install -y https://mirrors.aliyun.com/epel/epel-release-latest-8.noarch.rpm
yum install -y dpkg
dpkg-deb --version
真实回显:
Debian 'dpkg-deb' package archive backend version 1.20.9 (amd64).
This is free software; see the GNU General Public License version 2 or
later for copying conditions. There is NO warranty.
3.7.2 查看 DEB 包信息
dpkg-deb -I /tmp/impala.deb | grep -E "Package|Version|Architecture|Depends"
真实回显:
Package: impala
Architecture: amd64
Depends: hostname,krb5-user,language-pack-en,libsasl2-2,libsasl2-modules,libsasl2-modules-gssapi-mit,openjdk-8-jre-headless,tzdata
Version: 4.5.3-RELEASE
Installed-Size: 1060738
3.7.3 解包并修正目录
DEB 内部路径带 ./opt/impala/ 前缀,解包后需把内容上移一级:
mkdir -p /opt/impala
dpkg-deb -x /tmp/impala.deb /opt/impala
ls /opt/impala/opt/impala/
mv /opt/impala/opt/impala/* /opt/impala/
rmdir /opt/impala/opt/impala /opt/impala/opt
ls /opt/impala/
真实回显:
LICENSE NOTICE bin conf etc lib sbin shell util www
3.7.4 检查动态库依赖(ldd)
ldd /opt/impala/sbin/impalad 2>&1 | grep -E "not found"
真实回显:
/opt/impala/sbin/impalad: /lib64/libc.so.6: version `GLIBC_2.33' not found (required by /opt/impala/sbin/impalad)
/opt/impala/sbin/impalad: /lib64/libc.so.6: version `GLIBC_2.34' not found (required by /opt/impala/sbin/impalad)
/opt/impala/sbin/impalad: /lib64/libc.so.6: version `GLIBC_2.32' not found (required by /opt/impala/sbin/impalad)
/opt/impala/sbin/impalad: /lib64/libm.so.6: version `GLIBC_2.29' not found (required by /opt/impala/sbin/impalad)
/opt/impala/sbin/impalad: /lib64/libstdc++.so.6: version `GLIBCXX_3.4.26' not found (required by /opt/impala/sbin/impalad)
libsasl2.so.2 => not found
libjvm.so => not found
libkudu_client.so.0 => not found
libssl.so.3 => not found
libcrypto.so.3 => not found
两类问题:① GLIBC_2.29/2.32/2.33/2.34 与 GLIBCXX_3.4.26 版本不满足(Ubuntu 22.04 构建产物要求,CentOS 8 仅 glibc 2.28);② 若干 .so 未在系统路径中。①无法通过 yum 解决(见 3.12.1),②在下一节补齐。
3.8 补齐依赖库
# 1) libsasl2.so.2:CentOS 提供 libsasl2.so.3,建立符号链接
ln -sf /usr/lib64/libsasl2.so.3 /usr/lib64/libsasl2.so.2
# 2) libjvm.so:指向 JDK 17
ln -sf /usr/lib/jvm/java-17-openjdk-17.0.1.0.12-2.el8_5.x86_64/lib/server/libjvm.so /usr/lib64/libjvm.so
# 3) libkudu_client.so.0:Impala 自带(/opt/impala/lib/native/),链入系统目录
ln -sf /opt/impala/lib/native/libkudu_client.so.0 /usr/lib64/libkudu_client.so.0
# 4) libssl.so.3 / libcrypto.so.3:EPEL 提供 OpenSSL 3(CentOS 8 基础源只有 1.1)
yum install -y openssl3-libs
ls /usr/lib64/libssl.so.3
真实回显:
/usr/lib64/libssl.so.3
复查 ldd(GLIBC 版本类问题仍在,.so 缺失已消除):
LD_LIBRARY_PATH=/opt/impala/lib/native:/usr/lib64 ldd /opt/impala/sbin/impalad 2>&1 | grep -E "not found" | head -3
真实回显:
(无 not found 输出——缺失库已全部补齐,剩余仅为 GLIBC 版本不满足)
3.9 配置 Impala
3.9.1 flags 文件(/opt/impala/conf/)
statestored_flags:
-hostname=impala-centos8
-v=1
-log_filename=statestored
-max_log_files=10
-max_log_size=200
catalogd_flags:
-hostname=impala-centos8
-state_store_host=impala-centos8
-catalog_topic_mode=full
-v=1
-log_filename=catalogd
-max_log_files=10
-max_log_size=200
impalad_flags:
-hostname=impala-centos8
-catalog_service_host=impala-centos8
-state_store_host=impala-centos8
-mem_limit=3072m
-v=1
-log_filename=impalad
-max_log_files=10
-max_log_size=200
-use_local_catalog=false
3.9.2 impala-env.sh(含 JVM 堆 256-512MB)
cat > /opt/impala/conf/impala-env.sh <<"EOF"
#!/bin/bash
: ${JAVA_HOME:="/usr/lib/jvm/java-17-openjdk-17.0.1.0.12-2.el8_5.x86_64"}
export JAVA_TOOL_OPTIONS=${JAVA_TOOL_OPTIONS:- -Xms256m -Xmx512m}
: ${CLASSPATH:=}
: ${LD_LIBRARY_PATH:=}
: ${IMPALA_HOME:="/opt/impala"}
: ${IMPALAD_PIDFILE:="/tmp/impalad.pid"}
: ${CATALOGD_PIDFILE:="/tmp/catalogd.pid"}
: ${ADMISSIOND_PIDFILE:="/tmp/admissiond.pid"}
: ${STATESTORED_PIDFILE:="/tmp/statestored.pid"}
: ${IMPALAD_OUTFILE:="/tmp/impalad.out"}
: ${CATALOGD_OUTFILE:="/tmp/catalogd.out"}
: ${ADMISSIOND_OUTFILE:="/tmp/admissiond.out"}
: ${STATESTORED_OUTFILE:="/tmp/statestored.out"}
: ${IMPALAD_ERRFILE:="/tmp/impalad.err"}
: ${CATALOGD_ERRFILE:="/tmp/catalogd.err"}
: ${ADMISSIOND_ERRFILE:="/tmp/admissiond.err"}
: ${STATESTORED_ERRFILE:="/tmp/statestored.err"}
EOF
注意:impala.sh 内启用 set -u,若 impala-env.sh 缺少任一 OUT/ERR/PID 变量定义,会报 unbound variable(实测依次出现 CLASSPATH: unbound variable 与 !service_stdout_key: unbound variable),补齐上述全部变量后通过。
3.10 启动验证(真实回显)
cd /opt/impala
env JAVA_HOME=/usr/lib/jvm/java-17-openjdk-17.0.1.0.12-2.el8_5.x86_64 \
IMPALA_HOME=/opt/impala \
LD_LIBRARY_PATH=/opt/impala/lib/native:/usr/lib64 \
bin/impala.sh start statestored
真实回显(启动失败):
Using JAVA_HOME: /usr/lib/jvm/java-17-openjdk-17.0.1.0.12-2.el8_5.x86_64
HADOOP_HOME not set, using hadoop native libs in '/opt/impala/lib/native'
Service stdout is redirected to '/tmp/statestored.out'.
Service stderr is redirected to '/tmp/statestored.err'.
statestored is stopped.
stderr 明细(/tmp/statestored.err):
/opt/impala/sbin/statestored: /usr/lib64/libm.so.6: version `GLIBC_2.29' not found (required by /opt/impala/lib/native/libkudu_client.so.0)
/opt/impala/sbin/statestored: /usr/lib64/libsasl2.so.2: no version information available (required by /opt/impala/lib/native/libkudu_client.so.0)
/opt/impala/sbin/statestored: /usr/lib64/libc.so.6: version `GLIBC_2.33' not found (required by /opt/impala/lib/native/libstdc++.so.6)
/opt/impala/sbin/statestored: /usr/lib64/libc.so.6: version `GLIBC_2.34' not found (required by /opt/impala/lib/native/libstdc++.so.6)
/opt/impala/sbin/statestored: /usr/lib64/libc.so.6: version `GLIBC_2.34' not found (required by /opt/impala/lib/native/libgcc_s.so.1)
结论:Ubuntu 22.04 构建的 Impala 4.5.3 二进制(impalad/catalogd/statestored)要求 glibc ≥ 2.29(部分库 2.34)与 GLIBCXX_3.4.26,CentOS 8 系统 glibc 为 2.28,运行前即被动态链接器拒绝,无法启动。此限制与本文实测环境(未安装 openssh、以 root 运行)无关,属于构建目标平台差异,见 3.12.1 的替代方案。
3.11 JVM 与常用配置修改说明
Impala 的配置集中在 /opt/impala/conf/:
| 文件 | 用途 | 常用修改项 |
|---|---|---|
| impala-env.sh | JVM 与进程环境 | JAVA_HOME、JAVA_TOOL_OPTIONS、PID/out/err 路径 |
| impalad_flags | impalad 参数 | -hostname、-mem_limit、-use_local_catalog、-beeswax_port、-hs2_port |
| catalogd_flags | catalogd 参数 | -state_store_host、-catalog_topic_mode |
| statestored_flags | statestored 参数 | -statestore_port |
| core-site.xml / hdfs-site.xml | HDFS 客户端 | fs.defaultFS、dfs.replication |
| hive-site.xml | HMS 客户端 | hive.metastore.uris |
JVM 堆限制:impala-env.sh 中 export JAVA_TOOL_OPTIONS=${JAVA_TOOL_OPTIONS:- -Xms256m -Xmx512m},初始堆 256MB、最大堆 512MB,JVM 启动时自动读取,作用于 impalad 的 Frontend 与 catalogd 的 JVM 部分。修改后 bin/impala.sh restart catalogd 与 restart impalad 生效。
进程内存:-mem_limit=3072m 限制 impalad 进程总内存;-log_dir/-max_log_files/-max_log_size 控制日志轮转;-beeswax_port(默认 21000)/-hs2_port(默认 21050)修改端口。
3.12 已知限制与排查思路
3.12.1 glibc 版本不满足(根本限制)
现象:三个守护进程启动即失败,stderr 报 GLIBC_2.29/2.33/2.34 not found、GLIBCXX_3.4.26 not found。原因:官方 DEB 包按 Ubuntu 22.04(glibc 2.35)构建;CentOS 8 glibc 锁定 2.28,动态链接器拒绝加载。此问题不能通过 yum 升级解决(升级 glibc 会破坏系统),也非「补 .so 库」可解。
排查步骤:
ldd --version确认 glibc 版本(实测ldd (GNU libc) 2.28)。ldd /opt/impala/sbin/impalad 2>&1 | grep "not found"区分缺失库与版本不满足。- 缺失库按 3.8 节补齐(openssl3-libs、sasl 符号链接、kudu 自带库);版本不满足则须更换构建产物或系统。
替代方案(推荐序):
- 使用 RHEL/CentOS 兼容构建:Cloudera CDH 发布的 Impala el7/el8 RPM(CDH 6.3 为 Impala 3.x,需自行确认 4.5.3 分发渠道),或自行编译
apache-impala-4.5.3.tar.gz源码(官网 archive 已确认可下载,60MB,需 CMake/LLVM/Maven 工具链)。 - 更换系统:AlmaLinux 9 / Rocky Linux 9 / CentOS Stream 9(glibc 2.34)可原生运行该 DEB 二进制;AlmaLinux 8/Rocky 8 同为 glibc 2.28,同样不满足。
- 维持 Ubuntu 22.04 平台部署 Impala 4.5.3(官方 DEB 的构建目标平台)。
3.12.2 start-dfs.sh 依赖 ssh
未装 openssh 时 start-dfs.sh 报 ssh: command not found。解法:yum install -y openssh-server openssh-clients 并配置免密,或直接使用 hdfs --daemon start namenode 与 hdfs --daemon start datanode 逐个启动(本文采用)。
3.12.3 root 运行 Hadoop 报 HDFS_*_USER 未定义
Hadoop 3.3.x 以 root 运行 start-dfs.sh 时报 no HDFS_DATANODE_USER defined,需在 hadoop-env.sh 中显式声明 HDFS_NAMENODE_USER/HDFS_DATANODE_USER 等五个变量(本文 3.5.2)。
3.12.4 impala.sh 报 unbound variable
impala.sh 启用 set -u,impala-env.sh 必须完整定义四组服务的 PIDFILE/OUTFILE/ERRFILE 与 CLASSPATH/LD_LIBRARY_PATH,缺一即报 unbound variable(本文 3.9.2 已给完整模板)。
3.12.5 安全说明
Impala 4.5.3 默认无内置认证(no-authentication),生产环境需启用 Kerberos/LDAP 与 TLS。系统管理凭据:root / q1w2e3r4(SSH 或控制台登录)。
四、Ubuntu 22.04 安装 Apache Impala 4.5.3
目标:在一台全新的 Ubuntu 22.04 服务器上,从零安装 Apache Impala 4.5.3(MPP 分布式 SQL 查询引擎)。本章覆盖全部前置依赖:JDK 17、Hadoop 3.3.6(HDFS 伪分布式)、Hive 3.1.3(standalone Metastore)、Impala 本体(statestored/catalogd/impalad 三个守护进程),并以真实回显逐步验证安装结果。全程在 Ubuntu 22.04 服务器上实际执行,命令与回显均为真实输出。
4.1 环境信息
本章实测环境为 Ubuntu 22.04.5 LTS 服务器(主机名 impala-ubuntu2204),各项参数如下:
| 项目 | 值 |
|---|---|
| 操作系统 | Ubuntu 22.04.5 LTS (Jammy Jellyfish) |
| 内核 | 6.8.0-138-generic |
| CPU / 内存 | 6 核 / 47 GiB |
| 磁盘 | overlay 786G(可用 517G) |
| 主机名 | impala-ubuntu2204 |
| IP 地址 | 172.17.0.54 与 192.168.112.2(/etc/hosts 同时映射到主机名) |
| JDK | OpenJDK 17.0.20.1(/usr/lib/jvm/java-17-openjdk-amd64),另有 JDK 8 供 Hive/Impala 兼容 |
| Hadoop | 3.3.6(安装介质 /tmp/hadoop-3.3.6.tar.gz,解包到 /opt/hadoop) |
| Hive | 3.1.3(安装介质 /tmp/hive.tar.gz → apache-hive-3.1.3-bin,解包到 /opt/hive) |
| Impala | 4.5.3-RELEASE(安装介质 /tmp/impala.deb,604MB,dpkg 解包到 /opt/impala) |
| 系统管理用户 | root(密码 q1w2e3r4,安装过程用 chpasswd 设置) |
端口规划:HDFS NameNode RPC 9000、NameNode WebUI 9870、DataNode 9864-9867;Hive Metastore Thrift 9083;statestored 24000、catalogd 26000、impalad Beeswax 21000、HS2 21050、KRPC 27000、WebUI 25000(impalad)/ 25010(statestored)/ 25020(catalogd)。
4.2 前置条件
- root 权限:全程以 root 执行,普通用户操作(impala 用户)前用
sudo -u impala切换。 - 网络:apt 源可达(安装 JDK 用);安装介质 Hadoop/Hive/Impala 已下载到
/tmp。 - 设置系统管理员密码(实测):
echo 'root:q1w2e3r4' | chpasswd
验证密码策略生效:
# 检查 root 的 shadow 记录(* 为锁定、$6$ 开头为 sha512 密码)
grep ^root /etc/shadow | cut -d: -f2 | cut -c1-4
真实回显:
$6$r
($6$ 前缀表示密码已用 SHA-512 加密保存,即 q1w2e3r4 已生效。)
- /etc/hosts 双 IP 映射(Impala 各组件之间通过主机名互访,双 IP 可保证本机与外部网络均可访问):
127.0.0.1 localhost
172.17.0.54 impala-ubuntu2204
192.168.112.2 impala-ubuntu2204
4.3 安装 JDK 17
apt-get update
apt-get install -y openjdk-17-jdk-headless openjdk-8-jre-headless krb5-user libsasl2-2 libsasl2-modules libsasl2-modules-gssapi-mit hostname language-pack-en tzdata
说明:openjdk-8 是 Impala DEB 包声明依赖(见下文 dpkg -I 输出),Hive 3.1.3 对 JDK 8/17 均兼容;Impala 4.5.3 官方推荐 JDK 17 运行 impalad。
验证:
java -version
ls /usr/lib/jvm/
真实回显:
openjdk version "17.0.20.1" 2026-08-18
OpenJDK Runtime Environment (build 17.0.20.1+1-1-22.04-Ubuntu)
OpenJDK 64-Bit Server VM (build 17.0.20.1+1-1-22.04-Ubuntu, mixed mode, sharing)
java-1.17.0-openjdk-amd64
java-1.8.0-openjdk-amd64
java-17-openjdk-amd64
java-8-openjdk-amd64
4.4 安装 Hadoop 3.3.6(HDFS 伪分布式)
4.4.1 解包
tar -xzf /tmp/hadoop-3.3.6.tar.gz -C /opt
ls /opt/hadoop/
/opt/hadoop/bin/hdfs version | head -1
真实回显:
LICENSE-binary LICENSE.txt NOTICE-binary NOTICE.txt README.txt
bin datanode etc include lib libexec logs namenode sbin share
Hadoop 3.3.6
4.4.2 配置环境变量
编辑 /opt/hadoop/etc/hadoop/hadoop-env.sh,追加(实测内容):
export JAVA_HOME=/usr/lib/jvm/java-17-openjdk-amd64
export HADOOP_HOME=/opt/hadoop
export PATH=$PATH:$HADOOP_HOME/bin:$HADOOP_HOME/sbin
编辑 /opt/hadoop/etc/hadoop/core-site.xml:
<?xml version="1.0"?>
<configuration>
<property><name>fs.defaultFS</name><value>hdfs://192.168.112.2:9000</value></property>
<property><name>hadoop.tmp.dir</name><value>/opt/hadoop/tmp</value></property>
</configuration>
编辑 /opt/hadoop/etc/hadoop/hdfs-site.xml(单副本 + 固定数据目录):
<?xml version="1.0"?>
<configuration>
<property><name>dfs.replication</name><value>1</value></property>
<property><name>dfs.namenode.name.dir</name><value>/opt/hadoop/namenode</value></property>
<property><name>dfs.datanode.data.dir</name><value>/opt/hadoop/datanode</value></property>
</configuration>
4.4.3 格式化 NameNode
/opt/hadoop/bin/hdfs namenode -format -force
格式化产物(真实存在):
cat /opt/hadoop/namenode/current/VERSION
真实回显:
namespaceID=937368397
clusterID=CID-c113f5b6-1b87-4e4e-bad8-5ff7640e8e75
layoutVersion=-66
4.4.4 启动 HDFS
/opt/hadoop/sbin/start-dfs.sh
验证进程与端口:
ps aux | grep -E "NameNode|DataNode" | grep -v grep
for p in 9000 9870 9864; do timeout 2 bash -c "echo > /dev/tcp/172.17.0.54/$p" 2>/dev/null && echo "$p OPEN" || echo "$p CLOSED"; done
真实回显:
root 5226 ... -Dproc_namenode ...
root 5307 ... -Dproc_datanode ...
9000 OPEN
9870 OPEN
9864 OPEN
说明:实测发现 NameNode 的 RPC 9000 绑定到 172.17.0.54(主机名解析首选地址),而配置的 fs.defaultFS 为 192.168.112.2:9000。HDFS 客户端会触发 "Address change detected" 自动重连,不影响使用;如需统一,可把 /etc/hosts 中 192.168.112.2 移到首行后重启 HDFS。
4.4.5 HDFS 基本验证
export HADOOP_HOME=/opt/hadoop
/opt/hadoop/bin/hdfs dfs -ls /
/opt/hadoop/bin/hdfs dfs -mkdir -p /tmp/emp_data
/opt/hadoop/bin/hdfs dfs -ls /tmp/
真实回显:
Found 2 items
drwxrwxrwx - root supergroup 0 2026-10-07 07:43 /tmp
drwxrwxrwx - root supergroup 0 2026-10-07 07:43 /user
Found 1 items
drwxr-xr-x - root supergroup 0 2026-10-07 09:08 /tmp/impala_test
4.5 安装 Hive 3.1.3(standalone Metastore)
Impala 不直接存储元数据,它依赖 Hive Metastore(HMS)保存库表定义。本环境采用 standalone(独立进程)模式,元数据库使用内嵌 Derby。
4.5.1 解包
tar -xzf /tmp/hive.tar.gz -C /opt
mv /opt/apache-hive-3.1.3-bin /opt/hive
tar -tzf /tmp/hive.tar.gz | head -3
真实回显:
apache-hive-3.1.3-bin/LICENSE
apache-hive-3.1.3-bin/RELEASE_NOTES.txt
apache-hive-3.1.3-bin/NOTICE
4.5.2 配置 hive-site.xml
编辑 /opt/hive/conf/hive-site.xml,关键配置(实测内容):
<configuration>
<property>
<name>hive.metastore.uris</name>
<value>thrift://impala-ubuntu2204:9083</value>
</property>
<property>
<name>hive.metastore.schema.verification</name>
<value>false</value>
</property>
<property>
<name>javax.jdo.option.ConnectionURL</name>
<value>jdbc:derby:/opt/hive/metastore_db;create=true</value>
</property>
<property>
<name>javax.jdo.option.ConnectionUserName</name>
<value>APP</value>
</property>
<property>
<name>hive.metastore.dml.events</name>
<value>true</value>
</property>
<property>
<name>hive.metastore.event.db.notification.api.auth</name>
<value>false</value>
</property>
</configuration>
要点:hive.metastore.dml.events=true 让 HMS 产生 DML 通知事件(Impala 4.x catalogd 依赖事件轮询同步数据变更);schema.verification=false 避免 Derby 首次启动时版本校验失败;Derby 数据目录 /opt/hive/metastore_db。
4.5.3 启动 Metastore
export JAVA_HOME=/usr/lib/jvm/java-17-openjdk-amd64
export HADOOP_HOME=/opt/hadoop
nohup /opt/hive/bin/hive --service metastore > /opt/hive/metastore.log 2>&1 &
验证进程与端口 9083:
ps aux | grep -E "proc_metastore|RunJar" | grep -v grep | awk '{print $2, $14}'
timeout 2 bash -c "echo > /dev/tcp/impala-ubuntu2204/9083" && echo "9083 OPEN"
/opt/hive/bin/hive --version 2>/dev/null | grep "^Hive"
真实回显:
10443 -Dproc_metastore
9083 OPEN
Hive 3.1.3
4.6 安装 Impala 4.5.3
4.6.1 查看 DEB 包信息并解包
Impala 官方发布二进制为 DEB/RPM 包,本环境使用 DEB 包通过 dpkg -x 解包方式安装到指定目录(不写系统路径,便于控制):
dpkg -I /tmp/impala.deb | head -25
真实回显:
new Debian package, version 2.0.
size 604139650 bytes: control archive=33234 bytes.
395 bytes, 11 lines control
109097 bytes, 1167 lines md5sums
1043 bytes, 26 lines postinst #!/bin/bash
Architecture: amd64
Depends: hostname,krb5-user,language-pack-en,libsasl2-2,libsasl2-modules,libsasl2-modules-gssapi-mit,openjdk-8-jre-headless,tzdata
Description: An open source massively parallel processing SQL query engine.
Homepage: https://impala.apache.org
Maintainer: dev@impala.apache.org
Package: impala
Priority: optional
Section: devel
Version: 4.5.3-RELEASE
Installed-Size: 1060738
解包并创建运行用户:
mkdir -p /opt/impala
dpkg -x /tmp/impala.deb /opt/impala
useradd -r -m -s /bin/bash impala
chown -R impala:impala /opt/impala
ls /opt/impala/
真实回显(解包耗时约 10 秒,解包后 757MB):
LICENSE NOTICE bin conf lib sbin shell util www
4.6.2 关键可执行文件
ls -la /opt/impala/sbin/statestored /opt/impala/sbin/catalogd /opt/impala/sbin/impalad /opt/impala/bin/impala.sh
真实回显:
-rwxr-xr-x 1 impala impala 46288008 ... statestored
-rwxr-xr-x 1 impala impala 78264848 ... catalogd
-rwxr-xr-x 1 impala impala 90449824 ... impalad
-rwxrwxr-x 1 impala impala 10925 ... impala.sh
impala.sh 是官方管理脚本,用法:
Usage: /opt/impala/bin/impala.sh <command> [<options>] <service> [<flags>]
command: {start|stop|restart|status|health}
service: {impalad|catalogd|admissiond|statestored}
4.7 配置 Impala
4.7.1 flags 文件(/opt/impala/conf/)
Impala 各守护进程通过 --flagfile 指定启动参数。本环境三个 flags 文件实测内容:
impalad_flags:
-hostname=impala-ubuntu2204
-catalog_service_host=impala-ubuntu2204
-state_store_host=impala-ubuntu2204
-mem_limit=3072m
-v=1
-log_filename=impalad
-max_log_files=10
-max_log_size=200
-use_local_catalog=false
catalogd_flags:
-hostname=impala-ubuntu2204
-state_store_host=impala-ubuntu2204
-catalog_topic_mode=full
-v=1
-log_filename=catalogd
-max_log_files=10
-max_log_size=200
statestored_flags:
-hostname=impala-ubuntu2204
-v=1
-log_filename=statestored
-max_log_files=10
-max_log_size=200
参数说明:-hostname 为本机对外主机名;-catalog_service_host/-state_store_host 指向 statestored 所在节点(单机即本机);-mem_limit 为 impalad 进程总内存上限;-use_local_catalog=false 使用集中式 catalog(通过 statestore 同步);-catalog_topic_mode=full 让 catalogd 以全量模式发布 topic(对后续 impalad 启动成功率有直接影响,见常见问题)。
4.7.2 JVM 配置(impala-env.sh)
编辑 /opt/impala/conf/impala-env.sh,关键行(实测内容):
: ${JAVA_HOME:="/usr/lib/jvm/java-17-openjdk-amd64"}
export JAVA_TOOL_OPTIONS=${JAVA_TOOL_OPTIONS:- -Xms256m -Xmx512m}
: ${IMPALAD_PIDFILE:="/tmp/impalad.pid"}
: ${CATALOGD_PIDFILE:="/tmp/catalogd.pid"}
: ${STATESTORED_PIDFILE:="/tmp/statestored.pid"}
: ${IMPALAD_OUTFILE:="/tmp/impalad.out"}
说明:Impala 的 Frontend(Java 部分)与 catalogd 均受 JAVA_TOOL_OPTIONS 控制;-Xms256m -Xmx512m 将 JVM 堆限制在 256-512MB。PID 文件与 stdout/stderr 默认落在 /tmp 下(impala.sh 依赖 PID 文件做状态管理)。
4.7.3 core-site.xml / hive-site.xml 副本
Impala 通过 /opt/impala/conf/core-site.xml、hdfs-site.xml、hive-site.xml 感知 HDFS 与 HMS。将 Hadoop/Hive 的配置复制过来(实测 /opt/impala/conf/ 下已有这些文件,内容与 4.4.2、4.5.2 一致,其中 hive-site.xml 的 metastore.uris 为 thrift://impala-ubuntu2204:9083):
cp /opt/hadoop/etc/hadoop/core-site.xml /opt/hadoop/etc/hadoop/hdfs-site.xml /opt/impala/conf/
cp /opt/hive/conf/hive-site.xml /opt/impala/conf/
4.8 启动 Impala 服务
4.8.1 启动顺序(关键)
正确顺序:statestored → catalogd → impalad,且每步等待就绪后再启动下一步。原因见「已知限制与排查思路」:若 statestore 的 catalog topic 尚无数据(Size=0)时 impalad 抢先订阅,会陷入 "Waiting for local catalog" 死等。
cd /opt/impala
sudo -u impala -E env JAVA_HOME=/usr/lib/jvm/java-17-openjdk-amd64 IMPALA_HOME=/opt/impala bin/impala.sh start statestored
sudo -u impala -E env JAVA_HOME=/usr/lib/jvm/java-17-openjdk-amd64 IMPALA_HOME=/opt/impala bin/impala.sh start catalogd
sudo -u impala -E env JAVA_HOME=/usr/lib/jvm/java-17-openjdk-amd64 IMPALA_HOME=/opt/impala bin/impala.sh start impalad
4.8.2 验证三个服务状态
/opt/impala/bin/impala.sh status statestored
/opt/impala/bin/impala.sh status catalogd
/opt/impala/bin/impala.sh status impalad
真实回显:
statestored is running with PID 16753.
catalogd is running with PID 16823.
impalad is running with PID 20113.
4.8.3 验证端口监听
for p in 21000 21050 24000 25000 25010 25020 26000 27000; do
timeout 2 bash -c "echo > /dev/tcp/localhost/$p" 2>/dev/null && echo "$p OPEN" || echo "$p CLOSED"
done
真实回显:
21000 OPEN
21050 OPEN
24000 OPEN
25000 OPEN
25010 OPEN
25020 OPEN
26000 OPEN
27000 OPEN
4.8.4 关键启动日志
impalad 成功初始化的标志(日志 /tmp/impalad.impala-ubuntu2204.impala.log.INFO.<时间戳>.<pid>):
I1007 08:57:44.239984 17791 HiveMetaStoreClient.java:570] Connected to metastore.
I1007 08:57:44.646719 17791 Frontend.java:1904] Waiting for local catalog to be initialized, attempt: 0
I1007 08:57:44.748603 17791 Frontend.java:1900] Local catalog initialized after: 102 ms.
I1007 08:57:44.752245 17791 impala-server.cc:3331] Initialized coordinator/executor Impala server on impala-ubuntu2204:27000
I1007 08:57:44.753579 17791 thrift-server.cc:435] ThriftServer 'beeswax-frontend' started on port: 21000
I1007 08:57:44.753634 17791 impala-server.cc:3352] Impala Beeswax Service listening on 21000
I1007 08:57:44.753639 17791 impala-server.cc:3357] Impala has started.
catalogd 连接 HMS 成功的标志(日志 /tmp/catalogd.impala-ubuntu2204.impala.log.INFO.*):
I1007 08:37:38.738389 16823 HiveMetaStoreClient.java:441] Trying to connect to metastore with URI thrift://impala-ubuntu2204:9083
I1007 08:37:38.757357 16823 HiveMetaStoreClient.java:517] Opened a connection to metastore, current connections: 1
I1007 08:37:38.773902 16823 HiveMetaStoreClient.java:570] Connected to metastore.
statestored 发布 topic 的标志(日志 /tmp/statestored.impala-ubuntu2204.impala.log.INFO.*):
I1007 08:57:44.646358 16761 statestore.cc:515] Preparing initial catalog-update topic update for impalad@impala-ubuntu2204:27000. Size = 269.00 B
Size = 269.00 B 表明 impalad 订阅时 catalog topic 已有数据,这是本次启动一次成功的关键。
4.9 功能验证
4.9.1 impala-shell 连接与 SHOW DATABASES
export JAVA_HOME=/usr/lib/jvm/java-17-openjdk-amd64
/opt/impala/shell/impala-shell -i impala-ubuntu2204:21000 --protocol=beeswax -q "SHOW DATABASES;"
真实回显:
Starting Impala Shell with no authentication using Python 3.10.12
Warning: live_progress only applies to interactive shell sessions, and is being skipped for now.
Opened TCP connection to impala-ubuntu2204:21000
Connected to impala-ubuntu2204:21000
Server version: impalad version 4.5.3-RELEASE RELEASE (build b3e78704d824efd8f9ecb884d4aa1c09d4e12017)
Query: SHOW DATABASES
+------------------+----------------------------------------------+
| name | comment |
+------------------+----------------------------------------------+
| _impala_builtins | System database for Impala builtin functions |
| default | Default Hive database |
+------------------+----------------------------------------------+
Fetched 2 row(s) in 0.02s
说明:21000 为 beeswax 协议端口,连接时需显式加 --protocol=beeswax;Impala 4.x 同时提供 HS2 端口 21050(默认协议),-i impala-ubuntu2204:21050 亦可用(见常用 CLI 文档中两端口差异)。
4.9.2 建表
/opt/impala/shell/impala-shell -i impala-ubuntu2204:21000 --protocol=beeswax \
-q "CREATE TABLE IF NOT EXISTS default.emp (id INT, name STRING, dept STRING, salary INT) STORED AS PARQUET;"
真实回显:
Query: CREATE TABLE IF NOT EXISTS default.emp (id INT, name STRING, dept STRING, salary INT) STORED AS PARQUET
+-------------------------+
| summary |
+-------------------------+
| Table has been created. |
+-------------------------+
Fetched 1 row(s) in 1.52s
4.9.3 插入数据
/opt/impala/shell/impala-shell -i impala-ubuntu2204:21000 --protocol=beeswax \
-q "INSERT INTO default.emp VALUES (1, 'Alice', 'Eng', 12000), (2, 'Bob', 'Sales', 9000), (3, 'Carol', 'Eng', 15000);"
真实回显:
Query: INSERT INTO default.emp VALUES (1, "Alice", "Eng", 12000), (2, "Bob", "Sales", 9000), (3, "Carol", "Eng", 15000)
Query submitted at: 2026-10-07 09:08:30 (Coordinator: http://impala-ubuntu2204:25000)
Query state can be monitored at: http://impala-ubuntu2204:25000/query_plan?query_id=fa41d19b7fbe919a:95a8498b00000000
Modified 3 row(s) in 5.78s
4.9.4 查询
/opt/impala/shell/impala-shell -i impala-ubuntu2204:21000 --protocol=beeswax \
-q "SELECT id, name, dept, salary FROM default.emp ORDER BY salary DESC;"
真实回显:
Query: SELECT id, name, dept, salary FROM default.emp ORDER BY salary DESC
Query submitted at: 2026-10-07 09:08:41 (Coordinator: http://impala-ubuntu2204:25000)
Query state can be monitored at: http://impala-ubuntu2204:25000/query_plan?query_id=be4438f518335ebe:5af4087900000000
+----+-------+-------+--------+
| id | name | dept | salary |
+----+-------+-------+--------+
| 3 | Carol | Eng | 15000 |
| 1 | Alice | Eng | 12000 |
| 2 | Bob | Sales | 9000 |
+----+-------+-------+--------+
Fetched 3 row(s) in 0.64s
4.9.5 LOAD DATA(从 HDFS 装载外部文本)
先准备 HDFS 数据文件并放权(Impala 以 impala 用户运行,LOAD DATA 需要源文件父目录写权限):
export HADOOP_HOME=/opt/hadoop
printf '4,Dave,Eng,18000\n5,Eve,Sales,11000\n6,Frank,Ops,8500\n' > /tmp/emp_text.txt
/opt/hadoop/bin/hdfs dfs -mkdir -p /tmp/emp_data
/opt/hadoop/bin/hdfs dfs -put -f /tmp/emp_text.txt /tmp/emp_data/
/opt/hadoop/bin/hdfs dfs -chmod -R 777 /tmp/emp_data
建文本表 → LOAD → 查询:
/opt/impala/shell/impala-shell -i impala-ubuntu2204:21000 --protocol=beeswax \
-q "CREATE TABLE default.emp_text (id INT, name STRING, dept STRING, salary INT) ROW FORMAT DELIMITED FIELDS TERMINATED BY ',' STORED AS TEXTFILE;"
真实回显:
Query: CREATE TABLE default.emp_text (id INT, name STRING, dept STRING, salary INT) ROW FORMAT DELIMITED FIELDS TERMINATED BY "," STORED AS TEXTFILE
+-------------------------+
| summary |
+-------------------------+
| Table has been created. |
+-------------------------+
Fetched 1 row(s) in 0.23s
/opt/impala/shell/impala-shell -i impala-ubuntu2204:21000 --protocol=beeswax \
-q "LOAD DATA INPATH '/tmp/emp_data/emp_text.txt' INTO TABLE default.emp_text;"
真实回显:
Query: LOAD DATA INPATH "/tmp/emp_data/emp_text.txt" INTO TABLE default.emp_text
+----------------------------------------------------------+
| summary |
+----------------------------------------------------------+
| Loaded 1 file(s). Total files in destination location: 1 |
+----------------------------------------------------------+
Fetched 1 row(s) in 0.35s
/opt/impala/shell/impala-shell -i impala-ubuntu2204:21000 --protocol=beeswax \
-q "SELECT * FROM default.emp_text;"
真实回显:
+----+-------+-------+--------+
| id | name | dept | salary |
+----+-------+-------+--------+
| 4 | Dave | Eng | 18000 |
| 5 | Eve | Sales | 11000 |
| 6 | Frank | Ops | 8500 |
+----+-------+-------+--------+
Fetched 3 row(s) in 0.13s
4.9.6 EXPLAIN 执行计划
/opt/impala/shell/impala-shell -i impala-ubuntu2204:21000 --protocol=beeswax \
-q "EXPLAIN SELECT dept, COUNT(*), AVG(salary) FROM default.emp GROUP BY dept;"
真实回显(节选):
| PLAN-ROOT SINK |
| | |
| 04:EXCHANGE [UNPARTITIONED] |
| | |
| 03:AGGREGATE [FINALIZE] |
| | output: count:merge(*), avg:merge(salary) |
| | group by: dept |
| | row-size=28B cardinality=176 |
| | |
| 02:EXCHANGE [HASH(dept)] |
| | |
| 01:AGGREGATE [STREAMING] |
| | output: count(*), avg(salary) |
| | group by: dept |
| | row-size=28B cardinality=176 |
| | |
| 00:SCAN HDFS [default.emp] |
| HDFS partitions=1/1 files=1 size=1.11KB |
| row-size=16B cardinality=176 |
+----------------------------------------------------------------------------+
Fetched 24 row(s) in 0.05s
4.9.7 SHOW TABLES / SHOW CREATE TABLE
/opt/impala/shell/impala-shell -i impala-ubuntu2204:21000 --protocol=beeswax -q "SHOW TABLES;"
真实回显:
Query: SHOW TABLES
+----------+
| name |
+----------+
| emp |
| emp_text |
+----------+
Fetched 2 row(s) in 0.00s
/opt/impala/shell/impala-shell -i impala-ubuntu2204:21000 --protocol=beeswax -q "SHOW CREATE TABLE default.emp;"
真实回显:
Query: SHOW CREATE TABLE default.emp
+------------------------------------------------------------------------+
| result |
+------------------------------------------------------------------------+
| CREATE TABLE default.emp ( |
| id INT, |
| name STRING, |
| dept STRING, |
| salary INT |
| ) |
| STORED AS PARQUET |
| LOCATION 'hdfs://impala-ubuntu2204:9000/user/hive/warehouse/emp' |
| TBLPROPERTIES ('OBJCAPABILITIES'='EXTREAD,EXTWRITE', 'accessType'='8') |
+------------------------------------------------------------------------+
Fetched 1 row(s) in 0.04s
注意:建表时未显式指定 LOCATION,Impala 按默认仓库路径 hdfs://impala-ubuntu2204:9000/user/hive/warehouse/<库名>/<表名> 落盘。
4.9.8 SET 会话参数
/opt/impala/shell/impala-shell -i impala-ubuntu2204:21000 --protocol=beeswax -q "SET mem_limit=2g;"
真实回显:
MEM_LIMIT set to 2g
4.10 JVM 与常用配置修改说明
Impala 由 C++ 主进程(impalad/catalogd/statestored)与 Java 组件(Frontend、catalogd 的 JNI 部分)组成。常用配置集中在 /opt/impala/conf/:
| 配置文件 | 作用 | 常用修改项 |
|---|---|---|
impala-env.sh | 环境变量 | JAVA_HOME、JAVA_TOOL_OPTIONS、PID 文件路径、out/err 文件路径 |
impalad_flags | impalad 启动参数 | -hostname、-catalog_service_host、-state_store_host、-mem_limit、-use_local_catalog、-log_filename |
catalogd_flags | catalogd 启动参数 | -hostname、-state_store_host、-catalog_topic_mode |
statestored_flags | statestored 启动参数 | -hostname |
core-site.xml / hdfs-site.xml | HDFS 客户端配置 | fs.defaultFS、dfs.replication |
hive-site.xml | HMS 客户端配置 | hive.metastore.uris |
4.10.1 JVM 堆内存限制(256-512MB)
在 /opt/impala/conf/impala-env.sh 中(实测内容):
export JAVA_TOOL_OPTIONS=${JAVA_TOOL_OPTIONS:- -Xms256m -Xmx512m}
-Xms256m:JVM 初始堆 256MB-Xmx512m:JVM 最大堆 512MB- 该变量会被 JVM 自动读取(
Picked up JAVA_TOOL_OPTIONS),作用于 impalad Frontend 与 catalogd 的 JVM 部分
修改后重启对应服务生效:
sudo -u impala -E env JAVA_HOME=/usr/lib/jvm/java-17-openjdk-amd64 IMPALA_HOME=/opt/impala /opt/impala/bin/impala.sh restart catalogd
sudo -u impala -E env JAVA_HOME=/usr/lib/jvm/java-17-openjdk-amd64 IMPALA_HOME=/opt/impala /opt/impala/bin/impala.sh restart impalad
验证生效(日志中出现 JVM 启动参数):
grep -E "JAVA_TOOL_OPTIONS|Xmx|Xms" /tmp/catalogd.impala-ubuntu2204.impala.log.INFO.* | tail -2
4.10.2 修改端口
- Beeswax 端口:impalad_flags 增加
-beeswax_port=21000 - HS2 端口:impalad_flags 增加
-hs2_port=21050 - statestored 端口:statestored_flags 增加
-statestore_port=24000(同时 catalogd/impalad 需-state_store_port=24000)
修改端口后所有指向它的组件都要同步修改并重启。
4.10.3 修改日志
impalad_flags/catalogd_flags/statestored_flags 中:
-log_dir=/var/log/impala
-log_filename=impalad
-max_log_files=10
-max_log_size=200
-log_dir 指定日志目录(默认写到进程 out/err 重定向文件,即 /tmp 下带时间戳的 .INFO/.WARNING/.ERROR 文件);-max_log_files 与 -max_log_size 控制轮转。
4.10.4 内存限制 mem_limit
-mem_limit=3072m 限制 impalad 进程总内存(含 JVM 与查询缓冲区)。小规格机器建议 1-2g:
-mem_limit=1536m
4.11 服务管理
# 查看状态
/opt/impala/bin/impala.sh status statestored|catalogd|impalad
# 停止(默认等 20 次 x 2s = 40s)
/opt/impala/bin/impala.sh stop impalad
# 强制停止
/opt/impala/bin/impala.sh stop -f impalad
# 重启
/opt/impala/bin/impala.sh restart impalad
真实回显(status):
statestored is running with PID 16753.
catalogd is running with PID 16823.
impalad is running with PID 20113.
注意:实测 restart impalad 在停止阶段偶发超时(40 秒内未完全退出,输出 Timed out waiting impalad to stop),并遗留僵尸进程([impalad] <defunct>)。此时删除 PID 文件后重新 start 即可恢复,见 4.12 常见问题。
4.12 已知限制与排查思路
4.12.1 impalad 等待本地 catalog 初始化(catalog topic Size=0 竞态)
现象:impalad 进程变僵尸(Z 状态),端口 21000/21050 未监听;日志中反复出现:
I1007 08:26:36.640971 15584 Frontend.java:1904] Waiting for local catalog to be initialized, attempt: 0
I1007 08:26:36.729974 15584 Frontend.java:1904] Waiting for local catalog to be initialized, attempt: 1
...(实测某实例连续出现 479 次 attempt 后仍不退出)
根因:impalad 以 -use_local_catalog=false 启动时,Frontend 需从 statestore 的 catalog-update topic 获取 catalog 数据。若 statestored 刚启动、catalogd 尚未把首个 topic 条目(CATALOG_SERVICE_ID)发布出去,新订阅的 impalad 拿到的初始 topic Size=0(statestored 日志 Preparing initial catalog-update topic update for catalog-server@... Size = 0),此后 topic 更新无法推送(统计发现旧条目不触发重新发布),impalad 便永久等待。
排查步骤:
- 看 statestore 页面:浏览器打开
http://impala-ubuntu2204:25010/topics,检查catalog-updatetopic 的 Size 是否大于 0。 - 看 impalad 日志关键字:
grep "Waiting for local catalog" /tmp/impalad.impala-ubuntu2204.impala.log.INFO.*。 - 尝试
-catalog_topic_mode=full(catalogd_flags,本文已启用):让 catalogd 以全量模式发布,可在 impalad 订阅后补发全量数据。 - 调整重启顺序:statestored → 等待就绪 → catalogd → 等待 catalogd 日志出现
Connected to metastore且 statestore topic Size > 0 → impalad。 - 或临时使用
-use_local_catalog=true(impalad_flags):impalad 直接从 HMS 构建本地 catalog,不依赖 topic 时序;但此模式需 impalad 直连 HMS(hive-site.xml 已配好)。
本文成功经验:statestored 与 catalogd 已运行约 20 分钟(topic Size=269B)后再启动 impalad,日志仅出现 1 次 attempt(0)即 Local catalog initialized after: 102 ms,随后 Impala has started。即:只要保证 catalogd 先完成初始化并发布 topic,impalad 即可稳定启动。
4.12.2 僵尸进程处理
impala.sh 通过 PID 文件判断状态;若进程被 SIGTERM 后未能及时退出或被信号中断,会留下 <defunct> 僵尸条目,PID 文件仍存在,导致 status 误报 is running 且 start 拒绝再启。
处理办法:
# 1) 确认僵尸(Z 状态)
ps -o pid,ppid,state,comm -p <pid>
# 2) 删除 PID 文件,解除 start 阻塞
rm -f /tmp/impalad.pid
# 3) 重新启动(此时遗留的僵尸条目不占资源,重启服务器后即清空)
sudo -u impala -E env JAVA_HOME=/usr/lib/jvm/java-17-openjdk-amd64 IMPALA_HOME=/opt/impala bin/impala.sh start impalad
实测回显(重启后):
(1/20) impalad on port 25000 is not ready.
(2/20) impalad on port 25000 is not ready.
(3/20) impalad is ready.
impalad is running with PID 20113.
4.12.3 HDFS 地址切换告警
日志常见 WARN ipc.Client: Address change detected. Old: impala-ubuntu2204/192.168.112.2:9000 New: impala-ubuntu2204/172.17.0.54:9000。这是 NameNode 实际绑定地址与 fs.defaultFS 不一致导致的自动重连,查询不受影响。若需消除,统一 hosts 解析顺序并重启 HDFS。
4.12.4 LOAD DATA 权限错误
AnalysisException: Unable to LOAD DATA from hdfs://.../tmp/emp_data/emp_text.txt because Impala does not have WRITE permissions on its parent directory
LOAD DATA 是「移动文件」语义,Impala 需要源文件父目录的写权限。解法:hdfs dfs -chmod -R 777 /tmp/emp_data(本文 4.9.5 已演示)。
4.12.5 beeswax 协议连接报错
连接 21000 而不带 --protocol=beeswax 时报 Invalid method name: 'OpenSession'。因 4.x 的 21000 是 beeswax(Thrift 旧协议)端口,impala-shell 默认按 HS2 协议连接。两种解法:加 --protocol=beeswax,或直接连 -i host:21050(HS2)。
4.12.6 安全说明
Impala 4.5.3 默认无内置认证(no-authentication),本文未启用 Kerberos/LDAP,任何能到达 21000/21050 的客户端均可执行 SQL。生产环境请配置 -server_credentials 与 LDAP/Kerberos 认证。系统管理凭据:root / q1w2e3r4(SSH 或控制台登录)。
4.13 安装完成后的目录总览
/opt/hadoop # Hadoop 3.3.6(HDFS 伪分布式)
/opt/hive # Hive 3.1.3(standalone Metastore,Derby 元数据库在 /opt/hive/metastore_db)
/opt/impala # Impala 4.5.3(bin/impala.sh 管理脚本、conf/ 配置、sbin/ 守护进程、shell/impala-shell)
/tmp/impala.deb
至此,Apache Impala 4.5.3 在 Ubuntu 22.04 上安装完成:三个守护进程全部运行,impala-shell 可完成建表、插入、查询、LOAD DATA、EXPLAIN 全流程验证。
五、配置说明与 JVM 内存
5.1 配置文件总览
Impala 配置目录(/opt/impala/conf/)与结构:
| 文件 | 作用 |
|---|---|
impala-env.sh | 环境变量(JAVA_HOME、JVM 参数、PID/OUTFILE/ERRFILE 路径、IMPALA_HOME) |
impalad_flags | impalad 启动参数(--flagfile 指定) |
statestored_flags | statestored 启动参数 |
catalogd_flags | catalogd 启动参数(含 -hive_metastore_uris) |
core-site.xml/hdfs-site.xml | HDFS 客户端配置 |
hive-site.xml | Hive Metastore 连接配置 |
5.2 默认端口汇总
| 服务 | RPC/协议 | Web UI |
|---|---|---|
| impalad | 21000(beeswax,弃用)、21050(HS2) | 25000 |
| statestored | 24000 | 25010 |
| catalogd | 26000 | 25020 |
| Hive Metastore | 9083 | - |
| HDFS NameNode | 9000 | 9870 |
日志:守护进程 stdout/stderr 重定向到 /tmp/<service>.out、/tmp/<service>.err,PID 存 /tmp/<service>.pid;glog 运行日志为 /tmp/<service>.INFO.*、/tmp/<service>.ERROR.*。
5.3 JVM 与内存说明
Impala 的 catalogd 与 impalad 为"Native(C++) + JVM(Java 前端)"复合进程,含 JVM;statestored 为纯 C++ 进程,不含 JVM(无须调整堆)。
堆内存限制(256–512MB)在 /opt/impala/conf/impala-env.sh 中通过 JAVA_TOOL_OPTIONS 统一注入(配置模板见 3.9.2 与 4.7.2):
export JAVA_TOOL_OPTIONS="${JAVA_TOOL_OPTIONS:- -Xms256m -Xmx512m}"
修改后重启 impalad/catalogd 生效(重启命令见 4.10.1),用 jps -v 验证实际生效堆:
jps -v
实测回显(catalogd 与 impalad 均生效为 -Xms256m -Xmx512m):
35 impalad -Xms256m -Xmx512m -javaagent:/opt/impala/lib/jars/jamm-0.4.0.jar --add-opens=java.base/java.lang=ALL-UNNAMED --add-opens=java.base/java.nio=ALL-UNNAMED --add-opens=java.base/java.util.regex=ALL-UNNAMED --add-opens=java.base/sun.nio.ch=ALL-UNNAMED -Djava.library.path=/opt/hadoop/lib/native
32 catalogd -Xms256m -Xmx512m -javaagent:/opt/impala/lib/jars/jamm-0.4.0.jar ……
六、卸载与清理
停止全部 Impala 守护进程与 HDFS/Metastore:
cd /opt/impala && bin/impala.sh stop impalad
cd /opt/impala && bin/impala.sh stop catalogd
cd /opt/impala && bin/impala.sh stop statestored
/opt/hadoop/bin/hdfs --daemon stop datanode
/opt/hadoop/bin/hdfs --daemon stop namenode
清理软件与数据(演示环境):
rm -rf /opt/impala /opt/hadoop /opt/hive
rm -rf /tmp/impalad.* /tmp/catalogd.* /tmp/statestored.* /tmp/admissiond.*
如需多版本管理,保留多个版本目录(如 /opt/impala-4.5.3、/opt/impala-4.5.2)并用软链 /opt/impala -> /opt/impala-4.5.3 切换即可。
七、常见问题(FAQ)
除下述通用问题外,CentOS 8 侧的 glibc 版本限制与依赖库问题见 3.12,Ubuntu 22.04 侧的 catalog 竞态、僵尸进程、协议端口等问题见 4.12。
Q1:impalad --version 报 libjvm.so: cannot open shared object file?
未设置 JAVA_HOME/LD_LIBRARY_PATH 指向 JDK 的 lib/server。在 /opt/impala/conf/impala-env.sh 设置正确的 JAVA_HOME 后 bin/impala.sh start impalad 会自动拼装 LD_LIBRARY_PATH。
Q2:bin/impala.sh start catalogd 一直在 not ready?
首先确认 statestored 已就绪(24000 可达),以及 -hive_metastore_uris=thrift://<host>:9083 的 metastore 已启动(9083 监听)。
Q3:impala-shell 报连不上 21050?
确认 bin/impala.sh health impalad 返回 ready;检查本机防火墙未阻断 21050/21000/25000。
Q4:SHOW DATABASES 里面是空的/没有 default?
需要 Hive Metastore 正常(hive.metastore.uris 可连),并已在 _impala_builtins 正常注册;若 metastore 未起,impalad 无法加载元数据。
Q5:INSERT 速度慢?
单节点伪集群写入涉及 HDFS DataNode 写入与 catalog 同步,首次写入含建目录/副本等开销属正常;mem_limit 是 C++ 内存池上限,非 JVM 堆。
八、参考链接
- Apache Impala 官网:https://impala.apache.org/
- Apache Impala 官方文档:https://impala.apache.org/impala-docs.html