Где журналы EMR, которые размещены в S3, расположены на экземпляре EC2, на котором выполняется сценарий? - PullRequest
1 голос
/ 23 января 2020

Вопрос : Представьте, что я запускаю очень простой 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: image showing Log files section of EMR step

Итак, мой вопрос: где журнал (stdout), чтобы увидеть фактический AssertionError, который был поднят? Он помещается в мое хранилище S3, указанное для ведения журнала примерно через 5-7 минут после того, как скрипт завершится неудачно / завершится, так где же он существует в EC2 до этого? Я спрашиваю, потому что попадание в эти журналы ошибок до того, как они будут размещены на S3, сэкономило бы мне много времени - в основном 5 минут каждый раз, когда я пишу сбойный скрипт, что чаще, чем мне хотелось бы признать!

То, что я пробовал до сих пор: Я пытался проверить stdout на компьютере EC2 по путям в примере кода выше, но файл stdout всегда пуст: command terminal indicating that stdout is 0 bytes

Что я пытаюсь понять, так это то, как этот файл 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. Не понимаю ли я что-то о существовании этих журналов?

Пожалуйста, дайте мне знать, если вам нужна дополнительная информация!

1 Ответ

1 голос
/ 31 января 2020

Вполне нормально, что с агентами сбора журналов фактические файлы журналов на самом деле не растут, а просто перехватывают stdout, чтобы сделать то, что им нужно. Скорее всего, когда вы конфигурируете использовать S3 для журналов, агент настроен либо на чтение и удаление вашего фактического файла журнала, либо, возможно, на создание символической ссылки на файл журнала куда-то еще, так что этот файл фактически никогда не записывается при открытии любого процесса

возможно, попробуйте проверить, есть ли там какая-либо символическая ссылка

find -L / -samefile /mnt/var/log/hadoop/steps/s-EXAMPLE/stderr

, но это может быть что-то отличное от символической ссылки для достижения того же лога c, и я не могу найти что-нибудь в AWS документах, так что, скорее всего, не предполагается, что у вас будут одновременно и S3, и файлы, и, возможно, вы не найдете его

Если вы хотите иметь возможность чаще проверять свои журналы, Вы можете подумать об установке стороннего сборщика журналов (logsta sh, beats, rsyslog, fluentd) и отправке журналов в SolarWinds Loggly, logz.io или настройке ELK (Elasti c search, logsta * 1020). *, kibana)

Вы можете проверить эту статью из Loggly или создать бесплатный аккаунт в logz.io и проверить лот бесплатный корабль что они поддерживают

...