вторник, 17 января 2023 г.

Тест работает локально, но не работает в CI пайплайне

В процессе прикручивания Continuous Integration (CI) к приложению столкнулся с ситуацией когда end-to-end сценарий тестирования не работает в пайплайне. В то же время он корректно отрабатывает на локальной машине. У окружения CI отстутствует прямой доступ в Internet, но это не должно играть никакой роли т.к. сценарий написан таким образом, что приложение не предполагает ходить за пределы локальной машины.

Тестовый сценарий запускает контейнеры для всех сервисов приложения, загружает контрольный набор данных в источник, запускает обработку и затем следит за ходом работы, отслеживая контрольные точки. Все выполнялось правильно до этапа где проверяется наличие ожидаемых объектов в объектном хранилище. Причем оно было полностью пустым, что указывало на серьезный сбой.

Подключаюсь к Spark UI и вижу что задание обработки данных напрочь отсутвует. Далее смотрю логи компонента, который отвечает за его создание, но там никакого криминала нет. Иду в контейнер Spark Worker и начинаю медитировать на логи, а точнее их практически полное отсутствие.

:: loading settings :: url = jar:file:/spark/jars/ivy-2.5.0.jar!/org/apache/ivy/core/settings/ivysettings.xml
Ivy Default Cache set to: /root/.ivy2/cache
The jars for the packages stored in: /root/.ivy2/jars
org.apache.spark#spark-sql-kafka-0-10_2.12 added as a dependency
org.apache.spark#spark-core_2.12.10 added as a dependency
org.apache.spark#spark-sql_2.12.10 added as a dependency
org.apache.hadoop#hadoop-aws added as a dependency
org.apache.logging.log4j#log4j-slf4j-impl added as a dependency
:: resolving dependencies :: org.apache.spark#spark-submit-parent-444a9c97-977b-46e3-a3af-756121ea15b0;1.0
        confs: [default]

Глаз цепляется за строку "resolving dependencies", но никаких дельных мыслей по этому поводу в голове не появляется. На всякий случай сделал spark-submit руками, но ничего не изменилось. 

Учитывая мою "экспертизу" в Spark и Java-мире в целом, ставлю strace в контейнер и запускаю трассировку

strace -fF /spark/bin/spark-submit --master spark://spark-master:7077 --class com.example.somejob somejob-jar-with-dependencies.jar

Жду пока мельтешение на экране немного успокоится, останавливаю трассировку и изучаю вывод в консоли, отматывая историю терминала назад.

Не с первого раза (все таки конец рабочего дня) я нахожу строку, которую видел последней в сообщениях при запуске spark-submit - ":: resolving dependencies :: org.apache.spark#spark-submit-parent-662be16d-d465-49f9-a4b9-ac851cd58431;1.0", а следом некая сетевая активность в которой виднеется "repo1.maven.org".

Ivy Default Cache set to: /root/.ivy2/cache
The jars for the packages stored in: /root/.ivy2/jars
org.apache.spark#spark-sql-kafka-0-10_2.12 added as a dependency
org.apache.spark#spark-core_2.12.10 added as a dependency
org.apache.spark#spark-sql_2.12.10 added as a dependency
org.apache.hadoop#hadoop-aws added as a dependency
org.apache.logging.log4j#log4j-slf4j-impl added as a dependency
:: resolving dependencies :: org.apache.spark#spark-submit-parent-662be16d-d465-49f9-a4b9-ac851cd58431;1.0
        confs: [default]
strace: Process 909 attached
[pid   888] --- SIGSEGV {si_signo=SIGSEGV, si_code=SEGV_ACCERR, si_addr=0x7f80c7d36100} ---
[pid   903] --- SIGSEGV {si_signo=SIGSEGV, si_code=SEGV_ACCERR, si_addr=0x7f80c7d36300} ---
[pid   888] sendto(282, "\240\362\1\0\0\1\0\0\0\0\0\0\5repo1\5maven\3org\0\0\1\0"..., 33, MSG_NOSIGNAL, NULL, 0) = 33
[pid   888] sendto(282, {{len=20, type=RTM_GETADDR, flags=NLM_F_REQUEST|NLM_F_DUMP, seq=1673967161, pid=0}, {ifa_family=AF_UNSPEC, ...}}, 20, 0, {sa_family=AF_NETLINK, nl_pid=0, nl_groups=00000000}, 12) = 20
[pid   901] --- SIGSEGV {si_signo=SIGSEGV, si_code=SEGV_ACCERR, si_addr=0x7f80c7d36080} ---
[pid   901] --- SIGSEGV {si_signo=SIGSEGV, si_code=SEGV_ACCERR, si_addr=0x7f80c7d36080} ---

В общем причина сбоя теста найдена - приложение по какой-то причине пытается тянуть зависимости с репозитария Maven и ему не удается это сделать из-за отсутвия прямого доступа в Internet (а прокси ему не положен по статусу). Чтобы исправить это нужно разобраться с отсутсвующими зависимостями, но это будет завтра.

Обновлено 24/01/2023: Способ подкинуть настройки прокси для Spark нашел на Stackoverflow, более подробно про настройку прокси в Java

spark-submit --conf spark.driver.extraJavaOptions="-Dhttp.proxyHost=1.2.3.4 -Dhttp.proxyPort=8080 -Dhttps.proxyHost=1.2.3.4 -Dhttps.proxyPort=8080 -Dhttp.nonProxyHosts=localhost|spark-cluster"

Комментариев нет:

Отправить комментарий