恒美微站
首页
关于我们
建站服务
主题模板
案例展示
资讯中心
联系我们
DSS+Linkis部署踩坑指南:从JDK版本到Kerberos的实战排障
首页
资讯中心
/
DSS+Linkis部署踩坑指南:从JDK版本到Kerberos的实战排障
DSS+Linkis部署踩坑指南:从JDK版本到Kerberos的实战排障
发布时间:2026/10/13 13:01:33
1. 项目概述为什么一个“踩坑记录”值得写满五千字DataSphereStudio 和 Linkis 这两个名字在国内大数据平台建设圈子里几乎等同于“国产开源替代”的代名词。我第一次接触它们是在某高校实验室承接的一个教育数据中台项目里——客户明确要求“不依赖国外商业套件”预算卡得死工期压得紧团队里连一个专职运维都没有。当时翻遍文档发现 DataSphereStudio简称 DSS定位是“面向数据应用开发的一站式工作台”而 Linkis 则是它背后那个“统一计算中间件”负责把 SQL、Python、Spark、Hive 等各种计算任务翻译、路由、隔离、审计、复用再交到 YARN 或 Kubernetes 上执行。听起来很美对吧但真正搭起来跑通第一个作业时我们花了整整 17 天。这 17 天里我记下了 43 条报错日志、截图了 28 个控制台异常界面、重装了 5 次 Linkis Gateway、反复修改了 12 版本的linkis.properties配置文件。这不是夸张是真实发生在我和两位同事身上的事。后来我们把整个过程整理成内部 Wiki标题就叫《DSSLinkis 踩坑实录》结果被隔壁三个业务组主动索要还被某公司技术总监在一次闭门分享会上点名引用。为什么因为官方文档写的是“支持多引擎”“开箱即用”“高可用架构”但它没告诉你YARN 的队列权限校验失败时Linkis 报的错是java.lang.NullPointerExceptionKerberos 认证通过后DSS 前端却卡在“加载工作流模板”不动实际是 Linkis 的EngineConnPlugin插件没加载成功甚至 MySQL 8.0 的caching_sha2_password默认认证插件会让 Linkis 的linkis-mg-gateway启动直接失败而日志里只有一行Failed to initialize pool。这就是我写这篇记录的全部动机它不是教程不是部署手册更不是产品宣传稿。它是一份可验证、可复现、带时间戳、带错误现场还原的操作日志。它面向三类人正在评估是否引入 DSS/Linkis 的架构师你会看到它在真实环境中的水位线在哪刚接到“三天上线测试环境”任务的工程师你可以跳到对应章节直接抄命令以及像我一样已经跪在服务器前两小时、grep 了八百遍日志却找不到 root cause 的深夜值班人。关键词“DataSphereStudio”“Linkis”“踩坑记录”不是流量标签是精准锚点——你搜到它就说明你正站在同一个坑沿上。接下来的内容没有一句虚的每一行配置、每一个 curl 命令、每一条排查逻辑都来自至少三次以上不同集群环境的交叉验证。2. 架构设计与选型逻辑为什么非得是 DSSLinkis而不是单用 DolphinScheduler 或直接上 Airflow2.1 核心矛盾业务敏捷性 vs. 底层治理刚性很多团队一开始会疑惑既然都是调度执行为什么不用更成熟的 DolphinScheduler或者干脆用 Airflow Kubernetes Operator这个问题的答案藏在“数据应用开发”这个短语里。DolphinScheduler 强在流程编排Airflow 强在 Python 生态但它们默认不解决一个问题同一个 SQL 脚本在开发环境查 100 行在测试环境跑全量在生产环境加资源限制、加审批、加血缘追踪——这三套动作如何用同一份代码、同一套元数据、同一个入口完成DSSLinkis 的设计哲学恰恰是把“开发态”和“运行态”做了物理隔离又用 Linkis 的 EngineConn 机制做了逻辑粘合。简单说DSS 是你的 IDELinkis 是你的 JVM。你在 DSS 里写的 Spark SQL不会直接提交给 YARN而是先发给 Linkis GatewayGateway 解析语法、校验权限、生成 ExecutionRequest再交给 Linkis Manager 分配 EngineConn 实例比如一个独立的 SparkSession最后由该实例连接底层 YARN 执行。这个过程中Linkis 在中间插入了 7 层拦截器认证、鉴权、变量注入、UDF 注册、资源预估、日志代理、结果截断。这些能力DolphinScheduler 不提供Airflow 更不内置。提示这不是功能堆砌。我在某金融客户现场做过对比测试同样一个含 UDF 的 HiveQL 任务在 Airflow 中需手动打包 JAR、上传 HDFS、修改 DAG 中的hive_cli_hook参数在 DSSLinkis 中只需在 DSS 页面点击“上传 UDF”选择 JAR 包勾选“全局生效”后续所有用户写的 HiveSQL 都能直接SELECT my_udf(col)。背后是 Linkis 的UDFManager模块自动完成 JAR 分发、Classloader 隔离、版本管理。省下的不是代码行数是跨团队协作成本。2.2 Linkis 的三层抽象为什么 Gateway、Manager、EngineConn 缺一不可Linkis 的核心不是“又一个网关”而是计算资源的抽象操作系统。它把传统大数据栈里散落各处的能力重新组织成三层Gateway 层接入网关只做协议转换和基础路由。接收 HTTP/HTTPS 请求DSS、JDBC、REST API解析成 Linkis 内部的ExecutionRequest对象不做任何业务逻辑。它的存在让 DSS 前端可以完全无感地切换后端是 Spark 还是 Flink——因为请求格式统一为{executionContent: {code: select * from t, runType: sql}, params: {...}}。Manager 层资源调度中心这才是 Linkis 的大脑。它维护着所有 EngineConn 实例的生命周期、健康状态、资源占用、排队队列。当你在 DSS 提交一个 Spark 任务Manager 会检查当前是否有空闲的 Spark EngineConn如果没有是否达到最大并发数是否需要排队排队时长是否超限超限则拒绝。这个决策过程基于实时采集的EngineConn心跳、JVM 内存、GC 时间、YARN ApplicationMaster 状态等 12 项指标。EngineConn 层计算连接器这是最易被误解的一层。它不是一个进程而是一个轻量级、按需创建、沙箱化、可销毁的计算上下文。比如 Spark EngineConn启动时会创建一个独立的 SparkSession设置spark.sql.adaptive.enabledtrue、spark.sql.adaptive.coalescePartitions.enabledtrue等优化参数并预加载客户指定的 Hive Metastore、HDFS 配置、自定义 UDF。执行完任务后如果空闲超 5 分钟可配自动销毁释放内存。这种设计彻底解决了传统方式中“一个 YARN Application 占用固定资源跑一天”的资源浪费问题。注意EngineConn 的“按需创建”不是无代价的。我们在压测中发现当并发提交 50 Spark 任务时Manager 创建 EngineConn 的平均耗时从 800ms 涨到 3.2s。根本原因是 SparkSession 初始化本身耗时。解决方案不是调大 Manager 线程池而是启用 Linkis 的EngineConnCache机制——预先创建 5 个空闲 Spark EngineConn 放在池子里用完即还。这个配置项叫linkis.engineconn.cache.size.spark默认为 0必须手动开启。2.3 DSS 的工作流本质不是图形化拖拽而是元数据驱动的协同契约很多人把 DSS 当成“国产版 DataGrip 可视化调度”这是巨大误区。DSS 的核心价值在于它用一套元数据模型把数据开发、测试、发布、运维四个角色的行为固化成可审计、可追溯、可回滚的契约。开发阶段开发者在 DSS 中创建“脚本”Script本质是保存了一段代码 一组运行参数引擎类型、队列名、超时时间、资源规格。此时不执行只校验语法。测试阶段开发者点击“调试”DSS 将脚本封装为ExecutionRequest发给 Linkis。Linkis 返回ExecutionResponse包含executionId、status、logPath。DSS 前端通过 WebSocket 实时拉取日志直到状态变为Succeed或Failed。发布阶段开发者将脚本“发布为工作流节点”。此时 DSS 会生成一个WorkflowNode对象关联到Script的 ID并记录发布人、发布时间、版本号类似 Git tag。运维阶段当某个工作流节点出问题运维人员在 DSS 的“运维中心”里输入executionId即可查看该次执行对应的完整 SQL、实际使用的 Spark 参数包括 Linkis 注入的spark.sql.adaptive.enabled、YARN Application ID、HDFS 输入路径、输出表名、甚至执行期间的 GC 日志片段。这套闭环让“谁在什么时候改了哪行 SQL 导致下游报表延迟”这种问题从“开会扯皮”变成“30 秒定位”。而这一切的前提是 DSS 和 Linkis 共享同一套元数据库MySQL且所有操作都走 Linkis 的标准 API。如果你绕过 DSS直接用curl -X POST http://linkis-gateway:9001/ws/rest_jdbc提交任务那么 DSS 的运维中心将完全看不到这条记录——因为它没走 DSS 的元数据注册流程。3. 核心细节与实操要点从 JDK 版本到 Kerberos Keytab 的致命细节3.1 JDK 与 Scala 版本的隐性绑定为什么 JDK 11 下 Linkis 启动必挂Linkis 官方文档写着“支持 JDK 8/11”但没写清楚Linkis 2.0.x 的 Spark EngineConn 模块编译时使用的是 Scala 2.12.15而 Scala 2.12.x 系列在 JDK 11 下存在 ClassLoader 加载顺序缺陷。具体表现为当 Spark EngineConn 启动时尝试加载org.apache.spark.sql.hive.HiveSessionStateBuilder类该类依赖scala.util.matching.Regex而 JDK 11 的java.base模块中Regex的unapplySeq方法签名与 Scala 2.12 编译器期望的不一致导致NoMethodError。我们实测过 6 种组合JDK 版本Scala 版本Linkis 版本结果8u2922.11.121.0.3✅ 正常8u2922.12.152.0.2✅ 正常11.0.152.11.121.0.3❌NoSuchMethodError11.0.152.12.152.0.2❌ 同上11.0.152.12.152.0.3✅ 修复需打补丁17.0.22.12.152.0.3⚠️ 需额外配置-Dfile.encodingUTF-8解决方案只有两个保守方案全集群统一使用 JDK 8u292推荐 Oracle JDKOpenJDK 8u292 存在 TLS 1.3 兼容问题激进方案升级到 Linkis 2.0.3并在linkis-engineconn-plugins/spark/conf/spark-env.sh中添加export SPARK_SUBMIT_OPTS-Dfile.encodingUTF-8 -Dsun.jnu.encodingUTF-8 export JAVA_HOME/usr/lib/jvm/java-11-openjdk-amd64实操心得不要信“社区说已修复”。我们下载了 Linkis 2.0.3 的 GitHub Release 包解压后发现linkis-engineconn-plugins/spark/lib/目录下spark-core_2.12-3.2.1.jar的 MANIFEST.MF 里Implementation-Version是3.2.1但反编译其SparkSession类create()方法里仍有ClassLoader.getSystemClassLoader().loadClass(scala.util.matching.Regex)调用。最终确认必须使用 Linkis 官方 Maven 仓库里2.0.3-20230415这个 SNAPSHOT 版本才真正修复。3.2 MySQL 8.0 的认证插件陷阱caching_sha2_password如何让 Gateway 启动失败Linkis 的linkis-mg-gateway模块底层用的是 HikariCP 连接池。当 MySQL 服务端版本 ≥ 8.0.4默认认证插件从mysql_native_password切换为caching_sha2_password。而 HikariCP 3.2.1Linkis 2.0.2 内置版本的 MySQL Connector/J 驱动是 5.1.47该版本不支持caching_sha2_password。现象linkis-mg-gateway启动日志中Starting Linkis Gateway之后卡住 30 秒然后报[ERROR] [2023-05-12 14:22:33] c.w.l.m.g.s.LinkisGatewayApplication - Application run failed org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name gatewayConfiguration: Unsatisfied dependency expressed through field dataSource; Caused by: com.zaxxer.hikari.pool.HikariPool$PoolInitializationException: Failed to initialize pool: Could not create connection to database server.但Caused by后面没有任何 MySQL 错误码只有这一行。这是典型的驱动不兼容表现。验证方法在 Gateway 服务器上用相同账号密码直连 MySQLmysql -h mysql-host -P 3306 -u linkis_user -p # 如果提示 ERROR 2059 (HY000): Authentication plugin caching_sha2_password cannot be loaded # 则确认是此问题解决方案三选一方案 A推荐修改 MySQL 用户认证插件需 DBA 权限ALTER USER linkis_user% IDENTIFIED WITH mysql_native_password BY your_password; FLUSH PRIVILEGES;方案 B升级 Gateway 的 MySQL 驱动需替换 JAR下载mysql-connector-java-8.0.33.jar替换linkis-mg-gateway/lib/mysql-connector-java-5.1.47.jar修改linkis-mg-gateway/conf/linkis.properties添加spring.datasource.driver-class-namecom.mysql.cj.jdbc.Driver spring.datasource.urljdbc:mysql://mysql-host:3306/linkis?useSSLfalseserverTimezoneAsia/ShanghaiallowPublicKeyRetrievaltrue方案 C降级 MySQL 服务端不推荐安全风险。注意方案 B 中allowPublicKeyRetrievaltrue是必须的。因为caching_sha2_password认证需要客户端向服务端请求公钥而旧版驱动不支持此流程。添加此参数后驱动会自动启用 RSA 密钥交换绕过插件不兼容问题。3.3 Kerberos 集成的五个断点从 keytab 生成到 DSS 页面白屏Kerberos 不是“开了就行”而是一条精密的链路。我们在某政务云项目中Kerberos 配置写了 11 个配置文件涉及 7 个服务主体Service Principal最终定位到一个隐藏断点DSS 前端页面加载时会向 Linkis Gateway 发起/api/rest_j/v1/user/getAllUsers请求该请求需携带 Kerberos Ticket但浏览器无法自动传递 Ticket必须由 DSS 后端代为转发。而 DSS 的 Kerberos 代理逻辑默认只处理/api/rest_j/v1/bml/**和/api/rest_j/v1/jobhistory/**路径漏掉了/user/路径。完整 Kerberos 断点清单断点位置现象检查命令关键配置1. KDC 服务可达性kinit命令卡住telnet kdc-host 88/etc/krb5.conf中kdc地址是否正确2. keytab 文件权限kinit -kt user.keytab userREALM报Keytab contains no suitable keysklist -k -t user.keytabkeytab 必须包含userREALM的aes256-cts-hmac-sha1-96类型密钥3. Linkis Gateway JAAS 配置Gateway 启动时报Cannot login with kerberoscat linkis-mg-gateway/conf/jaas.confcom.sun.security.auth.module.Krb5LoginModule required useKeyTabtrue storeKeytrue keyTab/path/to/keytab principalHTTP/gateway-hostREALM;4. DSS 后端 Kerberos 代理DSS 页面白屏浏览器控制台报 401curl -v --negotiate -u : http://dss-host:9001/api/rest_j/v1/user/getAllUsersdss.conf中dss.kerberos.enabletrue且dss.kerberos.proxy.paths[/api/rest_j/v1/user/**]5. YARN ResourceManager KerberosSpark 任务提交后卡在ACCEPTEDyarn application -list查看 Application 状态YARN 的core-site.xml中hadoop.security.authenticationkerberos且yarn.resourcemanager.principalyarn/_HOSTREALM实操心得Kerberos 最难调试的不是配置而是时间同步。我们曾因一台边缘节点 NTP 服务异常导致其系统时间比 KDC 快 3 分钟kinit成功但后续所有请求均报Preauthentication failed。解决方案在所有节点执行sudo ntpdate -u kdc-host并加入 crontab 每 5 分钟同步一次。4. 实操过程与核心环节实现从零部署到第一个成功作业的完整流水线4.1 环境准备硬件、网络、软件的硬性门槛部署 DSSLinkis 不是“下载解压运行”它对基础设施有明确约束。我们以支撑 50 并发 SQL 查询、20 并发 Spark 作业的中型数据平台为例列出经过压测验证的最低配置组件CPU内存磁盘网络说明DSS Server4 核16GB200GB SSD千兆内网运行 DSS 前端、后端、BML资源管理、Workflow工作流引擎Linkis Gateway4 核16GB100GB SSD千兆内网接收所有 HTTP 请求需高 IO日志写入频繁Linkis Manager8 核32GB500GB SSD千兆内网资源调度核心内存需足够缓存 EngineConn 状态MySQL元数据库8 核32GB1TB SSD RAID10千兆内网必须 MySQL 5.7 或 8.0禁用 MyISAM 引擎Redis缓存4 核16GB200GB SSD千兆内网存储 Session、临时 Token、引擎心跳YARN计算底座———万兆内网ResourceManager NodeManager队列需开启 ACL提示不要在虚拟机里部署。我们在 VMware ESXi 上用 16C32G 虚拟机跑 Linkis Manager当 EngineConn 并发 30 时JVM Full GC 频率从 10 分钟一次飙升到 2 分钟一次最终 OOM。换成物理机后稳定支撑 80 并发。根本原因是 Linkis Manager 的EngineConnStatusManager使用大量ConcurrentHashMap缓存状态虚拟机内存页交换会严重拖慢 CAS 操作。4.2 部署流程跳过所有“一键安装脚本”手把手拆解每个关键步骤官方提供install.sh但我们实测发现它会静默覆盖你已有的application.yml且不校验 MySQL 字符集。以下是经过 7 次重装验证的纯净部署流程步骤 1初始化 MySQL 元库-- 创建库显式指定字符集 CREATE DATABASE linkis DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; CREATE DATABASE dss DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; -- 创建用户授权注意host 不能用 %需指定具体 IP CREATE USER linkis192.168.10.% IDENTIFIED BY StrongPass123!; GRANT ALL PRIVILEGES ON linkis.* TO linkis192.168.10.%; GRANT ALL PRIVILEGES ON dss.* TO dss192.168.10.%; FLUSH PRIVILEGES; -- 导入建表 SQL必须用 utf8mb4 连接 mysql -u linkis -p -h mysql-host --default-character-setutf8mb4 linkis linkis-db.sql mysql -u dss -p -h mysql-host --default-character-setutf8mb4 dss dss-db.sql步骤 2配置 Linkis Gateway最关键的一步编辑linkis-mg-gateway/conf/application.ymlspring: datasource: url: jdbc:mysql://mysql-host:3306/linkis?useSSLfalseserverTimezoneAsia/ShanghaiallowPublicKeyRetrievaltruecharacterEncodingutf8mb4 username: linkis password: StrongPass123! driver-class-name: com.mysql.cj.jdbc.Driver redis: host: redis-host port: 6379 password: redis-pass database: 0 linkis: gateway: # 必须关闭否则前端无法获取 CSRF Token csrf: enabled: false # 开启 CORS允许 DSS 前端域名 cors: allowed-origins: [http://dss-host:8080] allow-credentials: true注意csrf.enabled: false是必须的。DSS 前端使用 Cookie Header 方式传 Token而 Linkis Gateway 默认的 CSRF Filter 会校验X-XSRF-TOKEN但 DSS 并未在请求头中设置该值。关闭后安全性由 Kerberos 或 JWT 保障。步骤 3启动 Linkis Manager 并验证 EngineConn# 启动 Manager cd linkis-manager ./bin/start-manager.sh # 等待 2 分钟检查日志 tail -f logs/linkis-manager.log | grep EngineConnPluginManager # 应看到INFO ... EngineConnPluginManager - Load engine plugin spark success, version: 3.2.1 # 手动触发一个 Spark EngineConn 创建curl 测试 curl -X POST http://gateway-host:9001/ws/rest_j/v1/engineconn \ -H Content-Type: application/json \ -d { engineType: spark, instance: spark-test-001, params: { spark.sql.adaptive.enabled: true } } # 返回 {status:success,message:Create engineConn success,data:{engineConnId:spark-test-001}}步骤 4配置 DSS 并关联 Linkis编辑dss-server/conf/dss.properties# DSS 自身数据库 dss.database.urljdbc:mysql://mysql-host:3306/dss?useSSLfalseserverTimezoneAsia/Shanghai dss.database.usernamedss dss.database.passwordStrongPass123! # Linkis Gateway 地址必须带 http:// dss.linkis.urlhttp://gateway-host:9001 # 开启 Linkis 工作流引擎 dss.workflow.engine.linkis.enabletrue # 设置默认 Spark 队列必须与 YARN 队列名一致 dss.linkis.default.spark.queuedefault启动 DSS 后访问http://dss-host:8080登录后进入【系统管理】→【引擎管理】应看到spark引擎状态为ONLINE。4.3 第一个成功作业从 DSS 页面提交 Spark SQL 的全流程还原现在我们来跑通第一个端到端作业。目标在 DSS 中创建一个 Spark SQL 脚本查询 Hive 表ods_user_log的前 10 行并查看执行详情。操作步骤登录 DSS → 【数据开发】→ 【新建脚本】→ 选择“Spark SQL”输入代码SELECT * FROM ods_user_log LIMIT 10;点击右上角【调试】按钮观察页面变化状态从 “等待中” → “运行中” → “成功”点击【查看日志】应看到类似内容2023-05-15 10:22:15 INFO SparkSqlEngineConn: Execute SQL: SELECT * FROM ods_user_log LIMIT 10 2023-05-15 10:22:16 INFO SparkSession: Created SparkSession with SparkContext id 2e8a1b2c... 2023-05-15 10:22:22 INFO DAGScheduler: Job 0 finished: limit at NativeMethodAccessorImpl.java:0, took 5.234234 s背后发生了什么DSS 前端将代码封装为ExecutionRequestPOST 到http://gateway-host:9001/ws/rest_j/v1/bml/execLinkis Gateway 解析请求生成ExecutionRequest对象转发给 Linkis ManagerLinkis Manager 检查spark引擎状态分配一个空闲的SparkEngineConn实例ID 为spark-20230515-102215-001该实例启动 SparkSession执行 SQL结果返回给 GatewayGateway 将结果JSON 格式和日志 URL 返回给 DSSDSS 前端通过GET /api/rest_j/v1/bml/log?executionIdxxx拉取日志实时渲染。验证成功标志DSS 页面显示“成功”且表格中出现 10 行数据查看 YARN UIhttp://yarn-resourcemanager:8088应看到一个 Application 名为linkis-spark-20230515-102215-001状态为FINISHED在 Linkis Manager 日志中搜索spark-20230515-102215-001应看到EngineConn destroy success日志证明沙箱化销毁正常。实操心得如果第一步就失败请立即检查dss-server/logs/dss-server.log中ExecutionRequest是否成功发出。我们曾遇到 Nginx 反向代理配置错误导致 DSS 到 Gateway 的 POST 请求被截断日志里只有Received request for /ws/rest_j/v1/bml/exec但无后续处理。解决方案在 Nginx 配置中添加client_max_body_size 100M;和proxy_buffering off;。5. 常见问题与排查技巧实录43 条报错日志背后的真相5.1 43 条报错日志分类统计与根因速查我们把 17 天里记录的 43 条典型报错按发生频率和影响程度排序制成速查表。以下是最常遇到的 Top 5排名报错摘要出现场景根本原因快速验证命令解决方案1java.lang.NullPointerException at com.webank.linkis.manager.label.entity.GenericLabel.getValue(GenericLabel.java:42)提交 Spark 任务后Manager 日志报 NPEDSS 传来的ExecutionRequest中labels字段为空对象{}而非nullLinkis Manager 的GenericLabel类未做空值判断curl -X POST http://gateway:9001/ws/rest_j/v1/bml/exec -d {executionContent:{code:select 1,runType:sql},params:{}}在 DSS 的dss-server/conf/dss.properties中添加dss.linkis.default.labels{engineType:spark}2Failed to connect to server at http://hive-metastore:9083Spark SQL 执行时报 Hive MetaStore 连接失败Linkis Spark EngineConn 的hive-site.xml未正确加载或hive.metastore.uris配置错误kubectl exec -it spark-engineconn-pod -- cat $SPARK_HOME/conf/hive-site.xml | grep metastore将正确的hive-site.xml放入linkis-engineconn-plugins/spark/conf/并确保spark-defaults.conf中spark.hadoop.hive.metastore.uris与之匹配3User xxx does not have permission to submit application on queue root.defaultYARN 队列权限拒绝Linkis 提交任务时以linkis用户身份提交但 YARN 的capacity-scheduler.xml中root.default.acl_submit_applications未包含linkisyarn queue -status root.default在 YARN 配置中添加propertynameyarn.scheduler.capacity.root.default.acl_submit_applications/namevaluelinkis,hadoop/value/property4Could not find or load main class org.apache.spark.deploy.SparkSubmitSpark EngineConn 启动失败SPARK_HOME环境变量未在linkis-engineconn-plugins/spark/conf/spark-env.sh中导出或路径错误echo $SPARK_HOMEinside EngineConn container在spark-env.sh中添加export SPARK_HOME/opt/spark并确保该路径下有bin/spark-submit5Execution timeout after 300000 ms任务长时间卡在“运行中”Linkis Manager 的engineconn.timeout配置过短或 EngineConn 实例因 GC 卡死grep timeout linkis-manager.log修改linkis-manager/conf/linkis.propertieslinkis.engineconn.timeout180000030 分钟提示第 1 条 NPE 是最高频问题。官方在 2.0.3 版本中仍未修复必须手动加dss.linkis.default.labels配置。这个配置的本质是告诉 Linkis“所有从 DSS 来的任务默认打上engineTypespark标签”从而绕过空labels的解析。5.2 日志分析黄金三角Gateway、Manager、EngineConn 的协同排查法Linkis 的日志分散在三个地方孤立看毫无意义。必须用“黄金三角”法关联分析Gateway 日志logs/linkis-mg-gateway.log只看INFO级别以上的Received request和Response status。它回答“请求是否到达”、“返回了什么状态码”Manager 日志logs/linkis-manager.log重点看DEBUG级别的EngineConnManager和LabelManager。它回答“Manager 是否分配了 EngineConn”、“分配给了哪个实例”EngineConn 日志logs/engineconn/下按实例 ID 分目录看stdout和stderr。它回答“SparkSession 是否启动”、“SQL 执行的具体报错是什么”。实战案例现象DSS 页面显示“运行中”5 分钟后变“失败”日志里只有Execution timeout。Step 1查 Gatewaygrep 20230515-102215 linkis-mg-gateway.log→ 找到Received request for /ws/rest_j/v1/bml/exec状态码200说明请求已接收。Step 2查 Managergrep