PySpark在AWS SageMaker中执行filter后show报400错误求助
问题背景
环境信息
- Python版本:3.7.6
- PySpark版本:
'2.4.5-amzn-0' - SageMaker Notebook实例:
ml.t2.2xlarge
EMR集群配置
{"classification":"livy-conf","properties":{"livy.server.session.timeout":"5h"}}, {"classification":"spark-defaults","properties":{"spark.driver.memory":"20G"}}
操作与错误现象
数据清理缩减后,执行以下代码可正常返回结果:
print(df.count(), len(df.columns)) print(df.show())
返回结果:
(1642, 9) stock date time spread time_diff ... VOD 01-01 9:05 0.01 1132 ... VOD 01-01 9:12 0.03 465 ... VOD 01-02 10:04 0.02 245 VOD 01-02 10:15 0.01 364 VOD 01-02 10:04 0.02 12
但执行过滤操作后调用show()时报错:
new_df= df.filter(f.col('time_diff')<= 1800) new_df.show()
错误信息:
An error was encountered: Invalid status code '400' from http://11.146.133.8:8990/sessions/34/statements/8 with error payload: {"msg":"requirement failed: Session isn't active."}
解决建议
调整Livy会话相关配置
已设置livy.server.session.timeout=5h,可补充配置livy.server.session.timeout-check-interval(例如设为10m),确保会话超时检查机制正常运作。同时检查livy.server.max-sessions参数,避免因会话数上限导致现有会话被强制回收。优化Spark资源配置
增加spark.driver.cores配置(对应ml.t2.2xlarge实例可设为4),提升驱动节点的处理能力;同时设置spark.driver.maxResultSize(例如设为10G),避免结果集过大导致驱动内存溢出进而断开会话。验证网络连通性
确认SageMaker Notebook实例的安全组允许访问EMR集群的8990端口(Livy服务端口),EMR集群的安全组也需开放来自Notebook实例的入站流量。重启Livy会话
在SageMaker Notebook中关闭当前Spark会话,重新连接EMR集群,清除会话可能存在的异常状态。优化DataFrame操作方式
尝试用new_df.take(10)或new_df.show(10, truncate=False)替代直接调用show(),减少单次返回的数据量,降低会话传输压力。检查EMR集群资源状态
登录EMR集群控制台,查看驱动节点的CPU、内存使用率,确认是否因资源耗尽导致会话终止。若存在资源瓶颈,可升级驱动节点实例类型或增加执行器数量。
内容的提问来源于stack exchange,提问作者FlyUFalcon

