В этой статье поговорим о том, как сделать простой процесс загрузки данных с помощью Microsoft Azure Data Factory и Databricks в 2023/2024 году. Во второй части разберем миграцию init scripts из DBFS в Workspace в связи с новым обновлением от Databricks, если ее не сделать, то не удивляйтесь, что в конце 2023 года у вас начнут падать ADF pipelines и кластера в Databricks. 1 декабря 2023 г. Databricks отключит сценарии инициализации (init scripts) с именем кластера для всех рабочих областей. Этот тип сценария инициализации ранее считался устаревшим и не будет больше использоваться.
Azure Data Factory и Databricks
Во многих проектах, которые работают с данными и используют облачные технологии Microsoft Azure в Pipelines Azure Data Factory присутствует activity “Databricks Notebook”. С помощью нее запускается notebook в сервисе Azure Databricks, который выполняет вычислительные операции с данными. Для соединения этих двух сервисов конечно же используется Liked Service, где указаны параметры подключения.
Логику работы попробовал отобразить в схеме, в моем примере для соединения Azure Data Factory и Databrucks я использовал Managed Identity:
![](https://habrastorage.org/getpro/habr/upload_files/f45/946/b9f/f45946b9f4aae3541033741958cf1ed2.jpg)
Также мы знаем, что для вычислений в Databricks используется кластер, поэтому в настройках Linked Service нам нужно указать какой именно мы будем использовать:
New job cluster,
Existing interactive cluster,
Existing instance pool
Job cluster создается автоматически с указанными параметрами для одного конкретного запуска. Время ожидания запуска 3–5 минут. Все созданные ресурсы/узлы назначаются этому конкретному запуску. Кластер завершает работу, как только завершается выполнение блокнота, повторный запуск не возможен.
Interactive cluster создается заранее командой администраторов. Кластер запускается, когда в кластере запускается любой блокнот (это может быть специалист по данным или Azure Data Factory). Если кластер находится в автономном режиме, время загрузки составит 3–5 минут. Однако, если кластер уже запущен, выполнение начнется практически сразу.
Interactive cluster - это общий ресурс, все, что работает в кластере, использует ресурсы совместно со всеми остальными, кто работает в кластере. Можно настроить автоматическое выключение при простое, минимальное значение 10 минут, если администраторы не забыли ее настроить.
![](https://habrastorage.org/getpro/habr/upload_files/701/ec3/d27/701ec3d27782b9af0e647d2c086f36a3.jpg)
Как установить дополнительные библиотеки для кластера Databricks
Иногда для запуска кластера могут понадобиться дополнительные библиотеки. Устанавливать внутри каждого Notebook можно, но не очень удобно. Есть следующие способы:
1.) Global init scripts на уровне рабочей области. Это влияет на все кластеры в рабочей области, но может использоваться, если пользователь знает, как использовать глобальные сценарии инициализации (Databricks -> Admin Settings -> Global init scripts).
![](https://habrastorage.org/getpro/habr/upload_files/266/2af/7e5/2662af7e5f8fcdfb2b7dac57d2b204a7.png)
2.) Для Interactive cluster библиотеки устанавливаются на уровне кластера (Databricks -> Compute -> Name cluster - > Configuration -> Advanced option -> Init Scripts).
![](https://habrastorage.org/getpro/habr/upload_files/be2/6aa/b12/be26aab122a66aff0212a6b671b9d2a6.jpg)
3.) Для Job cluster существует несколько вариантов загрузки библиотек. Библиотеки могут быть перечислены на уровне отдельного конвейера. Это обеспечивает большую гибкость, но требует дополнительных усилий по включению списка библиотек в каждый конвейер. Они устанавливаются поверх библиотек, упомянутых в сценариях глобальных и связанных служб. Также можно указать init scripts в linked service при запуске из azure Data Factory. Таким образом, все Pipelines Azure Data Factory, которым нужны одни и те же библиотеки, могут вызывать одну и тот же linked service, если Notebook находятся в одной рабочей области.
![](https://habrastorage.org/getpro/habr/upload_files/e53/daf/cf7/e53dafcf77774aee67426aab1c3032a5.jpg)
С Existing interactive cluster проблемы бывают редко, так как они создаются в Databricks и там же можно проверить их работоспособность, но в реальных проектах чаще используются Job cluster, так как они завершаются сразу после выполнения Notebook.
Установка библиотек в Databricks в Linked service из Azure Data Factory
Вы можете столкнуться с устаревшими статьями, где описан процесс настройки init scripts с расположением в DBFS.
1.) Для начала у вас должен быть включены настройки для Workspace (Databricks -> Admin settings -> Workspace settings)
![](https://habrastorage.org/getpro/habr/upload_files/e17/fb4/32f/e17fb432f537d09a98208600a59c4f49.jpg)
2.) Вам нужно написать и загрузить ваш скрипт, к примеру test.sh в директорию Workspace. Внутри файл будет выглядеть примерно так:
#!/bin/bash
pip install msal
![](https://habrastorage.org/getpro/habr/upload_files/c50/f9b/43e/c50f9b43e80f70ec8fc92cd13a8bced6.png)
3.) Надеюсь, вы уже настроили соединение Data Factory и Databricks через Managed Identity (или другим способом) и добавили Application ID Data Factry в Service principals Databricks. Также нужно добавить ваш Data Factory в роль, которая имеет доступ к Workspace, в нашем примере это группа admins.
![](https://habrastorage.org/getpro/habr/upload_files/af9/ee3/bcb/af9ee3bcba9b3f07f403ba48aaa3e87f.png)
4.) Переходим в Linked Service Data Factory, чтобы указать настройки для подключения к Databricks и создания “New job cluster” (New linked service -> Compute -> Azure Databricks), именно здесь могут возникнуть трудности. Разберем один пример, с которым некоторые Data Engineers могут столкнуться в конце 2023 года.
![](https://habrastorage.org/getpro/habr/upload_files/f71/b4f/32c/f71b4f32c5045a6ea7bce6fc26933978.png)
В настройках Linked Service нужно указать ссылку на Init scripts в Databricks (пример: test.sh) которые будут запускаться при создании job cluster. Раньше все скрипты Databricks лежали в директории DBFS, но с 1 декабря 2023 их необходимо перенести в Workspace.
Казалось бы, все просто и логично, переносим, указываем путь, но при запуске возникает ошибка:
Databricks execution failed with error state: InternalError, error message: Unexpected failure while waiting for the cluster (0000-000000-00000) to be ready: Cluster 0000-000000-00000 is in unexpected state Terminated: INIT_SCRIPT_FAILURE(CLIENT_ERROR): instance_id:000000000000000000,databricks_error_message:Cluster scoped init script /Share/test.sh failed: Timed out with exception after 5 attempts (debugStr = 'Reading remote file for init script'), Caused by: java.io.FileNotFoundException: /123456789101012/Share/test.sh: No such file or directory.. For more details please check the run page url:
Если вы используете AutoResolveIntegrationRuntime, то данной ошибки у вас скорее всего не возникнет. Это был баг, который Microsoft уже исправила. Чтобы решить эту проблему, вам необходимо обновить версию Integration Runtime с типом Self-Hosted выше, чем 5.31.8570.1 в Azure Data Factory. В старых версиях вы указываете путь в Workspace, но при создании job cluster Databricks искал этот путь в DBFS.
![](https://habrastorage.org/getpro/habr/upload_files/893/8b3/227/8938b3227e75cbd21c11afaa4f516cdc.jpg)
После обновления IntegrationRuntime ваш job cluster будет успешно создан и Databricks Notebook будет успешно выполнен. Если включено автообновление, то IntegrationRuntime должен обновляться сам, но иногда служба подвисает и необходимо подключиться по RDP и сделать ее рестарт.