scala - EMR 日志中未显示 Spark 应用程序日志消息

标签 scala logging apache-spark emr

我正在 EMR 上运行 Spark 作业,但我的日志消息没有写入日志。我希望我的日志消息与 Spark 日志消息混合在一起,就像我运行 hadoop 作业时发生的那样。当我在本地运行我的作业时,我的日志消息会在日志输出的其余部分中按预期打印。

我尝试了以下不起作用的方法:
import org.slf4j.LoggerFactory ... val logger = LoggerFactory.getLogger(MyPoc.getClass()) logger.info("message here")

import org.apache.log4j.Logger ... val logger = Logger.getRootLogger() logger.info("message here")

import org.apache.spark.Logging object MyPoc extends App with Logging { ... logInfo("message here") ... }
如何将日志消息从在 ​​EMR 上运行的 Spark 作业写入日志文件?

我正在启动我的工作如下:
aws emr create-cluster --name EMR-Spark-PoC --ami-version 3.3.1 \ --instance-type=m1.medium --instance-count 2 \ --ec2-attributes KeyName=key-dev,InstanceProfile=EMRJobflowDefault \ --log-uri s3://my-logs/emr/ \ --bootstrap-action Name=Spark,Path=s3://support.elasticmapreduce/spark/install-spark,Args=[-x] \ --steps Name=SparkPoC,Jar=s3://eu-west-1.elasticmapreduce/libs/script-runner/script-runner.jar,Args=[/home/hadoop/spark/bin/spark-submit,--deploy-mode,cluster,--master,yarn-cluster,--class,my.poc.EmrPoc,s3://my-dev/poc-0.0.1.jar,s3n://my-data/avro/part-m-00000.avro,s3n://my-data/avro/part-m-00000.avro] \ --no-auto-terminate
我已经使用汇编构建了一个 fat jar 子。这是我的大部分 build.sbt:

libraryDependencies ++= Seq(
  "org.apache.hadoop" % "hadoop-client" % "2.2.0" % "provided",
  "org.apache.spark" %% "spark-core" % "1.2.0" % "provided",
  "org.apache.spark" %% "spark-sql" % "1.2.0",
  "com.databricks" %% "spark-avro" % "0.1"
)

assemblyMergeStrategy in assembly := {
  case x if x.endsWith(".class") => MergeStrategy.last
  case x if x.endsWith(".properties") => MergeStrategy.last
  case x if x.contains("/resources/") => MergeStrategy.last
  case x if x.startsWith("META-INF/mailcap") => MergeStrategy.last
  case x if x.startsWith("META-INF/mimetypes.default") => MergeStrategy.first
  case x if x.startsWith("META-INF/maven/org.slf4j/slf4j-api/pom.") => MergeStrategy.first
  case x =>
    val oldStrategy = (assemblyMergeStrategy in assembly).value
    if (oldStrategy == MergeStrategy.deduplicate)
      MergeStrategy.first
    else
      oldStrategy(x)
}

assemblyExcludedJars in assembly := {
  val cp = (fullClasspath in assembly).value
  cp filter {_.data.getName == "avro-ipc-1.7.7-tests.jar"}
}

最佳答案

您可以在 EMR 上创建引导操作,以将您的应用程序 log4j 设置附加到 EMR log4j 环境。

1) 示例引导操作

#!/bin/bash
set -x
CUSTOM_LOG4J_FILE=$1
CUSTOM_LOG4J_FILE_NAME="customlog4j.txt"
echo "Starting to copy over logging configuration on EMR"
hadoop fs -get $CUSTOM_LOG4J_FILE /home/hadoop/
cat /home/hadoop/$CUSTOM_LOG4J_FILE_NAME >> /home/hadoop/conf/log4j.properties
exit 0

2) customlog4j.txt 的示例内容
log4j.logger.org.apache.spark.repl.SparkIMain$exprTyper=ERROR
log4j.logger.org.apache.spark.repl.SparkILoop$SparkILoopInterpreter=ERROR
log4j.logger.org.apache.spark=ERROR
log4j.logger.akka=ERROR
log4j.logger.io=ERROR
log4j.my.poc=DEBUG

注意:如果您只需要更改 Spark 驱动程序的 log4j 选项,则 install-spark引导操作有一个 -l选项

关于scala - EMR 日志中未显示 Spark 应用程序日志消息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28297898/

相关文章:

apache-spark - Yarn 模式下的 Spark 文件记录器

scala - 更改现有数据框的架构

amazon-web-services - AWS 的 EMR 与 EC2 定价混淆

scala - 如何显示 ScalaCheck 测试中抛出的异常的整个堆栈跟踪?

scala - 函数数组?

java - 我见过的最奇怪的tomcat错误

java - 同一个包的 Log4j 的多个 Appender

scala - lift-json XPath\\operator 根据 num 匹配有不同的返回类型

xml - Scala - 用特定文本替换 xml 元素

android - LogBack - 使用应用程序信息设置日志记录模式