Databricks : configurer le répertoire par défaut dataware

Par défaut lorsque l’on crée une table sans spécifier le paramètre location dans Databricks en SparkSQL, les fichiers de données sont stockée dans le DBFS interne du workspace Databricks configuré dans le metastore. On peut retrouver les fichiers de données dans le répertoire dbfs:/user/hive/warehouse/.

L’intérêt du répertoire par défaut géré par le metastore, c’est qu’il va automatiquement créer l’arborescence de dossiers/fichiers sur le stockage lorsque l’on crée une table et même gérer les partitions.

  • Table “normale” : dbfs:/user/hive/warehouse/<database_name>.db/<table_name>/
  • Table partitionnée : dbfs:/user/hive/warehouse/<database_name>.db/<table_name>/<partition_name>=<partition_key>/

Ce comportement est bien sûr un héritage du metastore Hive qui fonctionne de la même façon.

Or, ce n’est pas une bonne pratique de stocker de la données dans le DBFS interne car il n’est pas facilement accessible de l’extérieur ni compatible nativement avec d’autres technologie comme Azure Data Factory, Azure Stream Analytics ou Azure Function. Il vaut donc mieux utiliser à la place un autre stockage externe comme Azure Storage Blob ou Azure Data Lake Store. https://docs.azuredatabricks.net/user-guide/databricks-file-system.html#dbfs-root

On peut bien sûr spécifier le chemin de stockage de chaque table grâce à le mot clé LOCATION du CREATE TABLE, mais c’est un peu fastidieux et si l’on veut garder le fonctionnement automatique de création d’arborescence du metastore avec un stockage externe, il va falloir :

  1. Configurer les accès au stockage externe (blob ou adls)
  2. Changer la valeur de la configuration du répertoire par défaut spark.sql.warehouse.dir en mettant le chemin racine du stockage externe

Voici un exemple de config pour le blob storage :

spark.hadoop.fs.azure.account.key.<storageaccountname>.blob.core.windows.net <storagekey>
spark.sql.warehouse.dir wasb://<containeurname>@<storageaccountname>.blob.core.windows.net/<rep>

Cette configuration peut être directement paramétrée dans la config Spark d’un cluster :

ApplicationFrameHost_o4fxFwUZCY

Ainsi la configuration sera valable automatiquement pour tous les notebooks qui s’exécute sur le cluster et toutes les nouvelles tables créées dans une nouvelles database seront correctement stockées dans le bon stockage externe ici : wasb://<containeurname>@<storageaccountname>.blob.core.windows.net/<rep>/<database_name>.db/<table_name>/

Si la database existait déjà avant le changement de configuration vers le stockage externe, alors cela ne fonctionnera pas pour les nouvelles tables car elles continueront à utiliser le répertoire source de la base dbfs:/user/hive/warehouse/<database_name>.db/…

Voici un bout de code scala pour vérifier les locations des bases de données du metastore :

display(spark.catalog.listDatabases)

Et un bout de code SQL pour tester que cela fonctionne correctement :

create database if not exists testwasbdb;
create table if not exists testwasbdb.testtable (col1 int);
describe DETAIL testwasbdb.testtable;

chrome_sPO72pCORT

FADATA

Fabien Adato est Consultant Data et BI chez AZEO. Après avoir intégré la société CGI Business Consulting où il rejoint une équipe dédiée à la Business Intelligence, il fait ses premières armes sur la solution Microsoft SQL Server. Pendant plus de 4 ans, il acquiert des compétences techniques et fonctionnelles sur toute la chaîne de valeur de la BI (ETL, Base de Données, Cube Olap et Rapport). Il a pu se spécialiser également sur de nouvelles technologies de la Data et notamment Hadoop, Pig et Hive, ainsi que des technologies self-service BI, le No-SQL comme la base de données MongoDB et le moteur d’indexation ElasticSearch. Il entre chez AZEO en 2014 pour y assurer le poste de Consultant DATA / BI, autour des technologies Microsoft SQL Server, Power BI et Azure Cortana Intelligence.

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *