You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Spark-Submit集群模式下Print语句无法写入日志求助

解决YARN Cluster模式下PySpark Print语句不写入本地日志的问题

在YARN Cluster部署模式下,Spark Driver进程运行在YARN集群的某个Worker节点上,而非提交任务的本地机器。你执行的> sample.log仅重定向了本地客户端的输出,Driver中的print语句输出会被写入Driver所在YARN容器的日志文件,因此本地sample.log中无法看到这些内容。

以下是几种可行的解决方案:

方案1:使用Spark内置日志API替代print

将代码中的print替换为Spark日志方法,这些日志会被Spark日志系统统一收集,可通过YARN日志获取,也能配置输出到指定位置。

修改后的代码片段:

if __name__ == '__main__':
    spark = SparkSession.builder.appName("Test").enableHiveSupport().getOrCreate()
    # 获取Spark日志记录器
    log4jLogger = spark.sparkContext._jvm.org.apache.log4j
    logger = log4jLogger.LogManager.getLogger(__name__)
    
    logger.info("Print statement-1")  # 替代print
    # ... 其余代码不变
    logger.info(f"Number of records {df.count()}")  # 替代print

方案2:切换为YARN Client模式提交任务

如果业务场景允许,将部署模式改为client,此时Driver运行在提交任务的本地机器上,print语句的输出会直接输出到本地控制台,重定向即可捕获到sample.log中。

修改提交命令:

spark-submit --master yarn --deploy-mode client sample.py > sample.log

注意:Client模式下Driver占用本地资源,适合调试或资源需求较低的任务。

方案3:通过YARN命令拉取集群日志

开启YARN日志聚合(多数集群默认已开启),任务完成后,用以下命令将Driver和Executor的日志拉取到本地:

yarn logs -applicationId <你的应用ID> > sample.log

应用ID可通过yarn application -list命令查看已运行/完成的任务ID。

方案4:写入分布式文件系统(如HDFS)

若需要持久化自定义日志,可直接写入HDFS,之后从HDFS下载到本地:

# 在代码中添加写入HDFS的逻辑
log_content = f"Print statement-1\nNumber of records {df.count()}"
spark.sparkContext.parallelize([log_content]).saveAsTextFile("/user/your_name/spark_logs")

之后通过hdfs dfs -get /user/your_name/spark_logs ./将日志下载到本地。

内容的提问来源于stack exchange,提问作者Surendiran Balasubramanian

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.23 08:09:24