Utiliser l’API Files avec des volumes Unity Catalog
Utilisez l’API Files pour lire, écrire, répertorier et supprimer des fichiers et des répertoires par chemin. Cela fonctionne avec des fichiers dans des volumes Unity Catalog, auxquels vous faites référence par leur chemin de volume absolu, tel que /Volumes/<catalog>/<schema>/<volume>/<path>. Les requêtes de l’API Files 3.0 utilisent le préfixe d’endpoint /api/3.0/fs et sont envoyées au hostname régional de votre workspace. Pour chaque opération, parameter et en-tête, consultez la référence de l’API Files 3.0.
L’utilisation de l’API Files peut entraîner des frais de transfert de données Databricks.
Envoyer des requêtes à l’hostname régional
Bêta
Cette fonctionnalité est en Bêta. Pour l’utiliser, un administrateur de workspace doit activer Files API V3 with Large File Upload Support depuis la page Previews . Consultez Gérer les aperçus Databricks.
Envoyez les demandes de l’API Files 3.0 à l’hostname régional du workspace auquel appartient l’utilisateur qui fait la demande. Le hostname régional a le format suivant :
<workspace-id>.storage.<workspace-region>.<databricks-domain>
Par exemple, 1234567890123456.storage.us-west-2.cloud.databricks.com.
Pour trouver votre ID de workspace et votre région, utilisez la console de compte. Voir Noms d'instance, URL et ID de workspace. Vous pouvez également trouver l’ID de workspace dans l’URL de déploiement : dans https://<databricks-instance>/?o=1234567890123456, le nombre après o= est l’ID de workspace. L'interface utilisateur du workspace indique la région sous le nom du workspace.
Configurer la connectivité réseau
Bêta
Cette fonctionnalité est en Bêta. Pour l’utiliser, un administrateur de workspace doit activer Files API V3 with Large File Upload Support depuis la page Previews . Consultez Gérer les aperçus Databricks.
Files API 3.0 nécessite une connectivité réseau de votre réseau vers Databricks et de Databricks vers votre stockage.
Depuis votre réseau vers Databricks
Si vous autorisez l’accès internet public à votre workspace mais que vous le restreignez avec un pare-feu, ajoutez les plages d’adresses IP du plan de contrôle de votre région à la liste d’autorisation.
Incluez les IP sous Default storage, OpenSharing SecureConnect, Zerobus Ingestion et Lakebase Autoscaling. Voir Adresses IP entrantes.
Si vous n’autorisez pas l’accès à Internet vers Databricks et que vous vous connectez via un Link privé frontal, créez un second Link privé frontal pour les services exigeants en termes de performances. Voir Configurer PrivateLink entrant pour les services exigeants en termes de performances.
De Databricks vers votre stockage
Si vous autorisez l’accès public à votre stockage, mais que vous appliquez des restrictions réseau pour le stockage intra-région, ajoutez le Databricks serverless OrgPath à la liste d’autorisation. Sinon, ajoutez les adresses IP sortantes Databricks à la liste d’autorisation.
Si vous n’autorisez pas l’accès public à votre stockage, créez un Link privé vers Amazon S3. Voir Configurer la connectivité privée vers des ressources gérées par AWS.
La facturation du réseau serverless s’applique. Voir Comprendre les coûts réseau de Databricks.
Upload de fichiers volumineux avec l’upload multipart
Bêta
Cette fonctionnalité est en Bêta. Pour l’utiliser, un administrateur de workspace doit activer Files API V3 with Large File Upload Support depuis la page Previews . Consultez Gérer les aperçus Databricks.
Une seule demande d’upload accepte des fichiers jusqu’à 5000 MiB. Pour upload un fichier plus volumineux ou un fichier dont la taille est inconnue au start de l’upload, utilisez l’upload multipart : vous upload le fichier en plusieurs parties et Databricks les assemble en un seul fichier.
Les numéros de partie vont de 1 à 10 000. Toutes les parties sauf la dernière doivent être d’au moins 5 Mio, et chaque partie peut être d’au plus 4000 Mio. Databricks assemble les parties dans l’ordre croissant des numéros de partie. Pour chaque parameter, consultez Upload un fichier et Effectuer une action sur un fichier.
Exemple d’upload en plusieurs parties
L’exemple suivant effectue l’upload d’un fichier en deux parties.
Pour start la session d’upload, lancez l’upload. La réponse contient le upload_id qui identifie la session :
POST /api/3.0/fs/files/Volumes/c/s/v/file?action=initiate-upload
200 OK
Content-Type: application/json
{
"upload_id": "dvOR6FE39mNb"
}
Pour upload la première partie, envoyez son contenu avec le upload_id et part_number. La réponse inclut le ETag de la partie :
PUT /api/3.0/fs/files/Volumes/c/s/v/file?upload_id=dvOR6FE39mNb&part_number=1
Content-Length: 268435456
Content-Type: application/octet-stream
<binary data>
200 OK
ETag: "33a64df551425fcc55e4d42a148795d9f25f89d4"
Pour upload la seconde partie, répétez la demande avec le part_number suivant :
PUT /api/3.0/fs/files/Volumes/c/s/v/file?upload_id=dvOR6FE39mNb&part_number=2
Content-Length: 268435456
Content-Type: application/octet-stream
<binary data>
200 OK
ETag: "954fb694be262821177cfbc47f9d4a0aa06c349b"
Pour finir, complétez l’upload avec un corps qui liste chaque partie et son ETag stocké :
POST /api/3.0/fs/files/Volumes/c/s/v/file?action=complete-upload&upload_id=dvOR6FE39mNb
Content-Type: application/json
{
"parts": [
{ "part_number": 1, "etag": "\"33a64df551425fcc55e4d42a148795d9f25f89d4\"" },
{ "part_number": 2, "etag": "\"954fb694be262821177cfbc47f9d4a0aa06c349b\"" }
]
}
200 OK
ETag: "b3f1c2a94d6e7085f2a1c0b9e8d7654321fedcba"
Le ETag dans cette réponse appartient à l’ensemble du fichier assemblé, et non à une partie. Vous pouvez l’utiliser dans des requêtes conditionnelles ultérieures, par exemple pour écraser le fichier uniquement s’il n’a pas été modifié depuis son upload.
Pour annuler l’upload au lieu de le terminer, envoyez l’action abort-upload avec upload_id:
POST /api/3.0/fs/files/Volumes/c/s/v/file?action=abort-upload&upload_id=dvOR6FE39mNb
200 OK
Download des fichiers volumineux avec des requêtes de plage
Utilisez des requêtes de plage pour download un fichier volumineux en plusieurs requêtes plus petites, ou pour reprendre un download interrompu.
Demander une plage
Envoyez l’en-tête Range avec les positions basées sur zéro du premier et du dernier octet souhaités. La plage inclut les deux positions. Par exemple, bytes=0-1048575 demande les 1 Mio de données d’un fichier de 10 Mio :
GET /api/3.0/fs/files/Volumes/main/default/my-volume/large-file.bin
Range: bytes=0-1048575
206 Partial Content
Accept-Ranges: bytes
Content-Range: bytes 0-1048575/10485760
Content-Length: 1048576
ETag: "33a64df551425fcc55e4d42a148795d9f25f89d4"
<binary data>
La réponse 206 Partial Content ne contient que les octets demandés, et Content-Range indique les octets qu’elle contient et la taille totale du fichier. Pour lire jusqu’à la fin du fichier, omettez la dernière position, comme dans bytes=1048576-. Si la dernière position est située après la fin du fichier, la réponse contient les octets jusqu’à la fin. Pour toute autre syntaxe Range, consultez Download d’un fichier.
Une demande HEAD avec un en-tête Range retourne le même statut et les mêmes en-têtes que la demande GET correspondante, sans le corps.
Reprendre un download interrompu
Pour reprendre un download, demandez les octets restants avec une plage qui start au premier octet que vous n’avez pas reçu. Envoyez également If-Match avec le ETag de votre première réponse, pour ne pas combiner les octets de deux versions du fichier :
GET /api/3.0/fs/files/Volumes/main/default/my-volume/large-file.bin
Range: bytes=1048576-
If-Match: "33a64df551425fcc55e4d42a148795d9f25f89d4"
206 Partial Content
Accept-Ranges: bytes
Content-Range: bytes 1048576-10485759/10485760
Content-Length: 9437184
<binary data>
Si le fichier a changé, le serveur retourne 412 Precondition Failed, et vous devez start le download à nouveau.
Utiliser des requêtes conditionnelles
Bêta
Cette fonctionnalité est en Bêta. Pour l’utiliser, un administrateur de workspace doit activer Files API V3 with Large File Upload Support depuis la page Previews . Consultez Gérer les aperçus Databricks.
Une requête conditionnelle n’a d’effet que si le fichier est dans l’état attendu. Utilisez des requêtes conditionnelles pour éviter les download répétés, empêcher les rédacteurs simultanés d’écraser les modifications des autres et créer ou supprimer des fichiers en toute sécurité. Files API 3.0 prend en charge les quatre en-têtes conditionnels HTTP standard de RFC 9110:
En-tête | Compare avec | Honoré le |
|---|---|---|
| Le fichier | Lit, écrit et supprime |
| Le fichier | Lit et écrit |
| La date | Lit uniquement |
| La date | Lit uniquement |
Quand la condition n’est pas remplie, le serveur n’effectue pas l’opération et retourne l’un des statuts suivants :
304 Not Modified, lorsqu’une requêteGETouHEADavecIf-None-MatchouIf-Modified-Sinceéchoue. Votre copie en cache est toujours valide.412 Precondition Failed, lorsque toute autre condition échoue.
Validateurs : ETag et Last-Modified
Les en-têtes conditionnels comparent une valeur que vous fournissez avec l’un des validateurs du fichier. L’API Files retourne les deux validateurs comme en-têtes de réponse sur GET et HEAD:
ETag: un identifiant opaque pour le contenu du fichier, également renvoyé surPUTet la réponse multipartcomplete-upload. Stockez-le exactement tel qu’il est renvoyé, y compris les guillemets environnants, et ne l’analysez pas et ne le construisez pas.Last-Modified: la dernière heure de modification du fichier, en tant qu’ HTTP-date. Sa précision est d’une seconde, ainsiIf-Modified-SinceetIf-Unmodified-Sincene peuvent pas détecter plusieurs changements dans la même seconde. Pour le contrôle de concurrence, utilisezETagavecIf-MatchouIf-None-Match.
Lectures conditionnelles
La lecture conditionnelle la plus courante est la revalidation du cache. Envoyez If-None-Match avec le ETag de votre copie mise en cache, ou If-Modified-Since avec l’heure à laquelle vous l’avez récupérée pour la dernière fois. Si le fichier n’est pas modifié, le serveur renvoie 304 Not Modified sans corps. Dans le cas contraire, il renvoie 200 OK avec le nouveau contenu :
GET /api/3.0/fs/files/Volumes/main/default/reports/report.csv
If-None-Match: "33a64df551425fcc55e4d42a148795d9f25f89d4"
304 Not Modified
If-Match et If-Unmodified-Since fonctionnent dans l’autre sens : le serveur retourne le fichier uniquement s’il n’a pas changé, et autrement retourne 412. Une lecture peut inclure au plus deux en-têtes conditionnels, et leur priorité suit RFC 9110.
Écritures conditionnelles
Sur PUT, utilisez If-None-Match et If-Match pour éviter d’écraser des modifications que vous n’avez pas vues, ce qu’on appelle également le problème de mise à jour perdue:
If-None-Match: *upload le fichier uniquement si aucun fichier n’existe au chemin d’accès. Sinon, la requête renvoie412 Precondition Failed.If-Match: <etag>upload le fichier uniquement si sonETagactuel correspond à celui que vous fournissez. Sinon, la requête renvoie412 Precondition Failedou404si aucun fichier n’existe au chemin spécifié.
Pour créer un fichier uniquement s’il n’existe pas déjà, envoyez If-None-Match: *:
PUT /api/3.0/fs/files/Volumes/main/default/reports/report.csv
If-None-Match: *
Content-Type: application/octet-stream
<binary data>
200 OK
Pour remplacer un fichier uniquement s’il s’agit encore de la version que vous avez récupérée en dernier, envoyez son ETag avec If-Match:
PUT /api/3.0/fs/files/Volumes/main/default/reports/report.csv
If-Match: "33a64df551425fcc55e4d42a148795d9f25f89d4"
Content-Type: application/octet-stream
<binary data>
200 OK
Pour un multipart upload, envoyez l’en-tête conditionnel lors de l’appel initiate-upload. L’API Files l’évalue une fois l’upload terminé, la condition s’applique donc au fichier assemblé. Pour les formulaires d’en-tête pris en charge par chaque appel, consultez Upload un fichier et Effectuer une action sur un fichier.
Suppressions conditionnelles
Un DELETE simple réussit même si le fichier n’existe pas, il ne peut donc pas vous dire si vous avez supprimé la version prévue. Pour rendre une suppression conditionnelle, envoyez If-Match:
If-Match: <etag>supprime le fichier uniquement si sonETagactuel correspond à celui que vous fournissez. Si quelqu’un a modifié le fichier après que vous l’avez récupéré, la demande retourne412 Precondition Failed. Si le fichier n’existe plus, elle retourne404.If-Match: *supprime le fichier uniquement s’il existe et renvoie404si ce n’est pas le cas.
DELETE /api/3.0/fs/files/Volumes/main/default/reports/report.csv
If-Match: "33a64df551425fcc55e4d42a148795d9f25f89d4"
204 No Content
Versions de l’API Files
Files API 2.0 envoie des requêtes à votre hostname de workspace avec le préfixe d’endpoint /api/2.0/fs. Elle ne prend pas en charge l’upload partitionné et son seul en-tête conditionnel est If-Unmodified-Since sur les download. Voir la référence de Files API 2.0.
Pour migrer du code de l’API Files 2.0 vers 3.0, effectuez les modifications suivantes :
- Envoyez des requêtes au hostname régional avec le préfixe d’endpoint
/api/3.0/fs, et configurez la connectivité réseau. - Envoyez l’en-tête
Content-Lengthlors de chaque upload. Si vous ne connaissez pas la taille du fichier à l’avance, utilisez multipart upload. - Attendez-vous à
200 OKau lieu de204 No Contentpour un upload réussi. - Attendez-vous à
204 No Content, pas404 Not Found, quand vous supprimez un fichier qui n’existe pas. Voir Suppressions conditionnelles.