CDH 6.3.2 集群外挂 Spark 3.5.7 (Paimon) 集成 Hue 实战指南
由于 CDH 默认环境未变更,原有的hive命令依然指向旧版本。针对 .sql 脚本的调度,需采用以下替代方案。
目录
3.4 关闭服务(Spark3的Spark Thrift Server)
4.1 为什么 [spark] 和 [notebook] 配置无效?
4.2 最终解决方案:使用 [beeswax] 覆写 (推荐)
适用环境:CDH 6.3.2 / Spark 3.5.7 / Paimon 1.1.1 核心目标:在不破坏 CDH 原有 Hive/Spark 稳定性的前提下,通过旁路服务(Sidecar)模式部署 Spark 3.5,并对接 Hue 和 Beeline,实现对 Paimon 数据湖的读写支持。
1. 基础环境准备(权限与目录)
在启动服务前,必须先创建日志目录并配置正确的权限,否则会导致服务因无法写入日志而秒退。
执行节点:部署 Spark Thrift Server 的节点(通常是 HiveServer2 所在节点,这里为 nd2)。 执行用户:拥有 sudo 权限的用户(如 bigdata)。
# 1. 创建 Spark Thrift Server 专用日志目录
sudo mkdir -p /var/log/spark3-thrift
# 2. 创建 Hive 操作日志目录 (修复 Beeline 无进度条警告)
sudo mkdir -p /var/log/hive/operation_logs
# 3. 将目录所有权移交给 hive 用户 (服务将以 hive 身份启动)
sudo chown -R hive:hive /var/log/spark3-thrift
sudo chown -R hive:hive /var/log/hive/operation_logs
# 4. 赋予读写权限
sudo chmod -R 755 /var/log/spark3-thrift
sudo chmod -R 755 /var/log/hive/operation_logs
2. 封装启动脚本
我们需要创建一个封装好的脚本,解决环境变量隔离、日志路径重定向以及 YARN 资源限制问题。
创建脚本:
sudo vi /opt/cloudera/parcels/CDH/bin/start-spark3-thrift.sh
脚本内容(已包含内存优化与日志修正):
#!/bin/bash
# ==================== 环境变量配置 ====================
# 指向外挂的 Spark 3.5.7 路径
export SPARK_HOME=/opt/cloudera/parcels/CDH-6.3.2-1.cdh6.3.2.p0.1605554/lib/spark3
export SPARK_CONF_DIR=$SPARK_HOME/conf
# 指向 CDH 的 Hadoop/YARN 配置
export HADOOP_CONF_DIR=/etc/hadoop/conf
export YARN_CONF_DIR=/etc/hadoop/conf
# 【关键修正】强制将 Spark 内部日志和 PID 文件指向我们创建的有权限目录
# 否则会尝试写入 /opt/.../spark3/logs 导致权限不足报错
export SPARK_LOG_DIR=/var/log/spark3-thrift
export SPARK_PID_DIR=/var/log/spark3-thrift
# 脚本自身日志路径
LOG_DIR=/var/log/spark3-thrift
mkdir -p $LOG_DIR
echo "Starting Spark 3.5.7 Thrift Server..."
# ==================== 启动命令 ====================
# 参数说明:
# 1. hive.server2.thrift.port=10001 : 避开 CDH Hive 默认的 10000 端口
# 2. --driver/executor-memory 2g : 【关键修正】避免超过 CDH YARN 单容器最大内存限制 (通常为 4G 左右)
# 3. spark.sql.extensions... : 加载 Paimon 插件
exec $SPARK_HOME/sbin/start-thriftserver.sh \
--master yarn \
--deploy-mode client \
--hiveconf hive.server2.thrift.port=10001 \
--hiveconf hive.server2.thrift.bind.host=0.0.0.0 \
--driver-memory 2g \
--executor-memory 2g \
--executor-cores 2 \
--conf spark.sql.extensions=org.apache.paimon.spark.extensions.PaimonSparkSessionExtensions \
--conf spark.sql.catalog.paimon=org.apache.paimon.spark.SparkCatalog \
--conf spark.sql.catalog.paimon.metastore=hive \
--conf spark.sql.catalog.paimon.hadoop.conf.dir=/etc/hadoop/conf \
>> $LOG_DIR/start.log 2>&1
赋权:
sudo chmod +x /opt/cloudera/parcels/CDH/bin/start-spark3-thrift.sh
3. 服务启动与验证
3.1 启动服务
必须使用 hive 用户启动,以确保有权限访问 HDFS 上的 Hive Warehouse 和本地日志目录。
sudo -u hive /opt/cloudera/parcels/CDH/bin/start-spark3-thrift.sh
![]()
3.2 状态验证
启动通常需要 15-30 秒。
方式一:检查端口
# 确认 10001 端口处于监听状态
sudo netstat -tulpn | grep 10001
![]()
方式二:查看日志 如果端口未启动,查看日志排查:
tail -f /var/log/spark3-thrift/spark-hive-org.apache.spark.sql.hive.thriftserver.HiveThriftServer2*.out
成功标志:看到日志输出 Starting ThriftBinaryCLIService on port 10001。

方式三:YARN 界面
访问 http://<ResourceManager_IP>:8088,应看到名为 Thrift JDBC/ODBC Server 的任务状态为 RUNNING。

3.3 终端验证
执行命令如下:
/opt/cloudera/parcels/CDH-6.3.2-1.cdh6.3.2.p0.1605554/lib/spark3/bin/beeline -u "jdbc:hive2://nd2:10001/default" -n hive
SHOW DATABASES;
use paimon;
# 默认表
show tables;
use ods;
show tables;
select * from t_admin_division_code limit 5;


3.4 关闭服务(Spark3的Spark Thrift Server)
因为我这里是第一次关闭服务,出现了如下报错:

这是因为 CDH 的 parcels 目录默认属于 root,而 Spark 脚本试图在那里面写日志。
下次启动或停止前,请务必确保日志目录存在且权限正确(这只需要执行一次):
# 1. 创建日志目录 (如果不存在)
sudo mkdir -p /opt/cloudera/parcels/CDH/lib/spark3/logs
# 2. 修改目录权限为服务启动用户 (这里的场景是 hive)
sudo chown -R hive:hive /opt/cloudera/parcels/CDH/lib/spark3/logs
-
停止服务的两种方案
方案 A:优雅停止(推荐 - 使用官方脚本)
这是最规范的方式,它会清理本地 PID 文件并优雅关闭服务。
-
执行停止脚本: 你需要以启动该服务的用户身份(
hive)运行脚本。sudo -u hive /opt/cloudera/parcels/CDH/lib/spark3/sbin/stop-thriftserver.sh注:如果报
no org.apache.spark... to stop,说明服务已经不在运行了(可能已经被 YARN kill 掉了)。
方案 B:强制停止(暴力 - 直接杀死 YARN 任务)
如果脚本卡住、PID文件丢失,或者你无法解决本地权限问题,可以直接在 YARN 层面杀死任务
-
查找任务 ID:
yarn application -list | grep Thrift找到类似
application_1764292133441_0219的 ID。 -
杀死任务:
yarn application -kill application_1764292133441_0219
-
验证服务是否已停止
执行完上述任一方案后,通过以下命令确认:
-
检查 YARN 任务列表(应无 Thrift 任务):
yarn application -list | grep Thrift -
检查端口占用(应无输出):
netstat -tnlp | grep 10001
3.5 关闭服务(CDH集群默认的Spark服务)
针对 CDH 6.3.2 自带的 Spark 2.4.0,操作逻辑与 Spark 3 非常相似,核心区别在于脚本的路径。
CDH 自带的 Spark 组件安装路径通常在 /opt/cloudera/parcels/CDH/lib/spark(注意这里没有 "3")。默认情况下,CDH 集群自带的 Spark(通常是 2.4.x)是不启动 Spark Thrift Server 的。
Cloudera 在 CDH 架构设计上有明确的产品定位区分:
-
Impala:被设计为 CDH 平台上的高性能交互式 SQL 引擎。Cloudera 官方强烈推荐使用 Impala 来替代 Spark Thrift Server 进行 BI 报表查询和即席查询(Ad-hoc),因为 Impala 在 CDH 上的响应速度通常比 Spark 2.x 的 Thrift Server 更快。
-
Hive (HiveServer2):被设计为批处理 SQL 引擎(虽然 CDH 6 引入了 Hive on Spark,但入口依然是 HiveServer2)。
-
Spark:主要被定位为通用的批量计算引擎(编写 Scala/Python 代码)或复杂的 ETL 工具,而不是通过 JDBC 对外提供高并发查询服务。
因此,为了避免组件功能重叠和维护成本,CDH 默认不配置也不启动 Spark Thrift Server。
虽然 CM 不管理它,但 CDH 的 Parcel 包里包含了完整的 Apache Spark 发行版,所以启动脚本和 Jar 包都在。
如果你登录到安装了 Spark Gateway 的 CDH 节点,通常可以在以下路径找到启动脚本:
/opt/cloudera/parcels/CDH/lib/spark/sbin/start-thriftserver.sh
你可以通过以下两种方式确认它没有运行:
方式一:查看 Cloudera Manager
-
进入 CM 界面。
-
点击 Spark 服务。
-
点击 实例 (Instances)。
-
你会发现列表里只有 History Server 和 Gateway,没有 Thrift Server。
方式二:查看端口
Spark Thrift Server 默认使用与 HiveServer2 相同的端口 10000。
在 CDH 集群中,端口 10000 通常已经被 HiveServer2 占用了。
netstat -tulpn | grep 10000
你会看到进程名通常是 java,属于用户 hive,这是 HiveServer2,而不是 Spark Thrift Server。
如果你启动过Spark Thrift Server,以下是具体停止步骤:
1.确认路径与启动用户
首先你需要知道这个服务是谁启动的。
-
如果是 Cloudera Manager (CM) 界面上自动管理的 Spark Thrift Server,默认用户通常是
spark。 -
如果是你手动在命令行启动的,请使用当时启动该服务的用户(比如
hive或bigdata)。
2.停止方法(三种方案)
方案 A:使用官方脚本停止(推荐)
假设启动用户是 hive(请根据实际情况替换用户),执行以下命令:
# 进入 CDH 自带 Spark 的 sbin 目录执行停止脚本
sudo -u hive /opt/cloudera/parcels/CDH/lib/spark/sbin/stop-thriftserver.sh
注意路径区别:
-
Spark 3 (你之前的):
/opt/cloudera/parcels/CDH/lib/spark3/sbin/... -
Spark 2 (自带的):
/opt/cloudera/parcels/CDH/lib/spark/sbin/...
方案 B:通过 Cloudera Manager 界面停止(如果是系统级服务)
如果这个 Spark Thrift Server 是你在 Cloudera Manager 网页界面上配置并启动的角色:
-
登录 Cloudera Manager Web UI。
-
进入 Spark 服务。
-
点击 Instances (实例)。
-
找到 Spark Thrift Server 角色。
-
选中它,点击 Stop (停止)。
方案 C:直接 Kill YARN 任务(万能方案)
如果脚本报错或者找不到 PID 文件,直接杀 YARN 任务最快:
-
查找任务 ID:
yarn application -list | grep Thrift注意观察
Application-Type列,Spark 2 的类型通常也是SPARK,名字也是Thrift JDBC/ODBC Server。 -
杀死任务:
yarn application -kill <Application-Id>
7.3.6 Spark Thrift Server服务中断
由于Spark Thrift Server是提交至yarn上执行,会出现服务中断问题,以下是解决步骤: 第一步:查看端口是否存在
sudo netstat -tulpn | grep 10001
若有输出,则直接执行下述命令kill掉进程
kill -9 891202
![]()
若无输出,则继续下述步骤 第二步:修改hue配置,将之前配置好的连接spark配置给删除,修改成hue默认的配置,然后重启hue。
第三步:在搭载spark客户端的节点先启动Spark Thrift Server,然后修改hue上连接spark的配置,重启hue就可以了。
4. Hue 集成配置
为了让用户在 Hue 界面上无感使用 Spark 3.5,我们需要让 Hue 通过 JDBC 连接到我们启动的 10001 端口。
在尝试了多种配置方案(包括 [spark] 和 [notebook])后,我们发现 CDH 6.3.2 环境下存在特定的限制。本节将首先分析为什么常规方案行不通,然后给出经过验证的“偷梁换柱”解决方案。
4.1 为什么 [spark] 和 [notebook] 配置无效?
在配置 Hue 连接 Spark SQL 时,通常网络上流传着两种配置方式,但在 CDH 6.3.2 默认环境中均存在严重问题。
1. [notebook] 配置方式(配置复杂且易报错)
这种方式试图通过 [[interpreters]] 动态添加解释器:
[notebook]
[[interpreters]]
[[[spark3sql]]]
name=Spark 3.5 SQL
interface=hiveserver2
options='{"url": "jdbc:hive2://10.x.xx.202:10001/default", "driver": "org.apache.hive.jdbc.HiveDriver"}'
失败原因:
-
CM 安全阀转义灾难:Cloudera Manager (CM) 会将网页输入的配置注入到
hue_safety_valve.ini。CM 对双引号"和单引号'处理敏感,极易导致 JSON 字符串在生成时被错误转义,从而破坏配置文件语法,导致 Hue 重启失败。 -
驱动加载机制:Hue 4.3.0 的动态解释器对 JDBC 驱动加载路径有严格要求,经常无法正确加载 Hive 驱动。
2. [spark] 配置方式(被系统黑名单屏蔽)
这是另一种常见的配置方式:
[spark]
display_name=Spark 3.5 SQL
server_host=10.8.16.202
server_port=10001
interface=hiveserver2
失败原因: 即使配置正确,Hue 界面上也往往不会出现 Spark SQL 的菜单。通过在服务器后台检查 Hue 实际生成的运行配置文件,我们发现了根本原因:CDH 默认将 spark 模块列入了黑名单。
终端验证排查: 我们登录到部署 Hue 的节点(如 nd1),进入 Hue 进程的运行目录查看生成的配置:
[bigdata@nd1 ~]$ sudo -i
[root@nd1 ~]# cd /var/run/cloudera-scm-agent/process/
# 找到最新的 HUE_SERVER 进程目录
[root@nd1 process]# cd `ls -lrt | grep HUE_SERVER | tail -n 1 | awk '{print $9}'`
# 检查黑名单配置
[root@nd1 2464-hue-HUE_SERVER]# grep "blacklist" hue.ini
app_blacklist=spark,zookeeper,hbase,impala,search,oozie,jobsub,pig,sqoop,security
blacklist=none
# 检查我们注入的 spark 配置(确实存在,但被上面的 blacklist 屏蔽了)
[root@nd1 2464-hue-HUE_SERVER]# grep -A 5 "\[spark\]" hue.ini
[spark]
display_name=Spark 3.5 SQL
server_host=10.8.16.202
server_port=10001
interface=hiveserver2

从上述日志可以看到 app_blacklist=spark...。这意味着 Hue 启动时明确禁用了 Spark 模块,因此无论 [spark] 段落如何配置,UI 均不会加载该功能。
4.2 最终解决方案:使用 [beeswax] 覆写 (推荐)
既然无法新增 Spark 菜单,且默认的 Hive (Port 10000) 无法运行 Paimon,最稳妥的方案是“偷梁换柱”:直接修改 Hue 默认 Hive 编辑器 ([beeswax]) 的连接地址,将其指向我们的 Spark 3.5 Thrift Server (Port 10001)。
此方案利用了 Hue 最成熟稳定的 Hive UI 模块,兼容性最好。
操作步骤
-
登录 Cloudera Manager。
-
进入 Hue 服务 -> 配置 (Configuration)。
-
搜索
safety valve(安全阀)。 -
找到 Hue Service Advanced Configuration Snippet (Safety Valve) for hue_safety_valve.ini。
-
添加以下配置(注意替换 IP 为你的 Spark Thrift Server 节点):
[beeswax]
# 强制指定连接的主机 IP (你的 Spark 3.5 部署节点)
hive_server_host=10.8.16.202
# 强制指定连接的端口 (你的 Spark 3.5 启动端口)
hive_server_port=10001
# 增加超时时间,防止 Spark 初始化慢导致连接断开(建议120秒以上),也可不设置
# server_conn_timeout=120
-
点击 保存更改。
-
回到 CM 主页,重启 Hue 服务 (Restart Stale Services)。
4.3 界面验证
-
登录 Hue 网页。
-
点击左侧菜单原本的 “Hive” 图标(我们替换的是后端,入口UI不变)。
-
在编辑器中输入以下 SQL 进行验证:
-- 查看版本,验证是否为 Spark 3.5.7
SELECT version();
-- 验证 Paimon 表读取
USE paimon;
USE ods;
SELECT * FROM t_admin_division_code LIMIT 5;



预期结果:
-
SELECT version()应返回 3.5.7 (而非 CDH 自带的 1.1.0 或 2.1.1)。 -
Paimon 表数据能正常查询。
通过这种方式,我们成功在不破坏 CDH 原有架构稳定性的前提下,让 Hue 具备了查询 Paimon 数据湖的能力。
5. 脚本迁移与使用总结
由于 CDH 默认环境未变更,原有的 hive 命令依然指向旧版本。针对 .sql 脚本的调度,需采用以下替代方案。
场景 A:定时调度 / 生产脚本 (替代 hive -f)
强烈推荐使用 Spark 3 自带的 Beeline 连接 10001 端口,这比每次启动一个新的 Spark App 更快且资源利用率更高。下面是示例代码
# 定义变量
SPARK3_BIN=/opt/cloudera/parcels/CDH-6.3.2-1.cdh6.3.2.p0.1605554/lib/spark3/bin
STS_HOST=10.8.16.202
STS_PORT=10001
# 执行命令
$SPARK3_BIN/beeline \
-u "jdbc:hive2://${STS_HOST}:${STS_PORT}/default" \
-n hive \
-f /path/to/your_script.sql
场景 B:Hue 交互式查询
直接在 Hue 界面选择 "Spark 3.5 SQL" 编辑器进行查询。
6. 故障排查汇总 (FAQ)
在部署过程中可能遇到的核心问题及解决方案:
| 现象 | 原因 | 解决方案 |
|---|---|---|
| 日志报错:mkdir: 无法创建目录 .../lib/spark3/logs | 权限不足 | 在启动脚本中添加 export SPARK_LOG_DIR=/var/log/spark3-thrift 强制重定向日志路径。 |
| 日志报错:Required executor memory ... above max threshold | YARN 资源超限 | 将启动脚本中的 --driver-memory 和 --executor-memory 从 4g 降为 2g 或 3g。 |
| Hue 编辑器不显示 Spark 3.5 | 配置格式错误 | 确保 hue_safety_valve.ini 使用 [notebook] -> [[interpreters]] 层级,而非 [spark]。 |
| Beeline 无执行进度条 | 缺少操作日志目录 | 确保已创建 /var/log/hive/operation_logs 并将所有权赋予 hive 用户。 |
更多推荐




所有评论(0)