AWS EMR Spark Python Logging

Я запускаю очень простое искровое задание на AWS EMR и, похоже, не могу получить какой-либо вывод журнала из моего script.

Я пробовал с печатью на stderr:

from pyspark import SparkContext
import sys

if __name__ == '__main__':
    sc = SparkContext(appName="HelloWorld")
    print('Hello, world!', file=sys.stderr)
    sc.stop()

И используя искровой журнал, как показано здесь:

from pyspark import SparkContext

if __name__ == '__main__':
    sc = SparkContext(appName="HelloWorld")

    log4jLogger = sc._jvm.org.apache.log4j
    logger = log4jLogger.LogManager.getLogger(__name__)
    logger.error('Hello, world!')

    sc.stop()

EMR дает мне два файла журнала после выполнения задания: controller и stderr. Ни один журнал не содержит строку "Hello, world!". Я понимаю, что stdout перенаправлен на stderr в искру. Журнал stderr показывает, что задание принято, выполняется и успешно завершено.

Итак, мой вопрос: где я могу просмотреть выход журнала script? Или что я должен изменить в своем script для правильного ведения журнала?

Изменить: я использовал эту команду для отправки шага:

aws emr add-steps --region us-west-2 --cluster-id x-XXXXXXXXXXXXX --steps Type=spark,Name=HelloWorld,Args=[--deploy-mode,cluster,--master,yarn,--conf,spark.yarn.submit.waitAppCompletion=true,s3a://path/to/simplejob.py],ActionOnFailure=CONTINUE

Ответ 1

Я обнаружил, что ведение журнала EMR для определенных шагов почти никогда не завершается в журналах контроллера или stderr, которые вытягиваются рядом с шагом в консоли AWS.

Обычно я нахожу то, что я хочу в журналах контейнеров задания (и обычно это в стандартном режиме).

Обычно они находятся на пути, например s3://mybucket/logs/emr/spark/j-XXXXXX/containers/application‌​_XXXXXXXXX/container‌​_XXXXXXX/.... Возможно, вам придется сориентироваться в различных каталогах application_... и container_... в пределах containers.

В последнем каталоге контейнера должны быть stdout.log и stderr.log.

Ответ 2

Чтобы записать вывод script, вы также можете попробовать что-то вроде ниже

/usr/bin/spark-submit --master yarn --num-executors 300 myjob.py param1 > s3://databucket/log.out 2>&1 &

Это будет записывать вывод script в файл журнала в местоположении s3.

Ответ 3

Для чего это стоит. Пусть j-XXX будет идентификатором кластера EMR и предположим, что он настроен на использование logs_bucket для сохранения журналов на S3. Если вы хотите найти журналы, генерируемые вашим кодом, сделайте следующее:

  1. В консоли AWS найдите шаг, который вы хотите просмотреть
  2. Перейдите в is stderr и найдите application_. Запишите полное имя, которое вы найдете, это должно быть что-то вроде application_15489xx175355_0yy5.
  3. Перейдите в s3://logs_bucket/j-XXX/containers и найдите папку application_15489xx175355_0yy5.
  4. В этой папке вы найдете как минимум одну папку с именем application_15489xx175355_0yy5_ww_vvvv. В этих папках вы найдете файлы с именем stderr.gz которые содержат журналы, stderr.gz вашим кодом.