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

时间:2017-08-30 07:17:32

标签: apache-spark log4j log4j2 emr amazon-emr

我对AWS EMR上运行的Apache Spark作业有疑问。每当我执行Spark作业时,它会生成大量日志,在我的情况下,日志大小约为5-10GB,但80%的日志是信息(无用),我该如何减少这些日志?

我使用log4j2 for 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>

2 个答案:

答案 0 :(得分:0)

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

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

2.在提交脚本中,只需附上

即可
var elements = document.querySelectorAll('.ldTitle');
var arrayOfUsedNames = [];

for (var i = 0; i < elements.length; i++)
{
  var index = arrayOfUsedNames.indexOf(elements[i].innerHTML);

  if (index == -1)
  {
    arrayOfUsedNames.push(elements[i].innerHTML);
  } 

  else
  {
    elements[i].parentNode.parentNode.removeChild(elements[i].parentNode);
  }

}

console.log(arrayOfUsedNames);

以上解决方案适合我。

答案 1 :(得分:0)

Configuring Applications - 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设置为默认调试

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