Вопрос : Представьте, что я запускаю очень простой Python скрипт на EMR - assert 1 == 2
. Этот скрипт потерпит неудачу с AssertionError
. Журнал, содержащий трассировку, содержащую AssertionError
, будет помещен (если журналы включены) в корзину S3, которую я указал при настройке, и затем я смогу прочитать журнал, содержащий AssertionError
, когда эти журналы будут сброшены в S3. Однако где эти журналы существуют до того, как попадут в S3?
Я предполагаю, что они существуют в экземпляре EC2, на котором запущен конкретный скрипт. Допустим, я уже подключен к этому экземпляру EC2, и шаг EMR, на котором выполнялся сценарий, имел идентификатор s-EXAMPLE
. Если я сделаю:
[n1c9@mycomputer cwd]# gzip -d /mnt/var/log/hadoop/steps/s-EXAMPLE/stderr.gz
[n1c9@mycomputer cwd]# cat /mnt/var/log/hadoop/steps/s-EXAMPLE/stderr
Тогда я получу вывод с типичным 20/01/22 17:32:50 INFO Client: Application report for application_1 (state: ACCEPTED)
, который вы можете увидеть в файле журнала stderr
, к которому вы можете получить доступ в EMR:
Итак, мой вопрос: где журнал (stdout
), чтобы увидеть фактический AssertionError
, который был поднят? Он помещается в мое хранилище S3, указанное для ведения журнала примерно через 5-7 минут после того, как скрипт завершится неудачно / завершится, так где же он существует в EC2 до этого? Я спрашиваю, потому что попадание в эти журналы ошибок до того, как они будут размещены на S3, сэкономило бы мне много времени - в основном 5 минут каждый раз, когда я пишу сбойный скрипт, что чаще, чем мне хотелось бы признать!
То, что я пробовал до сих пор: Я пытался проверить stdout
на компьютере EC2 по путям в примере кода выше, но файл stdout
всегда пуст:
Что я пытаюсь понять, так это то, как этот файл stdout
может быть пустым, если есть доступ к трассировке AssertionError
на S3 минут спустя (не понимаю, как работает этот процесс ?). Я также попытался просмотреть некоторые временные папки, которые создает PySpark, но мне тоже не повезло. Кроме того, я напечатал выходные данные консолей для экземпляров EC2, работающих на EMR, как ядра, так и мастера, но, похоже, ни у одного из них нет соответствующей информации, которая мне нужна.
Я также просмотрел некоторые из методов EMR для boto3
и пробовал метод describe_step
, задокументированный здесь: https://boto3.amazonaws.com/v1/documentation/api/latest/reference/services/emr.html#EMR .Client.describe_step - который для неудачных шагов имеет FailureDetails
json dict-ответ. К сожалению, это включает только ключ LogFile
, который ссылается на файл stderr.gz
на S3 (даже в этом файле еще не существует) и ключ Message
, который содержит общее сообщение c Exception in thread..
, а не stdout
. Не понимаю ли я что-то о существовании этих журналов?
Пожалуйста, дайте мне знать, если вам нужна дополнительная информация!