Dataproc Zeppelin运行Spark作业时单元格输出提前隐藏问题咨询
问题共性说明
该问题是GCP Dataproc托管Zeppelin组件的高频已知问题,大量运行长耗时PySpark作业的开发者都反馈过完全一致的现象:作业启动后前几分钟日志正常展示,随后输出突然消失并标记为outdated,无法手动展开,等作业最终执行完成后输出才会恢复,整个过程Spark作业本身运行无异常,不存在实际的输出过期情况。
触发根因
问题本质是Zeppelin前端与后端解释器的WebSocket通信、输出存活校验的默认配置阈值不适配长耗时Spark作业:
- Dataproc预置的Zeppelin默认配置中,WebSocket空闲超时、输出过期判定的阈值设置过短,当PySpark作业进入宽依赖shuffle、大表全量计算等不会持续打印日志的阶段时,前端长时间收不到新的输出内容,就会误判定当前输出已过期,直接隐藏现有内容
- 默认配置下Spark解释器的进度上报间隔偏长,无法在作业静默计算阶段给前端传递有效心跳,进一步提高了误判概率
修复方案
通过调整以下Zeppelin配置参数即可彻底解决该问题,调整后重启Zeppelin服务生效:
现有集群临时修复
SSH登录Dataproc集群主节点,编辑Zeppelin配置文件 /etc/zeppelin/conf/zeppelin-site.xml,新增或修改如下配置项:
<!-- WebSocket连接空闲超时,单位毫秒,可根据作业最长静默时长调整,示例设为1小时 --> <property> <name>zeppelin.websocket.idle.timeout</name> <value>3600000</value> </property> <!-- 前端输出存活校验间隔,单位毫秒 --> <property> <name>zeppelin.interpreter.output.check_interval</name> <value>60000</value> </property> <!-- Spark解释器运行进度上报间隔,单位毫秒,保证计算阶段有持续心跳 --> <property> <name>zeppelin.spark.progressCheckInterval</name> <value>10000</value> </property>
配置修改完成后执行命令 sudo systemctl restart zeppelin 重启Zeppelin服务即可。
新集群创建时永久生效
创建Dataproc集群时直接通过元数据参数注入配置,无需创建后手动修改:
gcloud dataproc clusters create <替换为实际集群名> \ --optional-components=ZEPPELIN \ --metadata 'zeppelin:zeppelin.websocket.idle.timeout=3600000,zeppelin:zeppelin.interpreter.output.check_interval=60000,zeppelin:zeppelin.spark.progressCheckInterval=10000' \ # 其余自定义集群参数按需补充
注意事项
- 如果作业存在超过1小时无日志输出的计算阶段,可按实际需求调大
zeppelin.websocket.idle.timeout的取值,单位为毫秒 - 不建议将Spark进度上报间隔设置为小于5000毫秒,否则会增加驱动节点不必要的通信开销
- 若使用Dataproc 2.0以下的老版本镜像,需要额外在配置中增加
zeppelin.server.same.timeout参数,取值与zeppelin.websocket.idle.timeout保持一致,避免服务端侧额外触发超时断开
内容的提问来源于stack exchange,提问作者Surender Khairwa
相关产品推荐
相关产品推荐

