目录

1. 基础环境准备(权限与目录)

2. 封装启动脚本

3. 服务启动与验证

3.1 启动服务

3.2 状态验证

3.3 终端验证

3.4 关闭服务(Spark3的Spark Thrift Server)

3.5 关闭服务(CDH集群默认的Spark服务)

4. Hue 集成配置

4.1 为什么 [spark] 和 [notebook] 配置无效?

1. [notebook] 配置方式(配置复杂且易报错)

2. [spark] 配置方式(被系统黑名单屏蔽)

4.2 最终解决方案:使用 [beeswax] 覆写 (推荐)

操作步骤

4.3 界面验证

5. 脚本迁移与使用总结

场景 A:定时调度 / 生产脚本 (替代 hive -f)

场景 B:Hue 交互式查询

6. 故障排查汇总 (FAQ)


适用环境: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 文件并优雅关闭服务。

  1. 执行停止脚本: 你需要以启动该服务的用户身份(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 层面杀死任务

  1. 查找任务 ID

    yarn application -list | grep Thrift

    找到类似 application_1764292133441_0219 的 ID。

  2. 杀死任务

    yarn application -kill application_1764292133441_0219
  • 验证服务是否已停止

执行完上述任一方案后,通过以下命令确认:

  1. 检查 YARN 任务列表(应无 Thrift 任务):

    yarn application -list | grep Thrift
  2. 检查端口占用(应无输出):

    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

  1. 进入 CM 界面。

  2. 点击 Spark 服务。

  3. 点击 实例 (Instances)

  4. 你会发现列表里只有 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

  • 如果是你手动在命令行启动的,请使用当时启动该服务的用户(比如 hivebigdata)。

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 网页界面上配置并启动的角色:

  1. 登录 Cloudera Manager Web UI。

  2. 进入 Spark 服务。

  3. 点击 Instances (实例)

  4. 找到 Spark Thrift Server 角色。

  5. 选中它,点击 Stop (停止)

方案 C:直接 Kill YARN 任务(万能方案)

如果脚本报错或者找不到 PID 文件,直接杀 YARN 任务最快:

  1. 查找任务 ID

    yarn application -list | grep Thrift

    注意观察 Application-Type 列,Spark 2 的类型通常也是 SPARK,名字也是 Thrift JDBC/ODBC Server

  2. 杀死任务

    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 模块,兼容性最好。

操作步骤

  1. 登录 Cloudera Manager

  2. 进入 Hue 服务 -> 配置 (Configuration)

  3. 搜索 safety valve (安全阀)。

  4. 找到 Hue Service Advanced Configuration Snippet (Safety Valve) for hue_safety_valve.ini

  5. 添加以下配置(注意替换 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
  1. 点击 保存更改

  2. 回到 CM 主页,重启 Hue 服务 (Restart Stale Services)。

4.3 界面验证

  1. 登录 Hue 网页。

  2. 点击左侧菜单原本的 “Hive” 图标(我们替换的是后端,入口UI不变)。

  3. 在编辑器中输入以下 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 用户。
Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐