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

How to reduce logs for Apache Spark in EMR?

我对 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>

由于没有人回答我的问题,所以我在这里自己解决。 1.upload 配置文件到你的主节点。

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.In 您的提交脚本只需附加

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

上述解决方案对我来说工作正常。

Configuring Applications - Amazon EMR

when creating EMR - log level should be set to INFO in config.json

...
[
  {
    "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 example to set WARN as default DEBUG when troubleshooting

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")