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. Если вы хотите найти журналы, генерируемые вашим кодом, сделайте следующее:
- В консоли AWS найдите шаг, который вы хотите просмотреть
- Перейдите в is
stderr
и найдите application_
. Запишите полное имя, которое вы найдете, это должно быть что-то вроде application_15489xx175355_0yy5
. - Перейдите в
s3://logs_bucket/j-XXX/containers
и найдите папку application_15489xx175355_0yy5
. - В этой папке вы найдете как минимум одну папку с именем
application_15489xx175355_0yy5_ww_vvvv
. В этих папках вы найдете файлы с именем stderr.gz
которые содержат журналы, stderr.gz
вашим кодом.