如何在Spark应用程序中进行有效的日志记录

6
我有一个用Scala编写的Spark应用程序代码,运行一系列Spark-SQL语句。这些结果是通过在最终dataframe中调用操作“Count”计算出来的。我想知道在Spark-scala应用程序作业中从哪里记录日志最好?由于所有数据框(约20个)都是使用单个操作在最后计算的,因此当涉及到记录某些语句的输出/顺序/成功时,我的选择是什么。
问题有点普遍。由于Spark基于惰性评估,执行计划由Spark决定,我想知道应用程序语句成功运行到哪一步,以及在那个阶段的中间结果是什么。
这里的意图是监视长时间运行的任务,并查看它正常运行到哪个阶段,以及问题在哪里出现。
如果我们尝试在转换之前/之后放置日志记录,则在读取代码时会将其打印。因此,在实际执行期间必须使用自定义消息进行记录(在scala代码的结尾调用操作)。如果我尝试在代码中间放置count/take/first等操作,则作业的执行速度会变慢很多。

为什么不使用Spark UI?它将为您提供有关Spark应用程序的实时信息以及每个执行器的日志。(https://jaceklaskowski.gitbooks.io/mastering-apache-spark/spark-webui.html) - Aleksejs R
2个回答

2
我了解你所遇到的问题。让我提出一个简单的解决方案。
你需要使用org.apache.log4j.Logger。使用以下代码行来生成记录器消息。

你需要使用org.apache.log4j.Logger。使用以下代码行来生成记录器消息。

org.apache.log4j.Logger logger = org.apache.log4j.Logger.getRootLogger();

logger.error(errorMessage);
logger.info(infoMessage);
logger.debug(debugMessage);

现在,为了将这些消息重定向到日志文件中,您需要创建一个具有以下内容的log4j属性文件。"最初的回答"。
# Root logger option

# Set everything to be logged to the console
log4j.rootCategory=INFO, console
log4j.appender.console=org.apache.log4j.ConsoleAppender
log4j.appender.console.target=System.err
log4j.appender.console.layout=org.apache.log4j.PatternLayout
log4j.appender.console.layout.ConversionPattern=%d{yy/MM/dd HH:mm:ss} %p %c{1}: %m%n

# Settings to quiet third party logs that are too verbose
log4j.logger.org.eclipse.jetty=OFF
log4j.logger.org.eclipse.jetty.util.component.AbstractLifeCycle=OFF
log4j.logger.org.spark-project.jetty.servlet.ServletHandler=OFF
log4j.logger.org.spark-project.jetty.server=OFF
log4j.logger.org.spark-project.jetty=OFF
log4j.category.org.spark_project.jetty=OFF
log4j.logger.Remoting=OFF
log4j.logger.org.apache.spark.repl.SparkIMain$exprTyper=INFO
log4j.logger.org.apache.spark.repl.SparkILoop$SparkILoopInterpreter=INFO
log4j.logger.org.apache.parquet=ERROR
log4j.logger.parquet=ERROR

# Setting properties to have logger logs in local file system 
log4j.appender.rolling=org.apache.log4j.RollingFileAppender
log4j.appender.rolling.encoding=UTF-8
log4j.appender.rolling.layout=org.apache.log4j.PatternLayout
log4j.appender.rolling.layout.conversionPattern=[%d] %p %m (%c)%n
log4j.appender.rolling.maxBackupIndex=5
log4j.appender.rolling.maxFileSize=50MB
log4j.logger.org.apache.spark=OFF
log4j.logger.org.spark-project=OFF
log4j.logger.org.apache.hadoop=OFF
log4j.logger.io.netty=OFF
log4j.logger.org.apache.zookeeper=OFF
log4j.rootLogger=INFO, rolling
log4j.appender.rolling.file=/tmp/logs/application.log

你可以在最后一个语句中命名日志文件。确保每个节点的文件夹具有适当的权限。
现在,我们需要在提交spark作业时传递配置,如下所示。
 --conf spark.executor.extraJavaOptions=-Dlog4j.configuration=spark-log4j.properties --conf spark.driver.extraJavaOptions=-Dlog4j.configuration=spark-log4j.properties 

And,

--files "location of spark-log4j.properties file"

最初的回答。希望这能帮到你!

0
可以从Maven 导入 log4j 库。
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-api</artifactId>
<version>${log4j.version}</version>
</dependency>

关于日志记录,首先需要创建一个日志记录器对象,然后可以在不同的日志级别(如info、error、warning)下进行日志记录。以下是使用log4j在Spark Scala中记录信息的示例:

import org.apache.logging.log4j.LogManager
val logger = LogManager.getLogger(this.getClass.getName)

logger.info("logging message")

因此,要在某些点添加信息,您可以在该点使用logger.info("logging message")。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接