Сообщения журнала приложения Spark не отображаются в журналах EMR

Я запускаю искровое задание на EMR, но мои сообщения журнала не записываются в журналы. Я ожидал, что мои сообщения журнала будут смешиваться с сообщениями журнала искры, как это происходит, когда я запускаю задание 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?

Я начинаю свою работу следующим образом:

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

Я построил толстую банку с помощью сборки. Вот большая часть моего 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"}
}

person jbrown    schedule 03.02.2015    source источник
comment
Вы используете ПРЯЖУ? Как вы запускаете кластер и отправляете свою работу?   -  person Dan Osipov    schedule 03.02.2015
comment
Я использую инструкции из раздела Пример универсальной команды AWS CLI, которая создает кластер, запускает приложение Spark, а затем завершает работу на этой странице forum.aws.amazon.com/thread.jspa?threadID=126682&tstart=0   -  person jbrown    schedule 03.02.2015
comment
Как вы думаете, может быть виновата моя стратегия слияния для slf4j-api / pom?   -  person jbrown    schedule 03.02.2015
comment
Я не думаю, что ведение журнала должно настраиваться вашим приложением, это должно выполняться с помощью начальной загрузки EMR. Он должен сохранять журналы везде, где YARN отправляет журналы.   -  person Dan Osipov    schedule 03.02.2015
comment
Ага. Когда я регистрируюсь локально, все работает нормально. Я думаю, что на EMR есть какая-то хитрая конфигурация log4j.   -  person jbrown    schedule 03.02.2015


Ответы (1)


Вы можете создать действие начальной загрузки в 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

Примечание: если вам нужно изменить только параметры log4j для драйвера Spark, действие начальной загрузки install-spark имеет параметр -l.

person Himanish Kushary    schedule 15.04.2015