EMR环境下Jupyter Notebook运行Pyspark时执行过程不实时打印输出问题
解决方案
方案1:提前设置无缓冲环境变量(适配绝大多数版本)
必须在初始化SparkSession/SparkContext之前设置PYTHONUNBUFFERED环境变量,禁用Python进程的标准输出缓冲:
import os import time # 必须放在Spark初始化代码之前执行 os.environ['PYTHONUNBUFFERED'] = '1' # 后续执行业务代码 for i in range(10): print(i, flush=True) time.sleep(1)
方案2:关闭IPython内核的输出捕获缓冲
如果方案1不生效,是IPython内核默认的文件描述符捕获机制导致的输出延迟,运行如下魔法命令后再执行业务代码即可:
%config IPKernelApp.capture_fd_output = False
方案3:配置Spark参数(长期生效)
如果需要全局生效,可在SparkSession构造时添加对应配置:
from pyspark.sql import SparkSession spark = SparkSession.builder \ .config("spark.driver.extraJavaOptions", "-Dpython.buffered.stdout=false") \ .config("spark.executor.extraJavaOptions", "-Dpython.buffered.stdout=false") \ .getOrCreate()
也可以在启动PySpark服务时直接追加启动参数:
pyspark --conf spark.driver.extraJavaOptions="-Dpython.buffered.stdout=false" --conf spark.executor.extraJavaOptions="-Dpython.buffered.stdout=false"
内容的提问来源于stack exchange,提问作者DBA108642
相关产品推荐
相关产品推荐

