Fermer

mars 10, 2024

Développement piloté par les tests avec Databricks (1 sur 2) / Blogs / Perficient

Développement piloté par les tests avec Databricks (1 sur 2) / Blogs / Perficient


je n’aime pas tester Briques de données cahiers et c’est un problème. J’aime les Databricks. J’aime le développement piloté par les tests. Pas dans un contexte évangélique ; Couverture du code à 100 % ou échec. Je trouve simplement qu’une quantité raisonnable de couverture de code me donne une confiance raisonnable. Databricks a Documentation pour les tests unitaires. j’ai essayé de tester un ordinateur portable en utilisant un autre ordinateur portable. Puis j’ai réalisé que j’aimais aussi CI/CD. J’écris du code depuis des décennies et il n’y a que quelques bonnes pratiques que je considère comme fondamentales. Séparer les fonctions et les tests des ordinateurs portables semblait être un terrain familier. En fin de compte, j’ai passé plus de temps que prévu pour lancer un processus de travail. J’ai résolu certains problèmes (première partie). J’ai travaillé sur certains problèmes (deuxième partie). Au moment où j’ai eu fini, j’en avais oublié la moitié, alors j’ai décidé de le rassembler dans un article de blog que je sais qu’au moins je lirai.

Projet

Il s’agissait d’un projet inhabituellement simple. Ce sont d’excellents candidats pour obtenir ces détails correctement, car il n’y a pas de problèmes typiques spécifiques au client qui ne se reproduiraient pas. En fait, le client n’avait accès qu’à Databricks ; le service informatique contrôlait le cloud sous-jacent. Ils avaient juste besoin d’extraire les données JSON de certaines API à des fins d’analyse. J’ai créé un bloc-notes avec des widgets fournissant quelques paramètres de base tels que la date de début et de fin et certains termes de recherche. Il existe des scripts Python que j’appelle à partir du bloc-notes qui font le gros du travail, comme appeler l’API, valider la demande et la réponse et conserver les données dans des tables delta. Il existe également des utilitaires Python tels que des exceptions personnalisées et un mécanisme de journalisation qui conserve les informations dans une autre table delta. L’idée est que les notebooks sont orientés client et que les fichiers python sont les cibles du test.

Outils

Je vais être précis en décrivant comment j’ai configuré les choses. Ce n’est pas parce que c’est la meilleure solution ; J’essaie juste d’être très clair. J’utilise un Mac et j’utilise beaucoup le terminal. j’utilise Databricks sur Azurespécifiquement Databricks version 14.3 LTS. J’ai pris la décision consciente de ne rien faire de spécifique à Azure car je souhaite me concentrer sur Databricks. Nous travaillons localement avec Databricks, alors téléchargez le CLI Databricks. Vous devrez demander un directeur de service depuis votre compte ou l’administrateur de votre espace de travail. Je vais m’en tenir à Python ; alors assurez-vous que Python 3.x est disponible sur votre machine. Vous voudrez vous assurer que vous pouvez intégrer certains packages, comme pyspark, databricks_cli, couverture, etc. J’utilise Nuage Bitbucket pour mon contrôle de code source conforme à Git et mon pipeline CI/CD. j’utilise Code de Visual Studio comme mon IDE. Mon objectif est de pouvoir travailler avec VS Code à plein temps lorsque je travaille avec Databricks. (alerte spoiler : je n’y arrive pas vraiment.)

Défis VS Code

Vous devriez évoquer le Documentation Databricks pour les outils de développement pendant que vous configurez votre propre environnement. Ils sont très bons. Plus précisément, commencez par les instructions pour Code VS. Vous installerez le Extension Databricks et Connexion aux Databricks. Suivre ces instructions vous mènera loin et je ne vois pas la nécessité de répéter ce qui a été si bien expliqué. Cependant, ils ne mentionnent pas quelques points sensibles.

Vous devez utiliser l’édition Premium plutôt que l’édition Standard pour obtenir toutes les fonctionnalités dont je parle. À tout le moins, vous ne pouvez pas utiliser un jeton d’accès personnel comme mécanisme d’authentification. La question est discutée un peu ici: mais je ne le vois pas beaucoup mentionné autrement. J’utilise une instance d’entreprise avec Unity Catalog, ce n’était donc pas un problème. Cependant, essayer simplement la version gratuite ne fonctionnera probablement pas de bout en bout.

L’interface utilisateur Databricks pour Python ne prend pas en charge le peluchage. Nous avions déjà commencé à coder avant que je décide que ce serait une bonne idée. Le code était stocké dans un dépôt dans Databricks et ce dépôt était connecté à Bitbucket. Databricks a instructions pour cela, mais les instructions semblaient confuses et c’était plus facile de le faire. Cela a fonctionné comme prévu. Ce à quoi je ne m’attendais pas, ce sont tous les problèmes de peluchage que j’ai constatés lorsque j’ai accédé à VS Code. Ma vie est devenue beaucoup plus facile lorsque j’ai mis à jour le fichier settings.json dans l’espace de travail .vscode pour l’inclure "files.trimTrailingWhitespace": true. Les scripts Python étaient assez faciles à gérer car ils étaient tous essentiellement des problèmes de peluchage que je n’avais tout simplement pas pris en compte parce que l’EDI ne me l’avait pas dit. Les cahiers, c’était une autre histoire.

Défis des ordinateurs portables

Intelligence des données - L'avenir du Big Data
L’avenir du Big Data

Avec quelques conseils, vous pouvez créer une plateforme de données adaptée aux besoins de votre organisation et tirer le meilleur parti de votre capital de données.

Obtenez le guide

La première chose que vous remarquez lorsque vous externalisez des fonctions de votre bloc-notes vers un autre fichier est que Databricks ne pensait vraiment pas que vous alliez faire cela. Lorsque vous ouvrez un bloc-notes, cela suppose que vous allez exécuter du code dans ce bloc-notes. L’opération d’importation n’a lieu qu’une fois par session. Donc, si vous importez à partir d’un fichier python, recherchez un problème et modifiez le fichier python, vous voyez toujours le problème. Recharger le portable est un véritable casse-tête. C’est un joli petit extrait de code à avoir sous la main ; retirez-le simplement avant de passer en production.

import importlib
import your_module  # replace 'your_module' with the actual name of your module

# Reload the module
importlib.reload(your_module)

J’ai dit aux data scientists d’essayer Databricks car ils font déjà partie de la famille des notebooks Jupyter, j’ai donc été surpris de voir qu’ils ont juste une extension .py et une ligne en haut qui dit # Databricks notebook source. Il m’a également fallu un certain temps pour remarquer que sous chaque cellule se trouvent de minuscules petits boutons contenant uniquement du texte indiquant Exécuter la cellule, Exécuter au-dessus et Déboguer la cellule. Et oui, vous pouvez déboguer un notebook à partir de VS Code lorsque vous êtes connecté à un cluster en cours d’exécution à l’aide de l’extension Databricks et que Databricks Connect est activé au bas de VS Code. J’ai tout de suite débogué du code sur le serveur et c’était honnêtement vraiment cool. Je me suis senti bien pendant près de cinq minutes.

La plupart des problèmes liés aux ordinateurs portables n’étaient que des avertissements de peluchage. Ils apparaissent dans la vue Problèmes, mais ce ne sont pas toujours des problèmes ; principalement des cercles bleus qui disent Line too long dans mes cellules de démarque. Je ne les réparerai jamais. Mais il y avait Undefined variable 'dbutils' les erreurs sont partout et elles nécessitent une attention particulière. Il s’avère que tout le code de mon widget utilise dbutils.widgets ce qui fonctionne très bien dans Databricks mais pas localement. Il ne semblait pas y avoir beaucoup de solutions faciles à mettre en œuvre, mais j’ai finalement décidé d’inclure simplement une importation avec un commentaire : from databricks.sdk.runtime import dbutils # use when working in VS Code. Maintenant, j’ai quelques points à garder à l’esprit avant de passer en production. Je pourrais probablement écrire un hook de pré-commit, mais je préfère ne pas le faire. (Mais je devrai probablement le faire à un moment donné.)

À ce stade, j’ai un IDE qui m’aide à écrire du code meilleur, ou du moins plus pythonique. L’intégration BitBucket fonctionne sans problème. Je peux faire tourner mon cluster depuis ma machine locale. Je peux déboguer le code de mon instance locale vers le serveur. J’ai dû ajouter une ligne qui n’est utilisée que sur ma machine locale et j’ai une cellule jetable que j’utilise lorsque je travaille avec un ordinateur portable dans l’interface utilisateur de Databricks. Je ne vais pas aborder les problèmes de peluchage dans les cellules de démarque, car sur cette voie se trouve la folie. Et je débogue localement sur le serveur. Il ne me reste plus qu’à commencer à exécuter quelques tests. Ce n’est pas grave ; Je clique simplement sur l’explorateur de tests et….

Défis des tests

Les tests étaient le but de tout cet exercice. Je pensais qu’une fois que j’aurais récupéré mon code python de Databricks dans VS Code via un dépôt git, je commencerais simplement à tester. Exécuter des tests Python dans VS Code n’est pas difficile. Avec le recul, ce n’est pas difficile. La première étape n’est pas propre à Databricks ; donnez simplement à l’explorateur de tests un interpréteur Python sur lequel s’exécuter, indiquez-lui où trouver le test dans la structure de répertoires et indiquez-lui le modèle de la convention de dénomination des fichiers de test. Honnêtement, il faut plus de temps pour lire cette phrase que pour exécuter le processus. Mais aucun test n’est apparu et il a continué à demander des détails de configuration. Très bien, je vais simplement le faire à partir de la ligne de commande. Il suffit de courir ./.venv/bin/python -m unittest discover -v -s /my_project/test -p *_test.py du terminal et tout va bien. Ou non. Peu importe. je vais juste éditer .vscode/settings.json directement. Mais ça ressemblait déjà à ça :

"python.testing.unittestArgs": [
    "-v",
    "-s",
    "./my_project/test",
    "-p",
    "*_test.py"
],
"python.testing.pytestEnabled": false,
"python.testing.unittestEnabled": true

Redémarrez VS Code. Rien. Vérifiez le chemin et les autorisations. Rien. Cherchez à nouveau une virgule manquante ou quelque chose du genre. Rien. Demandez-moi pourquoi cela ne fonctionne-t-il pas comme les autres projets Python ?

Parce que j’ai commencé à coder dans Databricks.

J’en ajoute tranquillement du vide __init__.py des fichiers comme je l’aurais fait, c’était juste un projet python normal. Les tests apparaissent. J’essaie de faire les tests. Erreur d’importation relative. Ajouter vide __init__.py fichiers dans tous les répertoires. Exécutez des tests. Tout vert. Tout bon. La fin …………

Ou est-ce?

Conclusion

Connectez-vous au prochain article dans lequel nous expliquons pourquoi vous devez capturer Py4JJavaError si vous voulez comprendre pourquoi un morceau de code qui fonctionne sur votre ordinateur local peut échouer lorsque vous l’exécutez sur le serveur.






Source link