70 azure # 206 Retour d'expérience : MySQL vers Azure SQL Database, via Azure Data Factory Azure Data Factory est un service Cloud de traitement de données structurées ou non structurées provenant de sources de données variées. ADF, son surnom, permet de traiter des données en entrée et de les déverser dans un stockage en sortie. Généralement en BigData, ce service se limite à effectuer une copie en « quasi-un pour un » des données. Nous verrons pourtant que cela n’est pas forcément aussi simple qu’il n’y paraît. Loris Andaloro, Expert Data senior chez VISEO Ihor Leontiev, Architecte Azure, MVP Azure chez VISEO ous parlons de « quasi-un pour un », car il y a forcément quelques transtypages à effectuer pour passer d'une base de données à une autre. D’un point de vue théorique on est face à un ETL (Extract Transform Load), logiciel bien connu dans le monde de la Business Intelligence, mais pas seulement. En pratique, nous utilisons cet outil en mode ELT (Extract Load Transform) car on est ici dans le cadre du Cloud et du BigData : on ne veut pas modifier les données lors de l’import (« ingestion »), mais les enregistrer brutes dans un Data Lake. Et si on a à les modifier (« Transform ») et analyser (« Analyse »), ce sera ultérieurement, et potentiellement dans quelques années (Fig 1). Ci-contre les principaux concepts d’Azure Data Factory (Fig 2). Dans une instance Data Factory, vous créez un ou plusieurs pipelines de données. Un pipeline constitue un groupe d’activités qui définit les actions à effectuer. Par exemple, vous pouvez utiliser une « activité de copie » pour copier des données d’une banque de données vers une autre. De même, vous pouvez utiliser une « activité Hive » qui exécute une requête Hive sur un cluster Azure HDInsight afin de convertir ou d’analyser vos données. ADF prend en charge deux types d’activités : déplacement des données et transformation des données. Les dataset sont des jeux de données qui peuvent être consommés ou produits par les activités. Enfin chaque exécution d’une activité produit ce que l’on appelle un data slice. D'une part, nous allons voir comment nous avons mis en place une extraction de table depuis MySQL (On Premise) vers une base de données Azure SQL Database (Fig 3). Et d'autre part, nous allons évoquer les difficultés, qui commencent par de nombreuses incompatibilités entre les Vincent Thavonekham, Responsable Stratégie Azure, MVP Azure chez VISEO N programmez! - avril 2017 1 2 3 types de données, ainsi que ce qui concerne la planification des traitements. Tout d'abord, il faut instancier ADF (Fig 4) et déployer la Gateway sur le réseau local comme précisé dans la documentation donnée en référence à la fin. Ensuite, nous pouvons configurer le déplacement des données en cli- azure 71 # 206 quant sur « Copier des données » afin de créer notre premier pipeline. Une nouvelle page s’ouvre sur une procédure pas à pas de création de pipeline (Fig 5). Attention, cet outil est encore en version beta, alors que la solution ADF est en version release. Commencez par nommer le pipeline. (Fig 5) Puis renseigner la source de données MySQL, parmi de nombreuses autres options comme Amazon Redshift/S3, Azure Blob Storage/SQL Datawarehouse, Cassandra, MongoDB, … (Fig 6, Fig 7) Et choisir la table source dans l’étape « Source », onglet « EXISTING TABLES » (Fig 8) Ensuite, la base de données de destination (liste non exhaustive, Fig 9) Indiquer enfin la table de destination (Fig 10) Les premiers soucis se présentent (Fig 11) ; certains types de données semblent ne pas être supportés, empêchant donc la création du pipeline. 7 4 8 5 9 10 6 programmez! - avril 2017 72 azure # 206 L'astuce consiste à revenir à l’étape « Source » onglet « USE QUERY » (Fig 12). Cela permet l'utilisation d'une requête avec des CAST au lieu de la table (nous verrons que cela n’est pas suffisant non plus lié à un autre point bloquant). Voici un exemple de requête à utiliser : SELECT CAST(champ1 AS NVARCHAR) AS champ1, CAST(champ2 AS Signed Integer) AS champ2, champ3, IF(champ4>= '1900/01/01', champ4, NULL) AS champ4 FROM table Avec des CAST convenables sur les champs problématiques, il devient possible de mapper toutes les colonnes sans erreurs. J’ai recensé les principales équivalences entre les types MySQL et SQL Server, ainsi que les opérations à effectuer au niveau de la requête SELECT. Types MySQL bigint blob char(X) date datetime decimal double enum float int longblob longtext mediumtext set smallint text time timestamp tinyint varchar(X) 11 Type SQL Server recommandé bigint varbinary(max) nchar(X) date datetime decimal float nvarchar(max) float int or bigint Opération à effectuer IF(xxxx >= '1900/01/01', xxxx, NULL) as xxxx, IF(xxxx >= '1900/01/01', xxxx, NULL) as xxxx, CAST(xxxx AS VARCHAR) Dépend du flag UNSIGNED MySQL : CAST (xxxx AS SIGNED BIGINT) ou CAST(xxxx AS SIGNED INT) varbinary(max) nvarchar(max) nvarchar(max) nvarchar(max) CAST(xxxx AS NVARCHAR) smallint or int Dépend du flag UNSIGNED MySQL : CAST (xxxx AS SIGNED INT) ou CAST(xxxx AS SIGNED SMALLINT) nvarchar(max) time smalldatetime tinyint Dépend du flag UNSIGNED MySQL : CAST or smallint (xxxx AS SIGNED SMALLINT) ou CAST(xxxx AS SIGNED TINYINT) nvarchar(X) ADF s’améliorant rapidement, ces règles évoluent également très vite également. Au fil des mois, nous constatons qu’il devient de plus en plus simple d’importer les données MySQL ; donc moins de hack de conversions et cela fonctionne sans problèmes (Fig 13). Nous poursuivons avec l’assistant de configuration jusqu’au déploiement du pipeline, sans encombre ; cela génère un fichier JSON dans le menu Créer et déployer. C’est la définition du pipeline que nous venons de mettre en place. Aussi, grâce au Cloud Explorer intégré à Visual Studio vous pouvez récupérer votre pipeline et l’éditer au format JSON. Pour cela il faut naviguer dans l’arborescence jusqu’à votre instance ADF puis effectuer un clic droit et choisir le menu Export to New Data Factory Project (Fig 14). 12 13 14 programmez! - avril 2017 azure 73 # 206 Il n’est en effet pas possible, pour le moment, de revenir à l’assistant Web « Copy Activity » des écrans précédents pour éditer le pipeline. Le dernier problème bloquant de cet assistant est que nous avions plusieurs milliers de « schema mappings » à mettre en œuvre. Impossible donc de passer plusieurs jours à faire des clics dans le navigateur. D’autant que nos nombreuses tentatives désespérées mettaient systématiquement le JavaScript du navigateur sur les rotules (quel que soit le navigateur). Nous avons eu à développer un programme C# ayant la capacité de détecter les tables source et générer ces fichiers JSON à partir d’une base source. Autres possibilités de ADF : Orchestration, planification et monitoring La planification de l’heure de lancement du traitement se fait avec le paramètre offset. A ce jour, une astuce peu documentée que Microsoft Corp nous a suggérée pour choisir l’heure précise, consiste à configurer le paramètre start avec systématiquement une valeur à minuit (ci-dessous 2017-02-21T00:00:00Z). Sinon le pipeline ne fonctionnera pas. "policy": { "timeout": "1.00:00:00", "concurrency": 1, "executionPriorityOrder": "NewestFirst", "style": "StartOfInterval", "retry": 3, "longRetry": 0, "longRetryInterval": "00:00:00" }, "scheduler": { "frequency": "Hour", "interval": 24, "offset": "03:00:00" }, "name": "Activity-0-_Custom query_->[dbo]_[xxxxxxxxx]" ], "start": "2017-02-21T00:00:00Z", "end": "9999-09-09T00:00:00Z", "isPaused": false, "pipelineMode": "Scheduled" La partie Monitoring d’ADF est très importante et correspond à un de ses gros points forts, et obligatoire pour faire du « Data Lineage » et ainsi auditer les données et les nombreux traitements quotidiens. Pour y accéder, cliquer l’icône « Surveiller et gérer » (Fig 4), et cela ouvre une nouvelle fenêtre. Autant dire que nous avons passé des journées entières les yeux rivés sur les différents pipelines qui s’exécutent, avec des Logs détaillés. CONCLUSION La documentation officielle de Microsoft, ainsi de que nombreuses recherches, ont bien aidé à avancer et nous sommes actuellement en production avec ADF. Bien que nous ayons réduit le périmètre de ce retour d’expérience à l’unique brique ADF (afin que cela soit aisément compréhensible), cette brique qui semble rapide et simple à appréhender peut se révéler bien plus compliquée qu’il n’y paraît. Dans notre cas, au-delà de ces petites subtilités, j'avoue que sans l'aide de l'équipe produit de Microsoft Corp qui développe ADF, nous n'aurions pas réussi la mise en production ; depuis, cela fonctionne comme un charme au quotidien ! • Références Introduction ADF : https://docs.microsoft.com/fr-fr/azure/data-factory/data-factory-introduction Format JSON d’ADF : https://docs.microsoft.com/en-us/azure/data-factory/data-factory-introduction Configurer ADF Gateway sur le réseau local : https://docs.microsoft.com/fr-fr/azure/data-factory/data-factory-move-data-between-onpremand-cloud POUR ALLER PLUS LOIN Nous avons vu dans cet article un aperçu de l’utilisation d’ADF. Il est légitime de se demander pourquoi faire autant d’efforts ? alors qu’un ETL comme SSIS est déjà présent sur le marché depuis des années. Au-delà du fait que SSIS ne soit pas « scalable », ADF va permettre d’adresser des scénarii Big Data inaccessibles jusqu’à présent. Dans le schéma, un élément frappant est d’une part la répartition des zones de stockage, où cela diffère des traditionnels BI avec un “Staging area”, un “Operational Data Store” et un “Datawarehouse” remplies et vidées quotidiennement. D’autre part, ADF gère une grande variété des sources de données : les bases de données métier de l’entreprise, le CRM, l’ERP, mais aussi les réseaux sociaux, les services Open Data, l’Internet des objets (IoT), etc… Enfin ADF travaille sur une fréquence des traitements et une puissance de calculs bien supérieur: les données sont importées, puis transformés plusieurs fois ; tantôt en (near-)temps réel (ex IoT), tantôt en batch (ex. calcul d’indicateurs récurrents chaque soir, ou analyse de sentiments Twitter/Facebook durant le lancement d’un produit). Afin de répondre aux enjeux actuels de la Data et d’analyses orientées données, Microsoft investit de manière importante dans tous les outils Data, et en particulier sur cet outil, véritable chef d’orchestre de la Data au sein du système d’information dématérialisé de l’ « entreprise 2.0 » et de l’« Industrie 4.0 » ! programmez! - avril 2017