Как я могу избежать остановки моего контейнера Docker, на котором запущен сценарий R, после ошибки SIGPIPE?

У меня есть контейнер Docker, который успешно запускает сценарий R (т. е. сценарий завершен) на AWS, но возвращает следующую ошибку:

Error: ignoring SIGPIPE signal  
Execution halted

Вот сценарий R (отобранный после того, как я сузил область возникновения проблемы):

library(arrow)
library(naniar)
library(tidyr)
library(dplyr)

df <- arrow::read_parquet("s3://mybucket/myfile.parquet")

start_time <- Sys.time()

print("Calculate missing-shadow")
df %>%
  # slice(1:1000) %>%
  # Use Naniar to bind a shadow matrix (ie. a T/F matrix for if a varible is NA or not)
  bind_shadow() %>%
  # Keep only ID and the variables that are shadows
  select(bet_cus_id,ends_with("_NA")) %>%
  # Gather so we can combine into one giant string
  gather(var,isna,-bet_cus_id) %>%
  # Change to true/false, becuase 1/0 is easier to read than !NA and NA
  mutate(isna = isna == "NA") %>%
  unite("Merged",var:isna,remove=TRUE) %>%
  # Sort so every  string has the same sorting
  group_by(bet_cus_id) %>%
  arrange(Merged, .by_group = TRUE) %>%
  {.} -> df.player

print("Finished missing-shadow")
print(df.player %>% slice(1:3))
print(length(unique(df.player$bet_cus_id)))
print(length(df.player$bet_cus_id))

Sys.time()-start_time

И докерфайл

FROM rstudio/r-base:4.0.4-focal

RUN apt-get update

RUN apt-get install -y --no-install-recommends git cmake

# arrow
RUN apt-get install -y libcurl4-openssl-dev
RUN apt-get install -y libssl-dev

ENV ARROW_S3=ON

RUN apt-get update

# h2o
RUN apt-get install -y default-jdk
RUN R CMD javareconf

ENV RENV_VERSION 0.13.2
RUN R -e "install.packages('remotes', repos = c(CRAN = 'https://cloud.r-project.org'))"
RUN R -e "remotes::install_github('rstudio/renv@${RENV_VERSION}')"

RUN Rscript -e "install.packages('devtools', repos='https://packagemanager.rstudio.com/all/__linux__/focal/latest')"
RUN Rscript -e "devtools::install_version('h2o', version = '3.30.0.1', repos = 'https://packagemanager.rstudio.com/all/__linux__/focal/latest')"

WORKDIR /project
COPY renv.lock renv.lock
RUN R -e 'renv::restore(repos=c("https://packagemanager.rstudio.com/all/__linux__/focal/latest"))'

RUN rm -rf /tmp/* \
  && apt-get remove --purge -y $BUILDDEPS \
  && apt-get autoremove -y \

EXPOSE 3840
  
COPY test.R test.R

CMD ["Rscript","test.R"]

и вот последняя строка файла журнала (от journalctl -u docker.service)

Jul 06 08:59:53 ip-XXX.eu-north-1.compute.internal 131e033f5fe2[4359]: Time difference of 3.678913 mins
Jul 06 08:59:53 ip-XXX.eu-north-1.compute.internal 131e033f5fe2[4359]: Error: ignoring SIGPIPE signal
Jul 06 08:59:53 ip-XXX.eu-north-1.compute.internal 131e033f5fe2[4359]: Execution halted
Jul 06 08:59:53 ip-XXX.eu-north-1.compute.internal dockerd[4359]: time="2021-07-06T08:59:53.867394818Z" level=info msg="ignoring event" container=131e033f5fe2cf5f0854ce97115544889a59f97a959509bdc7fef24d8ba08cd4 module=libcontainerd namespace=moby topic=/tasks/delete type="*events.TaskDelete"
    enter code here

Я не могу найти ничего полезного в приведенном выше журнале. Однако это, похоже, связано с памятью, поскольку SIGPIPE/выполнение остановлено не происходит, если я уменьшаю размер фрейма данных, например, до 1000 строк (фрейм данных на входе довольно большой: ~45 млн строк/3 столбца). Возможно, ведение журнала не успевает до конца скрипта из-за большого размера фрейма данных, отсюда и проблема SIGPIPE. Просто предположение... и я все равно не знаю, как это решить.

Обновление от 07.06. Я должен был упомянуть, что приведенный выше R-скрипт работает сам по себе (то есть вне контейнера докеров).

Любая помощь приветствуется.


person Greg    schedule 06.07.2021    source источник
comment
Я погуглил ошибку и нашел stackoverflow.com/q/28915838/3358272, возможно, связанный?   -  person r2evans    schedule 06.07.2021
comment
Спасибо, что проверили @r2evans. Я не думаю, что сообщение, которое вы упомянули, имеет прямое отношение. Я должен был упомянуть, что скрипт R отлично работает сам по себе (то есть вне контейнера докера). Так что это несколько связано с Docker.   -  person Greg    schedule 06.07.2021
comment
Я думаю, вы упустили суть: эта ошибка от R, а не от докера. Единственное, что может это сделать, это read_parquet; Я предлагаю вам сократить свой код, чтобы он останавливался сразу после df <- arrow::read_parquet(.) и посмотреть, сохраняется ли ошибка; если это так, то, возможно, стоит создать новую проблему для arrow в случае, если его файловые дескрипторы не закрываются должным образом (своевременно). Тот факт, что это происходит только в докере, я не могу объяснить.   -  person r2evans    schedule 06.07.2021
comment
Я не получаю никакого сообщения об ошибке, если я сокращаю код только до чтения файла паркета. Мне нужно обратиться к функции arrange(), чтобы получить сообщение об остановке выполнения. Эта функция довольно требовательна с точки зрения использования памяти, но в моей среде ее предостаточно.   -  person Greg    schedule 06.07.2021
comment
Я нашел обходной путь по ссылке, предоставленной @r2evans. Таким образом, вместо прямой отправки сценария R он фактически проходит через другой сценарий R, который использует функцию system() для игнорирования любого сообщения stderr: system("Rscript auto01_macro_predict.R", intern = FALSE, ignore.stderr = TRUE) Это не объясняет, откуда именно возникает ошибка SIGPIPE, и не исправляет ее. Но я могу уйти с этим на данный момент! Спасибо за помощь @r2evans   -  person Greg    schedule 07.07.2021