如何在EMR中减少Apache Spark的日志记录?

3
我有一个关于在AWS EMR上运行的Apache Spark作业的问题。每次执行Spark作业时,都会产生大量日志,例如我的情况下,日志大小约为5-10GB,但其中80%的日志是信息(无用),我该如何减少这些日志?
我使用了log4j2 for Spark将日志级别更改为“warn”,以避免不必要的日志,但由于这些日志来自Spark中的不同组件,其中一些日志来自YARN,一些日志来自EMR,因此它们合并在一起。那么如何解决这个问题?是否有人有这样的经验?因为我不想重新配置集群中的每个节点。
我尝试了以下解决方案,似乎在EMR中无效。
Logger logger = LogManager.getLogger("sparklog");
logger.setlevel()

以下是XML配置。
String used to match the log4j2.xml configuration files
<Configuration status="WARN" monitorInterval="300">////reload the configuration file each 300 seconds
    <Appenders>
        <Console name="Console" target="SYSTEM_OUT">
            <PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n" /> //// control output format
        </Console>
    </Appenders>
    <Loggers>
        <Logger name="sparklog" level="warn" additivity="false">//// configuration the  myloger loger level
            <AppenderRef ref="Console" />
        </Logger>
        <Root level="error">
            <AppenderRef ref="Console" />
        </Root>
    </Loggers>
</Configuration>
3个回答

0

由于没有人回答我的问题,所以我自己找到了解决方案。 1.将配置文件上传到您的主节点。

scp -i ~/.ssh/emr_dev.pem /Users/x/log4j_files/log4j.properties hadoop@ec2-xxx-xxx-xxx.eu-west-1.compute.amazonaws.com:/usr/tmp/

2.在您的提交脚本中附加

"--files": "/usr/tmp/log4j.properties"

这个解决方案对我来说运行良好。


请问您能详细说明如何在spark submit命令中使用"--files": "/usr/tmp/log4j.properties"吗?它将如何知道这是log4j配置文件。 - Roobal Jindal

0

EMR 6.9.0与Spark 3.3.0一起使用log4j2,因此这是您需要提供的配置,以更改日志输出。您可以通过设置自定义的“spark-log4j2”配置来为整个Spark集群和步骤执行此操作。下面的示例演示了将“KafkaConsumer”记录器设置为“warn”级别,任何有效的log4j2属性都可以根据需要附加。

在EMR控制台上,在创建集群时,您可以在“软件设置-可选”下执行此操作,然后修改JSON配置,例如:

[
  {
    "Classification": "spark-log4j2",
      "Properties": {
        "logger.KafkaConsumer.name": "org.apache.kafka.clients.consumer.KafkaConsumer",
        "logger.KafkaConsumer.level": "warn"     
      }
  }
]

如果您正在使用命令行创建EMR集群,则可以执行以下操作:
aws emr create-cluster \
  --name "Your cluster name" \
  --release-label "emr-6.9.0" \
  --configurations '[{"Classification":"spark-log4j2","Properties":{"logger.KafkaConsumer.name":"org.apache.kafka.clients.consumer.KafkaConsumer","logger.KafkaConsumer.level":"warn"}}]' \
  .... other arguments go here

0

配置应用程序 - Amazon EMR

创建 EMR 时,应在 config.json 中将日志级别设置为 INFO。

...
[
  {
    "Classification": "spark-log4j",
    "Properties": {
      "log4j.rootCategory": "INFO, console"
    }
  }
]
...

创建 EMR 时使用 config.json

aws emr create-cluster --release-label emr-5.27.0 --applications Name=Spark \
--instance-type m4.large --instance-count 2 --service-role EMR_DefaultRole --ec2-attributes InstanceProfile=EMR_EC2_DefaultRole --configurations https://s3.amazonaws.com/mybucket/myfolder/config.json

pyspark示例:在故障排除时将WARN设置为默认DEBUG

from org.apache.spark.sql import SparkSession

spark = SparkSession.builder().master("/emr/spark/master").getOrCreate()

#normal run
spark.sparkContext.setLogLevel("WARN") 

#troubleshooting
spark.sparkContext.setLogLevel("DEBUG") 

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