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
相关产品推荐
相关产品推荐

