Tutoriel : Azure Data Lake Storage Gen2, Azure Databricks et Spark

Ce tutoriel vous montre comment connecter un cluster Azure Databricks aux données contenues dans un compte de stockage Azure compatible avec Azure Data Lake Storage Gen2. Cette connexion vous permet d’exécuter en mode natif des requêtes et analyses sur des données à partir de votre cluster.

Ce didacticiel présente les procédures suivantes :

  • Ingérer des données non structurées dans un compte de stockage
  • Exécuter une analytique sur vos données dans le stockage Blob

Si vous n’avez pas d’abonnement Azure, créez un compte gratuit avant de commencer.

Prérequis

Créer un espace de travail, un cluster et un notebook Azure Databricks

  1. Créer un espace de travail Azure Databricks. Consultez Créer un espace de travail Azure Databricks.

  2. Créer un cluster. Voir Créez un cluster.

  3. Créez un bloc-notes. Consultez Création d’un notebook. Choisissez Python comme langage par défaut du notebook.

Laissez votre notebook ouvert. Vous l’utiliserez dans les sections suivantes.

Téléchargement des données de vol

Ce tutoriel utilise des données de vol sur la ponctualité en janvier 2016 issues du Bureau des statistiques de transport afin de montrer comment effectuer une opération ETL. Vous devez télécharger ces données pour suivre ce tutoriel.

  1. Téléchargez le fichier On_Time_Reporting_Carrier_On_Time_Performance_1987_present_2016_1.zip. Ce fichier contient les données de vol.

  2. Décompressez le contenu du fichier compressé et notez le nom du fichier et son chemin. Vous aurez besoin de ces informations lors d’une étape ultérieure.

Si vous souhaitez en savoir plus sur les informations capturées dans les données de performances des rapports de ponctualité, vous pouvez consulter les descriptions de champ sur le site web du Bureau des statistiques de transport.

Ingérer des données

Dans cette section, vous chargez les données de vol .csv dans votre compte Azure Data Lake Storage Gen2, puis montez le compte de stockage dans votre cluster Databricks. Enfin, vous utilisez Databricks pour lire les données de vol .csv et les réécrire dans le stockage au format Apache Parquet.

Charger les données de vol dans votre compte de stockage

Utilisez AzCopy pour copier votre fichier .csv dans votre compte Azure Data Lake Storage Gen2. Vous utilisez la commande azcopy make pour créer un conteneur dans votre compte de stockage. Ensuite, vous utilisez la commande azcopy copy pour copier les données csv que vous venez de télécharger dans un répertoire de ce conteneur.

Dans les étapes suivantes, vous devez entrer des noms pour le conteneur que vous souhaitez créer, ainsi que le répertoire et le blob vers lequel vous souhaitez charger les données de vol dans le conteneur. Vous pouvez utiliser les noms suggérés à chaque étape ou spécifier vos propres noms en respectant les conventions d’affectation de noms des conteneurs, répertoires et blobs.

  1. Ouvrez une fenêtre d’invite de commandes et entrez la commande suivante pour vous connecter à Azure Active Directory et accéder à votre compte de stockage.

    azcopy login
    

    Suivez les instructions qui apparaissent dans la fenêtre d’invite de commandes pour authentifier votre compte d’utilisateur.

  2. Pour créer un conteneur dans votre compte de stockage et stocker les données de vol, entrez la commande suivante :

    azcopy make  "https://<storage-account-name>.dfs.core.windows.net/<container-name>" 
    
    • Remplacez la valeur d’espace réservé <storage-account-name> par le nom de votre compte de stockage.

    • Remplacez l’espace réservé <container-name> par un nom pour le conteneur que vous souhaitez créer pour stocker les données csv ; par exemple, flight-data-container.

  3. Pour charger (copier) les données csv dans votre compte de stockage, entrez la commande suivante.

    azcopy copy "<csv-folder-path>" https://<storage-account-name>.dfs.core.windows.net/<container-name>/<directory-name>/On_Time.csv
    
    • Remplacez la valeur d’espace réservé <csv-folder-path> par le chemin du fichier .csv.

    • Remplacez la valeur d’espace réservé <storage-account-name> par le nom de votre compte de stockage.

    • Remplacez l’espace réservé <container-name> par le nom du conteneur dans votre compte de stockage.

    • Remplacez l’espace réservé <directory-name> par le nom d’un répertoire pour stocker vos données dans le conteneur ; par exemple, jan2016.

Monter votre compte de stockage dans votre cluster Databricks

Dans cette section, vous montez votre stockage d’objets cloud Azure Data Lake Storage Gen2 dans le système de fichiers Databricks (DBFS). Vous utilisez le principal de service Azure AD que vous avez créé précédemment pour une authentification avec le compte de stockage. Pour plus d’informations, consultez Montage de stockage d’objets cloud sur Azure Databricks.

  1. Attachez votre notebook à votre cluster.

    1. Dans le notebook que vous avez créé précédemment, sélectionnez le bouton Se connecter dans le coin supérieur droit de la barre d’outils du notebook. Ce bouton ouvre le sélecteur de calcul. (Si vous avez déjà connecté votre notebook à un cluster, le nom de ce cluster est affiché dans le texte du bouton plutôt que Se connecter).

    2. Dans le menu déroulant du cluster, sélectionnez le cluster précédemment créé.

    3. Notez que le texte du sélecteur de cluster passe à démarrage. Attendez que le cluster termine le démarrage et que le nom du cluster apparaisse dans le bouton avant de continuer.

  2. Copiez et collez le bloc de code suivant dans la première cellule, mais n’exécutez pas ce code pour l’instant.

    configs = {"fs.azure.account.auth.type": "OAuth",
           "fs.azure.account.oauth.provider.type": "org.apache.hadoop.fs.azurebfs.oauth2.ClientCredsTokenProvider",
           "fs.azure.account.oauth2.client.id": "<appId>",
           "fs.azure.account.oauth2.client.secret": "<clientSecret>",
           "fs.azure.account.oauth2.client.endpoint": "https://login.microsoftonline.com/<tenantId>/oauth2/token",
           "fs.azure.createRemoteFileSystemDuringInitialization": "true"}
    
    dbutils.fs.mount(
    source = "abfss://<container-name>@<storage-account-name>.dfs.core.windows.net/<directory-name>",
    mount_point = "/mnt/flightdata",
    extra_configs = configs)
    
  3. Dans ce bloc de code :

    • Dans configs, remplacez les valeurs d’espace réservé <appId>, <clientSecret>et <tenantId> par l’ID d’application, la clé secrète client et l’ID de locataire que vous avez copiés lors de la création du principal de service dans les prérequis.

    • Dans l’URI source, remplacez les valeurs d’espace réservé <storage-account-name>, <container-name>et <directory-name> par le nom de votre compte de stockage Azure Data Lake Storage Gen2 et le nom du conteneur et du répertoire que vous avez spécifiés lorsque vous avez chargé les données de vol dans le compte de stockage.

      Remarque

      L’identificateur de schéma dans l’URI, abfss, indique à Databricks d’utiliser le pilote d’Azure Blob File System avec le protocole TLS (Transport Layer Security). Pour en savoir plus sur l’URI, consultez Utiliser l’URI Azure Data Lake Storage Gen2.

  4. Assurez-vous que votre cluster a terminé de démarrer avant de continuer.

  5. Appuyez sur les touches Maj +Entrée pour exécuter le code de ce bloc.

Le conteneur et le répertoire où vous avez chargé les données de vol dans votre compte de stockage sont désormais accessibles dans votre notebook via le point de montage, /mnt/flightdata.

Utiliser Databricks Notebook pour convertir CSV en Parquet

Maintenant que les données de vol csv sont accessibles via un point de montage DBFS, vous pouvez utiliser un DataFrame Apache Spark pour les charger dans votre espace de travail et les réécrire au format Apache Parquet dans votre stockage d’objets Azure Data Lake Storage Gen2.

  • Un DataFrame Spark est une structure de données étiquetée à deux dimensions avec des colonnes de types potentiellement différents. Vous pouvez utiliser un DataFrame pour lire et écrire facilement des données dans différents formats pris en charge. Avec un DataFrame, vous pouvez charger des données à partir du stockage d’objets cloud et les analyser et les transformer dans votre cluster de calcul sans affecter les données sous-jacentes dans le stockage d’objets cloud. Pour en savoir plus, consultez Utiliser des DataFrames PySpark sur Azure Databricks.

  • Apache Parquet est un format de fichier en colonnes avec des optimisations qui accélèrent les requêtes. Il s’agit d’un format de fichier beaucoup plus efficace que CSV ou JSON. Pour en savoir plus, consultez Fichiers Parquet.

Dans le notebook, ajoutez une nouvelle cellule et collez-y le code suivant.

# Use the previously established DBFS mount point to read the data.
# Create a DataFrame to read the csv data.
# The header option specifies that the first row of data should be used as the DataFrame column names
# The inferschema option specifies that the column data types should be inferred from the data in the file
flight_df = spark.read.format('csv').options(
    header='true', inferschema='true').load("/mnt/flightdata/*.csv")

# Read the airline csv file and write the output to parquet format for easy query.
flight_df.write.mode("append").parquet("/mnt/flightdata/parquet/flights")
print("Done")

Appuyez sur les touches Maj +Entrée pour exécuter le code de ce bloc.

Avant de passer à la section suivante, assurez-vous que toutes les données parquet ont été écrites et que « Terminé » apparaît dans la sortie.

Explorer des données

Dans cette section, vous utilisez l’utilitaire de système de fichiers Databricks pour explorer votre stockage d’objets Azure Data Lake Storage Gen2 à l’aide du point de montage DBFS que vous avez créé dans la section précédente.

Dans une nouvelle cellule, collez le code suivant pour obtenir une liste des fichiers au point de montage. La première commande génère une liste de fichiers et de répertoires. La deuxième commande affiche la sortie au format tabulaire pour faciliter la lecture.

dbutils.fs.ls("/mnt/flightdata")
display(dbutils.fs.ls("/mnt/flightdata"))

Appuyez sur les touches Maj +Entrée pour exécuter le code de ce bloc.

Notez que le répertoire parquet apparaît dans la liste. Vous avez enregistré les données de vol .csv au format parquet dans le répertoire parquet/flight dans la section précédente. Pour répertorier les fichiers dans le répertoire parquet/flight, collez le code suivant dans une nouvelle cellule et exécutez-le :

display(dbutils.fs.ls("/mnt/flightdata/parquet/flights"))

Pour créer un fichier et le répertorier, collez le code suivant dans une nouvelle cellule et exécutez-le :

dbutils.fs.put("/mnt/flightdata/mydirectory/mysubdirectory/1.txt", "Hello, World!", True)
display(dbutils.fs.ls("/mnt/flightdata/mydirectory/mysubdirectory"))

N’ayant pas besoin du fichier 1.txt dans ce tutoriel, vous pouvez coller le code suivant dans une cellule et l’exécuter pour supprimer de manière récursive mydirectory. Le paramètre True indique une suppression récursive.

dbutils.fs.rm("/mnt/flightdata/mydirectory", True)

À des fins de commodité, vous pouvez utiliser la commande d’aide pour en savoir plus sur d’autres commandes.

dbutils.fs.help("rm")

Avec ces exemples de code, vous avez exploré la nature hiérarchique de HDFS à l’aide de données stockées dans un compte de stockage sur lequel Azure Data Lake Storage Gen2 est activé.

Interroger les données

Vous pouvez ensuite commencer à interroger les données que vous avez chargées dans votre compte de stockage. Entrez chacun des blocs de code suivants dans une nouvelle cellule et appuyez sur MAJ + ENTRÉE pour exécuter le script Python.

Les DataFrames offrent un ensemble complet de fonctions (sélectionner des colonnes, filtrer, joindre, agréger) qui vous permettent de résoudre efficacement les problèmes courants d’analyse de données.

Pour charger un DataFrame à partir de vos données de vol parquet précédemment enregistrées et explorer certaines des fonctionnalités prises en charge, entrez ce script dans une nouvelle cellule et exécutez-le.

# Read the existing parquet file for the flights database that was created earlier
flight_df = spark.read.parquet("/mnt/flightdata/parquet/flights")

# Print the schema of the dataframe
flight_df.printSchema()

# Print the flight database size
print("Number of flights in the database: ", flight_df.count())

# Show the first 25 rows (20 is the default)
# To show the first n rows, run: df.show(n)
# The second parameter indicates that column lengths shouldn't be truncated (default is 20 characters)
flight_df.show(25, False)

# You can also use the DataFrame to run simple queries. Results are returned in a DataFrame.
# Show the first 25 rows of the results of a query that returns selected colums for all flights originating from airports in Texas
flight_df.select("FlightDate", "Reporting_Airline", "Flight_Number_Reporting_Airline", "OriginCityName", "DepTime", "DestCityName", "ArrTime", "ArrDelay").filter("OriginState = 'TX'").show(258, False)

# Use display to run visualizations
# Preferably run this in a separate cmd cell
display(flight_df)

Entrez ce script dans une nouvelle cellule pour exécuter des requêtes d’analyse de base sur les données. Vous pouvez choisir d’exécuter l’intégralité du script (MAJ + ENTRÉE), de mettre en surbrillance chaque requête et l’exécuter séparément avec CTRL + MAJ + ENTRÉE, ou d’entrer chaque requête dans une cellule distincte et l’exécuter.

# create a temporary sql view for querying flight information
flight_data = spark.read.parquet('/mnt/flightdata/parquet/flights')
flight_data.createOrReplaceTempView('FlightTable')

# Print the total number of flights in Jan 2016 (the number of rows in the flight data).
print("Number of flights in Jan 2016: ", flight_data.count())

# Using spark sql, query the parquet file to return the total flights of each airline
num_flights_by_airline=spark.sql("SELECT Reporting_Airline, count(*) AS NumFlights FROM FlightTable GROUP BY Reporting_Airline ORDER BY NumFlights DESC")
num_flights_by_airline.show()

# List out all the airports in Texas
airports_in_texas = spark.sql(
    "SELECT DISTINCT(OriginCityName) FROM FlightTable WHERE OriginStateName = 'Texas'")
print('Airports in Texas: ', airports_in_texas.count())
airports_in_texas.show(100, False)

# Find all airlines that fly from Texas
airlines_flying_from_texas = spark.sql(
    "SELECT DISTINCT(Reporting_Airline) FROM FlightTable WHERE OriginStateName='Texas'")
print('Airlines that fly to/from Texas: ', airlines_flying_from_texas.count())
airlines_flying_from_texas.show(100, False)

# List airlines by average arrival delay (negative values indicate early flights)
avg_arrival_delay=spark.sql(
    "SELECT Reporting_Airline, count(*) AS NumFlights, avg(DepDelay) AS AverageDepDelay, avg(ArrDelay) AS AverageArrDelay FROM FlightTable GROUP BY Reporting_Airline ORDER BY AverageArrDelay DESC")
print("Airlines by average arrival delay")
avg_arrival_delay.show()

# List airlines by the highest percentage of delayed flights. A delayed flight is one with a  departure or arrival delay that is greater than 15 minutes
spark.sql("DROP VIEW IF EXISTS totalFlights")
spark.sql("DROP VIEW IF EXISTS delayedFlights")
spark.sql(
    "CREATE TEMPORARY VIEW totalFlights AS SELECT Reporting_Airline, count(*) AS NumFlights FROM FlightTable GROUP BY Reporting_Airline")
spark.sql(
    "CREATE TEMPORARY VIEW delayedFlights AS SELECT Reporting_Airline, count(*) AS NumDelayedFlights FROM FlightTable WHERE DepDelay>15 or ArrDelay>15 GROUP BY Reporting_Airline")
percent_delayed_flights=spark.sql(
    "SELECT totalFlights.Reporting_Airline, totalFlights.NumFlights, delayedFlights.NumDelayedFlights, delayedFlights.NumDelayedFlights/totalFlights.NumFlights*100 AS PercentFlightsDelayed FROM totalFlights INNER JOIN delayedFlights ON totalFlights.Reporting_Airline = delayedFlights.Reporting_Airline ORDER BY PercentFlightsDelayed DESC")
print("Airlines by percentage of flights delayed")
percent_delayed_flights.show()

Résumé

Dans ce tutoriel, vous allez :

  • Créé des ressources Azure, notamment un compte de stockage Azure Data Lake Storage Gen2 et un principal de service Azure AD, et attribué des autorisations pour accéder au compte de stockage.

  • Créé un espace de travail, un notebook et un cluster de calcul Azure Databricks.

  • Utilisé AzCopy pour charger des données de vol .csv non structurées dans le compte de stockage Azure Data Lake Storage Gen2.

  • Utilisé les fonctions utilitaires du système de fichiers Databricks pour monter votre compte de stockage Azure Data Lake Storage Gen2 et explorer son système de fichiers hiérarchique.

  • Utilisé des DataFrames Apache Spark pour transformer vos données de vol .csv au format Apache Parquet et les stocker dans votre compte de stockage Azure Data Lake Storage Gen2.

  • Avez utilisé des DataFrames pour explorer les données de vol et effectuer une requête simple.

  • Utilisé Apache Spark SQL pour interroger les données de vol sur le nombre total de vols de chaque compagnie aérienne en janvier 2016, les aéroports du Texas, les compagnies aériennes proposant des vols à partir du Texas, le retard moyen des arrivées en minutes pour chaque compagnie aérienne à l’échelle nationale et le pourcentage des vols de chaque compagnie aérienne dont les départs ou les arrivées ont été retardés.

Nettoyer les ressources

Si vous souhaitez conserver le notebook et y revenir ultérieurement, il est judicieux d’arrêter votre cluster pour éviter des frais. Pour arrêter votre cluster, sélectionnez-le dans le sélecteur de calcul situé en haut à droite de la barre d’outils du notebook, sélectionnez Arrêter dans le menu, puis confirmez votre sélection. (Par défaut, le cluster s’arrêtera automatiquement après 120 minutes d’inactivité.)

Si vous souhaitez supprimer des ressources d’espace de travail individuelles telles que des notebooks et des clusters, vous pouvez le faire à partir de la barre latérale gauche de l’espace de travail. Pour obtenir des instructions détaillées, consultez Supprimer un cluster ou Supprimer un notebook.

Lorsque vous n’en avez plus besoin, supprimez le groupe de ressources et toutes les ressources associées. Pour ce faire, dans le portail Azure, sélectionnez le groupe de ressources du compte de stockage et de l’espace de travail, puis sélectionnez Supprimer.

Étapes suivantes