Zeppelin上PySpark任务报错,求解析hr标签未闭合异常原因
聊聊你遇到的PySpark任务502异常
嘿,我来帮你拆解这个异常的来龙去脉~首先可以明确:这个错误和你的PySpark代码逻辑(比如filter、reduceByKey的写法)没关系,也不是Ceph宕机导致的,本质是中间网关/代理层的临时通信故障,具体细节如下:
1. 异常的核心原因:AWS SDK解析错误响应失败
报错里的这段信息是关键:
com.amazonaws.AmazonClientException: Unable to unmarshall error response (The element type "hr" must be terminated by the matching end-tag "</hr>"). Response Code: 502, Response Text: Bad Gateway
简单说:
- 你的Spark任务通过AWS兼容的客户端访问Ceph(应该是用了S3协议),请求经过了某个网关(比如反向代理、负载均衡器)
- 网关临时出问题,返回了502 Bad Gateway错误,但它返回的错误页面是HTML格式(里面有个没闭合的
<hr>标签),而AWS SDK只认标准的XML/JSON格式错误响应,所以直接解析失败,抛出了这个异常
2. 即使Ceph没宕机,也会触发的几种场景
- 网关临时过载:比如负责转发请求的网关短时间内扛不住突增的请求量,没法正常把请求转给Ceph,直接返回502
- 网关配置有小问题:网关的错误页面模板本身就有语法错误(比如
<hr>没写闭合标签),刚好在这次故障时暴露出来 - 网络瞬断/抖动:Spark executor和Ceph之间的网络链路出现短暂中断,网关检测到后返回502,但响应格式不符合SDK预期
- Ceph临时卡顿:Ceph整体没宕机,但某个OSD进程临时卡住了,导致网关等太久超时,触发502
3. 为什么之后没再出现?
这类异常大多是临时性的:可能是网关的过载状态恢复了,网络抖动结束了,或者Ceph的卡顿进程自己恢复了,所以后续再跑任务就正常了。
4. 后续可以做的排查/优化
- 去查网关的日志:看看当时有没有502相关的记录,顺便检查下错误页面的配置是不是真的有未闭合的标签
- 调整Spark的任务重试配置:可以把
spark.task.maxFailures的值调大一点(默认是4),让任务遇到临时故障时多重试几次 - 监控Ceph的细节状态:即使没宕机,也可以看看当时OSD、PG的响应延迟有没有异常波动
- 优化客户端超时配置:如果是用S3协议访问Ceph,把客户端的超时时间调得合理些,避免因短暂延迟触发网关超时
内容的提问来源于stack exchange,提问作者OmG
相关产品推荐
相关产品推荐

