为 Amazon EMR Serverless 配置 Apache Log4j2 属性 - Amazon EMR

为 Amazon EMR Serverless 配置 Apache Log4j2 属性

本页面介绍了如何在 StartJobRun 中为 EMR Serverless 作业配置自定义 Apache Log4j 2.x 属性。如果要在应用程序级别配置 Log4j 分类,请参阅 EMR Serverless 的默认应用程序配置

为 Amazon EMR Serverless 配置 Spark Log4j2 属性

在 Amazon EMR 6.8.0 及更高版本中,您可以自定义 Apache Log4j 2.x 属性,以指定细粒度的日志配置。这简化了 EMR Serverless 上 Spark 作业的故障排除。要配置这些属性,请使用 spark-driver-log4j2spark-executor-log4j2 分类。

Spark 的 Log4j2 分类

要自定义 Spark 日志配置,请在 applicationConfiguration 中使用以下分类。要配置 Log4j 2.x 属性,请使用以下 properties

spark-driver-log4j2

该分类为驱动程序设置 log4j2.properties 文件中的值。

spark-executor-log4j2

该分类为执行程序设置 log4j2.properties 文件中的值。

Spark 的 Log4j2 配置示例

以下示例展示了如何向 applicationConfiguration 提交 Spark 作业,以便为 Spark 驱动程序和执行程序自定义 Log4j2 配置。

要在应用程序级别而不是在提交作业时配置 Log4j 分类,请参阅 EMR Serverless 的默认应用程序配置

aws emr-serverless start-job-run \ --application-id application-id \ --execution-role-arn job-role-arn \ --job-driver '{ "sparkSubmit": { "entryPoint": "/usr/lib/spark/examples/jars/spark-examples.jar", "entryPointArguments": ["1"], "sparkSubmitParameters": "--class org.apache.spark.examples.SparkPi --conf spark.executor.cores=4 --conf spark.executor.memory=20g --conf spark.driver.cores=4 --conf spark.driver.memory=8g --conf spark.executor.instances=1" } }' --configuration-overrides '{ "applicationConfiguration": [ { "classification": "spark-driver-log4j2", "properties": { "rootLogger.level":"error", // will only display Spark error logs "logger.IdentifierForClass.name": "classpath for setting logger", "logger.IdentifierForClass.level": "info" } }, { "classification": "spark-executor-log4j2", "properties": { "rootLogger.level":"error", // will only display Spark error logs "logger.IdentifierForClass.name": "classpath for setting logger", "logger.IdentifierForClass.level": "info" } } ] }'

示例 Spark 作业中的 Log4j2

以下代码示例演示了如何在初始化应用程序的自定义 Log4j2 配置时创建 Spark 应用程序。

Python
例 使用 Log4j2 通过 Python 执行 Spark 作业
import os import sys from pyspark import SparkConf, SparkContext from pyspark.sql import SparkSession app_name = "PySparkApp" if __name__ == "__main__": spark = SparkSession\ .builder\ .appName(app_name)\ .getOrCreate() spark.sparkContext._conf.getAll() sc = spark.sparkContext log4jLogger = sc._jvm.org.apache.log4j LOGGER = log4jLogger.LogManager.getLogger(app_name) LOGGER.info("pyspark script logger info") LOGGER.warn("pyspark script logger warn") LOGGER.error("pyspark script logger error") // your code here spark.stop()

要在执行 Spark 作业时为驱动程序自定义 Log4j2,可使用以下配置:

{ "classification": "spark-driver-log4j2", "properties": { "rootLogger.level":"error", // only display Spark error logs "logger.PySparkApp.level": "info", "logger.PySparkApp.name": "PySparkApp" } }
Scala
例 使用 Log4j2 通过 Scala 执行 Spark 作业
import org.apache.log4j.Logger import org.apache.spark.sql.SparkSession object ExampleClass { def main(args: Array[String]): Unit = { val spark = SparkSession .builder .appName(this.getClass.getName) .getOrCreate() val logger = Logger.getLogger(this.getClass); logger.info("script logging info logs") logger.warn("script logging warn logs") logger.error("script logging error logs") // your code here spark.stop() } }

要在执行 Spark 作业时为驱动程序自定义 Log4j2,可使用以下配置:

{ "classification": "spark-driver-log4j2", "properties": { "rootLogger.level":"error", // only display Spark error logs "logger.ExampleClass.level": "info", "logger.ExampleClass.name": "ExampleClass" } }

Spark 的 Log4j2 注意事项

以下 Log4j2.x 属性不可针对 Spark 进程进行配置:

  • rootLogger.appenderRef.stdout.ref

  • appender.console.type

  • appender.console.name

  • appender.console.target

  • appender.console.layout.type

  • appender.console.layout.pattern

有关可以配置的 Log4j2.x 属性的详细信息,请参阅 GitHub 上的 log4j2.properties.template 文件