PySpark:日志仅将写入EMR stderr/stdout并带有非零退出代码

PySpark:日志仅将写入EMR stderr/stdout并带有非零退出代码

在本文中,我们将介绍在使用PySpark时,日志只会写入EMR(Amazon Elastic MapReduce)的stderr/stdout,并且在任务执行结束时带有非零退出代码的原因。我们还将讨论如何解决这个问题,并提供相应的示例说明。

阅读更多:PySpark 教程

问题描述

在使用PySpark执行任务时,用户可能会遇到在EMR集群的stderr/stdout中看不到任何日志输出的情况。相反,只有在任务执行失败(即非零退出代码)时,才能在这些日志中找到相关的错误信息。这给故障排除和调试带来了一定的困难,尤其是当任务成功执行但结果不符合期望时。

原因分析

这个问题的原因可以追溯到PySpark执行任务的方式。在EMR集群上,PySpark的任务是通过执行spark-submit脚本来启动的。而在这个脚本中,PySpark会将任务打包成一个Java JAR文件,并将其提交给Spark执行引擎。

由于这个执行过程是在集群内部进行的,导致任务的输出和日志信息被重定向到EMR的stderr/stdout中。但是,当任务成功执行时,不会有额外的信息输出到stderr/stdout,这就解释了为什么我们只能在任务执行失败时看到相关的日志信息。

解决方法

为了解决这个问题,我们可以使用spark.eventLog.enabled配置参数来启用Spark事件日志记录。在EMR集群上,我们可以通过在Spark配置文件中设置spark-defaults.conf来实现。

首先,我们需要创建一个新的Spark配置文件,命名为spark-defaults.conf,并设置spark.eventLog.enabled参数为true。接下来,将该配置文件上传到EMR集群的主节点上。然后,重新提交任务并观察执行过程中的日志输出。

下面是一个示例spark-defaults.conf文件的内容:

spark.eventLog.enabled true

将上述内容保存为名为spark-defaults.conf的文件,并将其上传到EMR集群。

重新提交任务后,你将能够在EMR的stderr/stdout中看到从Spark触发的日志输出,无论任务是否成功执行。这将大大方便故障排除和任务调试的过程。

示例说明

假设我们有一个简单的PySpark任务,它计算一个整数列表的平均值。下面是示例代码:

from pyspark.sql import SparkSession

# 创建SparkSession对象
spark = SparkSession.builder.appName("Average Calculation").getOrCreate()

# 创建一个整数列表
numbers = [1, 2, 3, 4, 5]

# 将整数列表转换为RDD
rdd = spark.sparkContext.parallelize(numbers)

# 计算平均值
average = rdd.mean()

# 打印平均值
print("Average: " + str(average))

# 停止SparkSession对象
spark.stop()

在没有启用Spark事件日志记录的情况下,我们无法在EMR的stderr/stdout中看到任何日志输出。但是,在任务执行失败时,我们可以在stderr/stdout中看到相关的错误信息。

为了解决这个问题,我们按照前面提到的方法创建一个spark-defaults.conf文件,并将其上传到EMR集群。然后,重新提交任务。

重新提交任务后,我们将能够在EMR的stderr/stdout中看到从Spark触发的日志输出,无论任务是否成功执行。这将帮助我们更好地进行故障排除和调试。

总结

在使用PySpark时,我们可能会遇到日志只会写入EMR stderr/stdout并且在任务执行结束时带有非零退出代码的问题。这是因为任务的输出和日志信息被重定向到EMR的stderr/stdout中,并且只有在任务执行失败时,我们才能在这些日志中看到相关的错误信息。

为了解决这个问题,我们可以通过启用Spark事件日志记录来使日志在任务成功执行时也能输出到stderr/stdout中。我们需要创建一个spark-defaults.conf文件,并将其上传到EMR集群。

通过上述解决方法,我们能够更好地进行任务调试和故障排除,提高PySpark开发的效率。

Camera课程

Python教程

Java教程

Web教程

数据库教程

图形图像教程

办公软件教程

Linux教程

计算机教程

大数据教程

开发工具教程