Рубрики
Без рубрики

Строительство Python SDK для баз данных Azurecricks

Эта статья о новом проекте, которое я начал работать в последнее время. Пожалуйста, приветствуйте Azure Datamricks SDK … Теги с лазурным, Python, Hacktoberfest, Databricks.

Эта статья о новом проекте, которое я начал работать в последнее время. Пожалуйста, добро пожаловать Azure Datamricks SDK Python Отказ Поскольку он сияет через имя 🦄, это высококачественный Python SDK для Azure PatableRicks Rest API 2.0.

Эта статья представит проект, текущий прогресс, план выпуска, некоторые выборы дизайна и в Final Dev Process/Tools.

Я провел несколько ночей, работающих и ищевших лучших практик для реализации этого SDK. Я убежден, что ему нужно больше моих скромных усилий, чтобы стать стабильным и пригодным для использования в производстве. Поэтому мои друзья, все вклады приветствуются! Не стесняйтесь добраться до меня, если вы хотите внести свой вклад в любые средства (документы, код, тестирование и т. Д.).

Мотивация

Я начну с моими собственными случаями использования:

  • Смешайте и совпадайте : При работе на конкурентной области вам придется справляться с новыми инструментами и платформами, высказанными из ниоткуда. Мне нравится простые средства для смешивания моих самых используемых инструментов с совершенно новыми. Использование API для интеграции напрямую является трудоемкость, который ведет в большинстве случаев, чтобы взломать и автоматизировать ошибку.

  • Держать развиваться : Обычно экосистема не интегрирует функции предварительного просмотра. Например, фабрика данных по-прежнему не включает в себя параметры Docker (DCS) при создании кластера в активности Databricks. Иногда вам нужно заставить обновление. SDK может быть очень полезен для создания пользовательских разъемов.

  • Пользовательские кирпичи : Вы хотите построить на вершине Azure DatableRicks: давайте представим, что у вас есть отличная идея, что вы должны прототип быть как можно быстрее, для запуска или халата. Если некоторые из его блоков могут быть сделаны по базам данных Azure, SDK поможет вам сделать это в кратчайшие сроки. Вы сможете подключить все в своем приложении или пакете (et Voilà!).

Я думаю, что это много, чтобы оправдать необходимость. Тем не менее, я вполне уверен, что должно быть дополнительные случаи использования. Я буду взволнован, чтобы услышать ваши в комментариях (на среднем).

Спецификация

Я хочу создать SDK со следующими функциями:

  • Очистить стандарт для доступа к API (например, через клиента).
  • Содержит пользовательские типы для результатов и запросов API.
  • Поддержка аутентификации токена личного доступа.
  • Поддержка аутентификации Azure AD.
  • Поддержка использования принципалей услуг Azure AD.
  • Позволяет вызовы API Free-Style с помощью режима силы (валидация типов обхода).
  • Обработка ошибок и поддержка прокси.

В двух словах он должен поддерживать все доступные методы аутентификации и управлять операциями на базе данных Azure через объекты типа. Он должен иметь простые методы для доступа к результатам (нет .get () ада), но также сохраняют возможность для вызовов API с бесплатным стилем.

Кстати, я посмотрел на другие испытания на этом. Некоторые проекты используют базовые пакеты из databricks-cli Что я думаю, является подлинной идеей. Для этого я хотел сделать это с нуля, но и потому, что он должен дать больше гибкости в будущем.

Демонстрационный прогресс

Эта часть содержит подробную информацию о текущем выпуске, демонстрации использования и планом выпуска.

Текущий релиз

Текущий релиз – v0.0.2. По состоянию на эту версию здесь является прогресс реализации:

  • ✔ Аутентификация
  • ✔ Пользовательские типы (25%)
  • ✔ обертки API (25%)
  • ✔ Обработка ошибок (80%)
  • ✗ Поддержка прокси (0%)
  • ✔ Документация (20%)

Следующие функции API теперь полностью реализованы и проверены:

  • ✔ Кластеры
  • ✔ Секреты
  • ✔ Токены

Использование демо

Вот демо из Гид QuickStart SDK :

Начать, импортируя клиенты. Клиент Класс от модуля SDK.

from azure_databricks_sdk_python import Client

Теперь вы можете создать экземпляр объекта клиента. Вам необходимо пройти экземпляр databricks (формат: adb – azuredatabricks.net) и ваш токен:

client = Client(databricks_instance=, personal_access_token=)

Вы можете создать новый кластер, используя следующее:

cluster = client.clusters.create(attributes)

атрибуты являются примером Типы. Кластеры. Клостерибуты Отказ Поэтому перед созданием кластера вам нужно создать, определите его атрибуты. Вот пример:

autoscale = AutoScale(min_workers=0, max_workers=1)
attributes = ClusterAttributes(cluster_name="my-cute-cluster", 
                                spark_version="7.2.x-scala2.12",
                                node_type_id="Standard_F4s", 
                                autoscale=autoscale)

Сейчас Создать вернет экземпляр Типы. Кластеры. ClusterInfo Отказ Вы можете получить доступ к своим свойствам через точечную цепочку, например:

cluster.cluster_id
>>>  '0918-220215-atria616'

План выпуска

План выпуска для следующих версий ( v0.0.3 и v0.0.4 ) будет следующим образом. Я буду сосредоточиться на v0.0.3 Отсюда вкладчики могут начать работать на v0.0.4 Если они заинтересованы.

  • v0.0.3 : Работа, группы.
  • v0.0.4 : DBFS, библиотеки, рабочие пространства.

Они должны быть освобождены через несколько недель от. Цель состоит в том, чтобы достичь первой стабильной версии V0.1.0 в этом году.

Варианты и дизайна

Эти варианты здесь должны помочь получить время для изменения и расширения. Я думаю, что лень является хорошим мотивом, хотя и неявно унизительным, это абстрактное для некоторых принципов программного обеспечения (например, повторное использование). Следует отметить, что расширение SDK проводится через две операции: изменение API или добавление метода аутентификации.

Составляя

Фундаментальная идея этого SDK состоит в том, чтобы иметь объект клиента в качестве основного интерфейса. Он инкапсулирует обертки API: E.I. Это означает, что вы можете назвать API кластеров через Client.clusters.create (...) .

Сначала я предполагал трехуровневую архитектуру:

  • Белый слой : Главный интерфейс, который обрабатывает конфигурацию и тезисы рассуждает вызовы на упаковках API (агрегация их).
  • Зеленый слой : API обертки. Кроме того, пакеты типа, которые включают модели для запросов и ответов с разных конечных точек.
  • Желтый слой : Общие помощники API, такие как функции, которые делают http Get и post-запросы, а также http-обработчики ошибок.

Чтобы проверить эту архитектуру, я задал два вопроса:

  • Что мне нужно изменить, если я добавлю новый метод аутентификации? : В этом случае мне нужно будет изменить класс клиента и класс API. Изменение может вести (закон Мерфи) к регрессии в SDK. Это ограничение можно расслабиться с честным количеством тестов. Тем не менее, это может привести (снова Мерфи снова), чтобы взломать OCP После того, как несколько версий накапливаются, потому что сохранение согласованности через версии с одним классом и реализациями укладки является одной из худших практик в разработке.

  • Что мне нужно изменить, если я добавлю новую обертку API? : В этом случае мне нужно слишком изменить класс клиента. Основная проблема здесь заключается в том, что класс клиента приобретает много обязанностей: конфигурация, агрегация обертков API и т. Д. Вы можете увидеть, что это ломает Сразу На этот раз (не понадобилось никаких Метфи).

Наконец, пришло время для решений: я старался изо всех сил. Тем не менее, большая рефакторинг и оценка необходимы для улучшения качества SDK. Если у вас есть идеи для улучшения текущего решения или иметь совершенно другой способ, которым может помочь в долгосрочной перспективе, пожалуйста, свяжитесь с нами.

Проектирование

Мне нравится lego®. Я также думаю, что Lego® делает хорошие метамодели для программирования. Lego® – мастер Сразу через его крошечные блоки. Вдохновленный, я пытался сформировать новое решение, отделяя обязанности в моих слоях.

Я начал, представляя эти изменения:

  • Белый слой : Главный интерфейс сейчас – это просто завод: то есть. Это создает у ребенка базец, которые теперь строят фиолетовый слой.

  • Фиолетовый слой : Он обрабатывает конфигурацию для каждого метода AUTH. Если я добавлю новый метод auth, существующие не затрагиваются. Агрегация с гибкорами API делегирована (через состав) до одного класса ответственности под названием Composer.

  • Зеленый слой : Green Playe API обертки все совокупные в классе композитора. Это освобождает пурпурные, чтобы обрабатывать только логику конфигурации.

  • Желтый слой : Желтый слой теперь разделен на заводский класс API и отдельные классы, которые обрабатывают общие и определенные операции HTTP, основанные на методе AUTH.

Что касается изменений, минимальные добавления теперь нужны для обычного использования в использовании. Кажется, это хорошо начать сейчас.

Реализация

Помимо абстрактных выборов дизайна, единственное, что я ненавижу больше всего в борьбе с сырыми API, это то, что я называю «.». () ад”. Набрав, это мощная концепция. При работе с API это помогает большое дело. Однако проблема является следующим. AZURE Databsricks API Структуры данных, как правило, являются деревьями основных типов. Вы можете найти до 3 или 4 слоев глубоко. Это делает работу по анаразбинию ввода и вывода, чтобы вернуться и принимать объекты пользовательских типов сложной задачей.

Вот два libs, которые сделали очень легко решить эту проблему:

  • привлекать : Пакет, который вернет радость классов письма, освободив вас от подразделения реализации объектных протоколов (методы aka dunder). Это было полезно в основном для аннотаций типа.

  • Cattrs Это библиотека Python с открытым исходным кодом для структурирования и неструктурирования данных. Cattrs работает лучше всего с классами Attrs и обычными коллекциями Python, но другие виды классов поддерживаются вручную регистрации конвертеров.

Давайте посмотрим на пример, который использует Attrs и Cattrs:

>>> from enum import unique, Enum
>>> from typing import List, Optional, Sequence, Union
>>> from cattr import structure, unstructure
>>> import attr
>>>
>>> @unique
... class CatBreed(Enum):
...     SIAMESE = "siamese"
...     MAINE_COON = "maine_coon"
...     SACRED_BIRMAN = "birman"
...
>>> @attr.s
... class Cat:
...     breed: CatBreed = attr.ib()
...     names: Sequence[str] = attr.ib()
...
>>> @attr.s
... class DogMicrochip:
...     chip_id = attr.ib()
...     time_chipped: float = attr.ib()
...
>>> @attr.s
... class Dog:
...     cuteness: int = attr.ib()
...     chip: Optional[DogMicrochip] = attr.ib()
...

Обратите внимание, что init Методы (и более) для @ attr.s автоматически генерируются автоматически. Теперь мы можем конвертировать в эти модели и из этих моделей, используя неструктурированные и структурные функции.

>>> p = unstructure([Dog(cuteness=1, chip=DogMicrochip(chip_id=1, time_chipped=10.0)),
...                  Cat(breed=CatBreed.MAINE_COON, names=('Fluffly', 'Fluffer'))])
...
>>> print(p)
[{'cuteness': 1, 'chip': {'chip_id': 1, 'time_chipped': 10.0}}, {'breed': 'maine_coon', 'names': ('Fluffly', 'Fluffer')}]
>>> print(structure(p, List[Union[Dog, Cat]]))
[Dog(cuteness=1, chip=DogMicrochip(chip_id=1, time_chipped=10.0)), Cat(breed=, names=['Fluffly', 'Fluffer'])]

Как видите, это помогает передать с низкого уровня представления на структурированные данные и наоборот. Я использовал Cattrs для обработки ввода и ответов. Я также использовал Attr к моделированию всех типов из API, и наша реализация кажется очень чистыми по сравнению с официальными API, которые борются за выполнение его чистого и читаемого способа ( Проверьте это и сравните его к этому ).

Мой процесс/инструменты

Процесс CICD для льмина, тестирования, публикация использования пакета Действия GitHub Отказ

Развитие

Начнем с предварительного просмотра рабочего процесса здания:

name: Unit Tests
on:
  push:
    branches: [ master ]
    paths:
      - "azure_databricks_sdk_python/**.py"
      - "tests/**.py"
      - ".github/workflows/**.yml"
      - ".coveragerc"
      - "requirements.txt"
      - "requirements-tests.txt"

jobs:
  coverage:
    runs-on: ubuntu-latest

    steps:
      - uses: actions/checkout@v2

      - name: Set up Python
        uses: actions/setup-python@v2
        with:
          python-version: 3.8.2

      - name: Install dependencies
        run: |
          python -m pip install --upgrade pip
          pip install coveralls coverage
          if [ -f requirements.txt ]; then pip install -r requirements.txt; fi
          if [ -f requirements-test.txt ]; then pip install -r requirements-test.txt; fi
      - name: Run Test Suite
        env:
          DATABRICKS_INSTANCE: ${{ secrets.DATABRICKS_INSTANCE }}
          PERSONAL_ACCESS_TOKEN: ${{ secrets.PERSONAL_ACCESS_TOKEN }}
          DATABRICKS_INSTANCE_PREMIUM: ${{ secrets.DATABRICKS_INSTANCE_PREMIUM }}
          PERSONAL_ACCESS_TOKEN_PREMIUM: ${{ secrets.PERSONAL_ACCESS_TOKEN_PREMIUM }}
        run: |
          pytest --cov azure_databricks_sdk_python --junitxml=junit/test-results.xml tests/
      - name: Send Results to Coveralls
        env:
          DATABRICKS_INSTANCE: ${{ secrets.DATABRICKS_INSTANCE }}
          PERSONAL_ACCESS_TOKEN: ${{ secrets.PERSONAL_ACCESS_TOKEN }}
          DATABRICKS_INSTANCE_PREMIUM: ${{ secrets.DATABRICKS_INSTANCE_PREMIUM }}
          PERSONAL_ACCESS_TOKEN_PREMIUM: ${{ secrets.PERSONAL_ACCESS_TOKEN_PREMIUM }}
          COVERALLS_REPO_TOKEN: ${{ secrets.COVERALLS_REPO_TOKEN }}
        run: |
          coveralls

Я использовал pteest и Комбинезоны для двух шагов. Предоставляются переменные ENV для моих фактурных рабочих пространств Databricks Databricks, а значения агрегируются от Github repo секреты .

Я также включал рабочий процесс для автоматического публикации пакета при выполнении выпуска:

name: Publish to PyPI

on:
  release:
    types: [created]

jobs:
  deploy:

    runs-on: ubuntu-latest

    steps:
    - uses: actions/checkout@v2
    - name: Set up Python
      uses: actions/setup-python@v2
      with:
        python-version: '3.x'
    - name: Install dependencies
      run: |
        python -m pip install --upgrade pip
        pip install setuptools wheel twine pbr
    - name: Build and publish
      env:
        TWINE_USERNAME: ${{ secrets.TWINE_USERNAME }}
        TWINE_PASSWORD: ${{ secrets.TWINE_PASSWORD }}
        TWINE_NON_INTERACTIVE: true 
      run: |
        python setup.py sdist bdist_wheel
        twine upload dist/*

Использует шпагат опубликовать пакет.

Документация

Я использовал Сфинкс с некоторыми расширениями и readthedocs.org Отказ

Этот скринкаст от Махди Юсуф поможет вам начать, если вы хотите внести свой вклад в документы: https://www.youtube-nocookie.com/embed/oJsUvBQyHBs

Ресурсы

Пожалуйста, дайте мне знать, что вы думаете, и вы можете идти в ногу с проектом через:

Первоначально опубликовано в kaabachi.io.

Оригинал: “https://dev.to/aminekaabachi/building-a-python-sdk-for-azure-databricks-53o5”