PySpark的print在Spyder无输出但Anaconda Prompt正常的原因及解决方法
警告信息翻译
正在使用Spark默认log4j配置:org/apache/spark/log4j-defaults.properties
默认日志等级设置为"WARN"
调整日志等级可使用sc.setLogLevel(newLevel),SparkR环境使用setLogLevel(newLevel)
21/11/30 16:18:53 WARN NativeCodeLoader:无法为当前平台加载native-hadoop库,将在兼容场景使用内置Java类
D:\spark-3.2.0-bin-hadoop3.2\python\lib\pyspark.zip\pyspark\shuffle.py:60: 用户警告:请安装psutil以获得更好的内存溢出处理支持
21/11/30 16:19:08 WARN ProcfsMetricsGetter:计算页大小异常,进程树指标上报功能已停止
问题原因
1. Spyder中分两行打印无输出
- Spyder 5.1.5版本的IPython内核存在多线程输出缓冲适配bug,PySpark运行时会产生大量子进程日志输出到标准流,分两行执行
results=mod_rdd.collect()和print(results)时,Spark日志的输出会抢占缓冲区,print内容被缓冲截断,无法正常显示。 - 直接打印
print(mod_rdd.collect())时,返回值直接传入print函数,输出优先级更高,会被优先冲刷到控制台,因此可以正常显示。 - Anaconda Prompt是纯终端环境,输出缓冲逻辑简单,不会出现这类抢占截断问题。
2. 安装psutil后警告仍存在
- Spyder默认可能使用独立内置环境,和Anaconda Prompt激活的环境不是同一个,导致psutil没有安装到PySpark实际调用的环境中。
- Windows版本的PySpark的shuffle模块存在psutil检测逻辑bug,部分场景下即使正确安装psutil也会误报警告,该警告仅为性能提示,不影响代码功能正常运行。
- 上述警告中
NativeCodeLoader和ProcfsMetricsGetter的提示均为Windows平台运行Spark的常见问题,不影响基础功能使用,可直接忽略。
3. PySpark是否必须在Anaconda Prompt运行
不需要。只要Python环境配置正确、Spark环境变量配置无误,PySpark可以在任意IDE/编辑器中运行,仅不同工具的输出缓冲、环境变量加载逻辑有差异,会出现适配问题。
修复方案
- 解决Spyder打印无输出问题:
- 方案1:在print语句前加强制冲刷缓冲区代码,修改原代码最后几行为:
results=mod_rdd.collect() import sys sys.stdout.flush() print(results) - 方案2:初始化SparkSession时设置日志等级,减少无用日志输出抢占缓冲区:
spark = SparkSession.builder.appName("test").master("local[*]").getOrCreate() spark.sparkContext.setLogLevel("ERROR") - 方案3:将Spyder升级到5.3及以上版本,该版本已修复多线程输出缓冲的适配bug。
- 方案1:在print语句前加强制冲刷缓冲区代码,修改原代码最后几行为:
- 解决psutil警告问题:
- 核对Spyder使用的Python解释器路径:打开
工具 -> 偏好设置 -> Python解释器,确认路径和Anaconda Prompt激活的环境路径一致,在对应环境下用conda install psutil重新安装,避免pip和conda安装路径不匹配。 - 若安装后仍有警告,可直接忽略,不影响功能。
- 核对Spyder使用的Python解释器路径:打开
内容的提问来源于stack exchange,提问作者kuedsah
相关产品推荐
相关产品推荐

