У меня есть контейнер 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-скрипт работает сам по себе (то есть вне контейнера докеров).
Любая помощь приветствуется.
read_parquet
; Я предлагаю вам сократить свой код, чтобы он останавливался сразу послеdf <- arrow::read_parquet(.)
и посмотреть, сохраняется ли ошибка; если это так, то, возможно, стоит создать новую проблему дляarrow
в случае, если его файловые дескрипторы не закрываются должным образом (своевременно). Тот факт, что это происходит только в докере, я не могу объяснить. - person r2evans   schedule 06.07.2021arrange()
, чтобы получить сообщение об остановке выполнения. Эта функция довольно требовательна с точки зрения использования памяти, но в моей среде ее предостаточно. - person Greg   schedule 06.07.2021system()
для игнорирования любого сообщения stderr:system("Rscript auto01_macro_predict.R", intern = FALSE, ignore.stderr = TRUE)
Это не объясняет, откуда именно возникает ошибка SIGPIPE, и не исправляет ее. Но я могу уйти с этим на данный момент! Спасибо за помощь @r2evans - person Greg   schedule 07.07.2021