跳到主要内容

Spark SQL

当需要混合多个存储库或扫描数亿行数据时使用。可以用一条 SQL 连接 Aster TSDB、PostgreSQL 和 Iceberg(RustFS)。

项值
SQL 网关Kyuubi — 10000 (thrift) · 10099 (Web UI)
Spark Master7077, Master UI 4440
MetastoreHive Metastore 9083
Iceberg 目录Gravitino REST 19001
账号PP_SPARK_USER / PP_SPARK_PASSWORD
有启动成本

打开一个会话需要数秒。不要将短查询发送到这里 —— 这类查询使用 CQL 或 PostgreSQL 要快得多。

连接​

beeline (通过 Kyuubi — 推荐)​

docker exec -it plantpulse-datalake bash -c \
'/opt/kopens/plantpulse-platform/plantpulse-analytics/spark/bin/beeline \
-u "jdbc:hive2://127.0.0.1:10000/default" \
-n "$PP_SPARK_USER" -p "$PP_SPARK_PASSWORD"'

具备会话隔离和队列功能。DBeaver、Tableau 等外部 SQL 客户端也可使用相同的 JDBC URL 连接。

spark-sql (直接 — 用于调试)​

docker exec -it plantpulse-datalake \
/opt/kopens/plantpulse-platform/plantpulse-analytics/spark/bin/spark-sql \
--master spark://127.0.0.1:7077

示例​

查看目录与表​

SHOW CATALOGS;
SHOW DATABASES;
SHOW TABLES IN default;
DESCRIBE TABLE default.tm_tag_point;

大规模聚合 — CQL 无法实现的操作​

无分区键的全表扫描聚合在此进行。

SELECT tag_id, count(*) AS points, avg(value) AS avg_value
FROM tm_tag_point
WHERE timestamp >= '2026-07-01' AND timestamp < '2026-08-01'
GROUP BY tag_id
ORDER BY points DESC
LIMIT 50;

混合存储库进行连接​

同时查看时序(Aster TSDB)和设备元数据(PostgreSQL)。

SELECT e.equipment_name,
count(*) AS points,
avg(p.value) AS avg_value
FROM tm_tag_point p
JOIN tm_equipment e ON e.equipment_id = p.equipment_id
WHERE p.timestamp >= '2026-07-01' AND p.timestamp < '2026-08-01'
GROUP BY e.equipment_name
ORDER BY points DESC;

归档(Iceberg)查询​

已下沉到冷层的历史数据会保留为 Iceberg 表。

-- 스냅샷 이력
SELECT * FROM iceberg.pp.tm_tag_point.snapshots ORDER BY committed_at DESC LIMIT 10;

-- 특정 시점의 모습 (타임 트래블)
SELECT count(*) FROM iceberg.pp.tm_tag_point
TIMESTAMP AS OF '2026-07-01 00:00:00';

归档任务的状态可通过 pd retention 的 cold_tier · archive_job 行查看。

注意事项​

  • 🔴 对分层 Aster TSDB 表进行无分区键聚合时,请使用 Spark。 CQL 的全表扫描聚合不会合并块,会返回错误的值 (分层存储)。
  • Master UI 端口为 4440 (不是 8080)。
  • PP_SPARK_PASSWORD 用于 Kyuubi 连接认证,由 hive-auth.properties 生成。
  • 归档器(plantpulse-warehouse-web)运行在数据湖之外,位于平台镜像中 → warehouse 模块。

相关文档​