У меня есть python_wheel_task в одном из моих заданий пакета ресурсов, который выполняет файл whl, который создается из моего локального репозитория, из которого я развертываю пакет. Этот процесс прекрасно работает сам по себе.
Однако мне нужно добавить собственный файл whl зависимостей (еще один репозиторий, упакованный и опубликованный в моем канале артефактов Azure) к задаче в качестве библиотеки, чтобы файл whl моего локального репозитория работал полностью.
Я попытался определить это следующим образом:
- task_key: some_task
job_cluster_key: job_cluster
python_wheel_task:
package_name: my_local_package_name
entry_point: my_entrypoint
named_parameters: { "env": "dev" }
libraries:
- pypi:
package: custom_package==1.0.1
repo: https://pkgs.dev.azure.com/<company>/<some-id>/_packaging/<feed-name>/pypi/simple/
- whl: ../../dist/*.whl # my local repo's whl: being built as part of the asset-bundle
Когда я развертываю и запускаю пакет, я получаю следующую ошибку в кластере заданий:
24/07/12 07:49:01 ERROR Utils:
Process List(/bin/su, libraries, -c, bash /local_disk0/.ephemeral_nfs/cluster_libraries/python/python_start_clusterwide.sh
/local_disk0/.ephemeral_nfs/cluster_libraries/python/bin/pip install 'custom_package==3.0.1'
--index-url https://pkgs.dev.azure.com/<company>/<some-id>/_packaging/<feed-name>/pypi/simple/
--disable-pip-version-check) exited with code 1, and Looking in indexes:
https://pkgs.dev.azure.com/<company>/<some-id>/_packaging/<feed-name>/pypi/simple/
24/07/12 07:49:01 INFO SharedDriverContext: Failed to attach library
python-pypi;custom_package;;3.0.1;https://pkgs.dev.azure.com/<company>/<some-id>/_packaging/<feed-name>/pypi/simple/
to Spark
Полагаю, мне нужно где-то настроить личный токен доступа/аутентификацию для канала, но я не могу найти в документации Databricks ничего о зависимостях библиотеки . Есть только одно предложение о добавлении пользовательского индекса и ничего об аутентификации.
Как я могу заставить это работать?
Лучшее решение для существующих универсальных кластеров
Мне удалось использовать комбинацию существующего кластера, переменной среды кластера и сценария инициализации, чтобы настроить кластер для аутентификации по пользовательскому индексу PyPI:
Я сохранил PAT Azure DevOps в своем KeyVault.
Я создал секретную область в Databricks для этого KeyVault.
Я загрузил/импортировал скрипт инициализации в Databricks в Workspace/Shared/init-scripts/set-private-artifact-feed.sh
Я создал универсальный кластер и установил его в configuration
-> Advanced options
:
Переменная среды: PYPI_TOKEN = {{secrets/<my-scope>/<secret-name-of-devops-pat>}}
Сценарии инициализации: введите Workspace
, путь к файлу /Shared/init-scripts/set-private-artifact-feed.sh
.
Содержание set-private-artifact-feed.sh
:
#!/bin/bash
if [[ $PYPI_TOKEN ]]; then
use $PYPI_TOKEN
fi
echo $PYPI_TOKEN
printf "[global]\n" > /etc/pip.conf
printf "extra-index-url =\n" >> /etc/pip.conf
printf "\thttps://[email protected]/<company>/<some-id>/_packaging/<feed-name>/pypi/simple/\n" >> /etc/pip.conf
После перезапуска кластера я смог запустить свою задачу, как я определил изначально, теперь аутентификация по индексу работает. Подробнее в этой средней статье .
Обратите внимание, что это не работает с кластером заданий, если вы не передадите ссылку на сценарий инициализации и не установите переменную среды! Для меня более разумным является использование универсального кластера.
Хакерское решение для кластеров заданий
Мы можем добавить токен PYPI в URL-адрес репо. Мне не удалось правильно настроить сценарии инициализации/env-переменные для кластеров заданий, чтобы они работали в противном случае.
- pypi:
package: pyspark-framework==4.0.0
repo: https://<YOUR-TOKEN-HERE>@pkgs.dev.azure.com/<company>/<some-id>/_packaging/<feed-name>/pypi/simple/
- whl: ../dist/*.whl
Это хакерское решение представляет собой серьезную угрозу безопасности: токен будет отображаться в виде обычного текста в рабочей области блоков данных, чтобы все могли его увидеть!