Kit de développement Azure Data Lake Storage Gen2 pour Python
Système de fichiers hiérarchique pour les charges de travail d'analyse de mégadonnées.
Installation
pip install azure-storage-file-datalake azure-identity
Variables d'environnement
AZURE_STORAGE_ACCOUNT_URL=https://<account>.dfs.core.windows.net # Obligatoire pour toutes les méthodes d'authentification
AZURE_TOKEN_CREDENTIALS=prod # Obligatoire uniquement si DefaultAzureCredential est utilisé en production
Authentification
from azure.identity import DefaultAzureCredential, ManagedIdentityCredential
from azure.storage.filedatalake import DataLakeServiceClient
# Dev local : DefaultAzureCredential. Production : définir AZURE_TOKEN_CREDENTIALS=prod ou AZURE_TOKEN_CREDENTIALS=<specific_credential>
credential = DefaultAzureCredential(require_envvar=True)
# Ou utiliser une credential spécifique directement en production :
# Voir https://learn.microsoft.com/python/api/overview/azure/identity-readme?view=azure-python#credential-classes
# credential = ManagedIdentityCredential()
account_url = "https://<account>.dfs.core.windows.net"
service_client = DataLakeServiceClient(account_url=account_url, credential=credential)
Hiérarchie des clients
| Client | Objectif |
|---|---|
DataLakeServiceClient |
Opérations au niveau du compte |
FileSystemClient |
Opérations de conteneur (système de fichiers) |
DataLakeDirectoryClient |
Opérations sur les répertoires |
DataLakeFileClient |
Opérations sur les fichiers |
Opérations sur le système de fichiers
# Créer un système de fichiers (conteneur)
file_system_client = service_client.create_file_system("myfilesystem")
# Obtenir un système de fichiers existant
file_system_client = service_client.get_file_system_client("myfilesystem")
# Supprimer
service_client.delete_file_system("myfilesystem")
# Lister les systèmes de fichiers
for fs in service_client.list_file_systems():
print(fs.name)
Opérations sur les répertoires
file_system_client = service_client.get_file_system_client("myfilesystem")
# Créer un répertoire
directory_client = file_system_client.create_directory("mydir")
# Créer des répertoires imbriqués
directory_client = file_system_client.create_directory("path/to/nested/dir")
# Obtenir un client de répertoire
directory_client = file_system_client.get_directory_client("mydir")
# Supprimer un répertoire
directory_client.delete_directory()
# Renommer/déplacer un répertoire
directory_client.rename_directory(new_name="myfilesystem/newname")
Opérations sur les fichiers
Charger un fichier
# Obtenir un client de fichier
file_client = file_system_client.get_file_client("path/to/file.txt")
# Charger depuis un fichier local
with open("local-file.txt", "rb") as data:
file_client.upload_data(data, overwrite=True)
# Charger des octets
file_client.upload_data(b"Hello, Data Lake!", overwrite=True)
# Ajouter des données (pour les fichiers volumineux)
file_client.append_data(data=b"chunk1", offset=0, length=6)
file_client.append_data(data=b"chunk2", offset=6, length=6)
file_client.flush_data(12) # Valider les données
Télécharger un fichier
file_client = file_system_client.get_file_client("path/to/file.txt")
# Télécharger tout le contenu
download = file_client.download_file()
content = download.readall()
# Télécharger vers un fichier
with open("downloaded.txt", "wb") as f:
download = file_client.download_file()
download.readinto(f)
# Télécharger une plage
download = file_client.download_file(offset=0, length=100)
Supprimer un fichier
file_client.delete_file()
Lister les contenus
# Lister les chemins (fichiers et répertoires)
for path in file_system_client.get_paths():
print(f"{'DIR' if path.is_directory else 'FILE'}: {path.name}")
# Lister les chemins dans un répertoire
for path in file_system_client.get_paths(path="mydir"):
print(path.name)
# Listage récursif
for path in file_system_client.get_paths(path="mydir", recursive=True):
print(path.name)
Propriétés des fichiers/répertoires
# Obtenir les propriétés
properties = file_client.get_file_properties()
print(f"Size: {properties.size}")
print(f"Last modified: {properties.last_modified}")
# Définir les métadonnées
file_client.set_metadata(metadata={"processed": "true"})
Contrôle d'accès (ACL)
# Obtenir l'ACL
acl = directory_client.get_access_control()
print(f"Owner: {acl['owner']}")
print(f"Permissions: {acl['permissions']}")
# Définir l'ACL
directory_client.set_access_control(
owner="user-id",
permissions="rwxr-x---"
)
# Mettre à jour les entrées ACL
from azure.storage.filedatalake import AccessControlChangeResult
directory_client.update_access_control_recursive(
acl="user:user-id:rwx"
)
Client asynchrone
from azure.storage.filedatalake.aio import DataLakeServiceClient
from azure.identity.aio import DefaultAzureCredential
async def datalake_operations():
credential = DefaultAzureCredential()
async with DataLakeServiceClient(
account_url="https://<account>.dfs.core.windows.net",
credential=credential
) as service_client:
file_system_client = service_client.get_file_system_client("myfilesystem")
file_client = file_system_client.get_file_client("test.txt")
await file_client.upload_data(b"async content", overwrite=True)
download = await file_client.download_file()
content = await download.readall()
import asyncio
asyncio.run(datalake_operations())
Bonnes pratiques
- Utiliser l'espace de noms hiérarchique pour la sémantique du système de fichiers
- Utiliser
append_data+flush_datapour les chargements de fichiers volumineux - Définir les ACL au niveau du répertoire et les hériter pour les enfants
- Utiliser le client asynchrone pour les scénarios à haut débit
- Utiliser
get_pathsavecrecursive=Truepour le listage complet des répertoires - Définir des métadonnées pour les attributs de fichiers personnalisés
- Considérer l'API Blob pour les cas d'usage simples de stockage d'objets