Использование Spark 2.4.4
У меня есть изображение docker, которое запускается как пользователь, не являющийся root. Программное обеспечение spark находится в каталоге, принадлежащем пользователю, и я могу запустить пример SparkPi (как пользователь, не являющийся root) из образа, используя эту команду:
/opt/nsp/spark/bin/spark-submit \
--deploy-mode client \
--name spark-pi \
--class org.apache.spark.examples.SparkPi \
--conf spark.executor.instances=1 \
--conf spark.driver.memory=1G \
--conf spark.executor.memory=1G \
--conf spark.driver.cores=1 \
local:///opt/nsp/spark/examples/jars/spark-examples_2.11-2.4.4.jar
Это завершено успешно.
Когда я пытаюсь запустить его в кластере Kubernetes с помощью spark-submit, я получаю java .nio.file.AccessDeniedException.
Я вижу это в журнале исполнителя:
20/01/27 14:48:46 INFO Utils: Fetching spark://spark-pi-1580136512257-driver-svc.nsp.svc:7078/jars/spark-examples_2.11-2.4.4.jar to /var/data/spark-ebbc540f-5256-4ef4-8568-9b22233bcc42/spark-a3dadf1e-e21f-4df6-a985-75ff161e6c80/fetchFileTemp1549348282821390884.tmp
20/01/27 14:48:46 INFO Utils: Copying /var/data/spark-ebbc540f-5256-4ef4-8568-9b22233bcc42/spark-a3dadf1e-e21f-4df6-a985-75ff161e6c80/2218273401580136519157_cache to /./spark-examples_2.11-2.4.4.jar
20/01/27 14:48:46 ERROR Executor: Exception in task 0.0 in stage 0.0 (TID 0)
java.nio.file.AccessDeniedException: ./spark-examples_2.11-2.4.4.jar
Похоже, что исполнитель выбирает файл jar и помещает его в каталог с нулями. Но затем он пытается скопировать его в каталог root '/', к которому не пользователь root не имеет доступа.
Это ожидаемое поведение? Есть ли способ заставить это работать?
Спасибо
Редактировать:
Мне кажется, я понял, что происходит.
I я создаю не-1044 * пользователя с именем 'nsp' в Dockerfile и устанавливаю образ для использования этим пользователем. Тем не менее, похоже, что рабочий каталог, когда я запускаю образ docker, не является домашним каталогом пользователя 'nsp', это каталог root.
[vagrant@nsp-v6 ~]$ docker run -it --entrypoint /bin/sh 2ab0208bd5f5
sh-4.4$ id
uid=1000(nsp) gid=1000(nsp)
sh-4.4$ pwd
/
sh-4.4$
Если возникает такая же ситуация когда spark-submit создает модуль из образа docker, то исполнитель пытается создать файл в своем рабочем каталоге '/', но не имеет разрешения, поскольку он не является пользователем root.
Действительно, я изменил точку входа. Сценарий sh изменил каталог перед запуском команды executor:
# Execute the container CMD under tini for better hygiene
cd ~
exec /sbin/tini -s -- "${CMD[@]}"
Выполнение теперь успешно.
Edit # 2
Похоже, я могу выполнить sh то же самое, используя директиву WORKDIR в Dockerfile.