Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/logging/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Scala Spark应用程序日志消息未显示在EMR日志中_Scala_Logging_Apache Spark_Emr - Fatal编程技术网

Scala Spark应用程序日志消息未显示在EMR日志中

Scala Spark应用程序日志消息未显示在EMR日志中,scala,logging,apache-spark,emr,Scala,Logging,Apache Spark,Emr,我正在EMR上运行spark作业,但我的日志消息没有写入日志。我希望我的日志消息和spark日志消息混合在一起,就像我运行hadoop作业时发生的一样。当我在本地运行作业时,我的日志消息将按预期在日志输出的其余部分中打印 我尝试了以下不起作用的方法: import org.slf4j.LoggerFactory ... val logger=LoggerFactory.getLogger(MyPoc.getClass()) logger.info(“此处消息”) 及 import org.ap

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

我尝试了以下不起作用的方法:

import org.slf4j.LoggerFactory
...
val logger=LoggerFactory.getLogger(MyPoc.getClass())
logger.info(“此处消息”)

import org.apache.log4j.Logger
...
val logger=logger.getRootLogger()
logger.info(“此处消息”)

import org.apache.spark.Logging
对象MyPoc通过日志记录扩展应用程序{
...
logInfo(“此处消息”)
...
}

如何将运行在EMR上的spark作业中的日志消息写入日志文件

我的工作如下:


aws emr创建集群--名称emr Spark PoC--ami版本3.3.1\
--实例类型=m1.medium--实例计数2\
--ec2属性KeyName=key dev,InstanceProfile=EMRJobflowDefault\
--日志uri s3://my logs/emr/\
--bootstrap action Name=Spark,Path=s3://support.elasticmapreduce/Spark/install Spark,Args=[-x]\
--步骤名称=SparkPoC,Jar=s3://eu-west-1.elasticmapreduce/libs/script runner/script runner.Jar,Args=[/home/hadoop/spark/bin/spark submit,--部署模式,集群,--主机,纱线集群,--类,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]\
--无自动终止

我已经使用assembly构建了一个胖罐子。以下是我的大部分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选项,
安装Spark
引导操作有一个
-l
选项

您是否正在运行?您是如何启动群集并提交作业的?我正在使用本页“创建群集、运行Spark应用程序然后终止的一体式AWS CLI命令示例”下的说明。您认为我针对slf4j api/pom的合并策略可能有问题吗?我认为日志记录不应由您的应用程序设置,它应该由EMR引导程序处理。它应该在任何地方保存日志。当我在本地登录时,一切正常。我认为EMR上有一些不可靠的log4j配置。