Big Data : Analyses des logs Wikipédia avec HDInsight

Suite aux derniers évènements durant lesquels j’ai présenté notre solution HDInsight, j’ai eu beaucoup de demande concernant ma démonstration. Cet article détail pas à pas toutes les étapes pour refaire l’analyse des logs en partant de zéro.   

HDInsight est la solution Microsoft pour faire du Big Data dans le Cloud Azure. C’est une distribution Hadoop aussi bien dans le Cloud Azure que sur Windows server (Horthonworks),  vous permettent de traiter des pétaoctets de données structurées et/ou non structurées.

Dans cet article nous allons voir comment créer un cluster HdInsight, puis nous allons l’utiliser pour réaliser une analyse des logs Wikipédia, disponibles librement sur le site suivant :  https://dumps.wikimedia.org/other/pagecounts-raw/. L’origine de cette démonstration se trouve sur le blog de Thomas Conté qui a écrit un article alors que HDInsight était encore en “preview” (Merci Thomas Sourire).

 

Pré-requis

Pour réaliser cette démonstration, il vous faut un abonnement Azure. Si vous n’avez pas d’abonnement Azure, il est possible d’ouvrir un compte d’évaluation depuis ce lien : https://azure.microsoft.com/fr-fr/pricing/free-trial/

 

Création du cluster

Connectez-vous à votre portail Azure et cliquez sur le bouton “Nouveau”.

Sélectionnez “Services de données”, “HDInsight”, “Hadoop”. Renseignez les informations demandées, dont la taille de du cluster.

(En passant par “création personnalisée”, plus  d’option sont disponibles)

image

 

La création du cluster prend environ 15 minutes.

 

Utilisation du cluster

Une fois le cluster créé, il devient accessible depuis le portail Azure. Sur la partie gauche du portail, cliqué sur “HDINSIGHT”.

Cliquez ensuite sur le nom de votre cluster. Pour illustrer cet exemple, je vais utiliser le cluster “franmerdemo”.

image

 

Gérer le cluster

Après avoir cliqué sur le nom du cluster, le tableau de bord du cluster apparaît.

Si vous cliquez sur le bouton “Gérer le cluster”, une fenêtre de gestion apparaît à partir de laquelle vous y trouverez des exemples d’utilisations ainsi qu’un Editeur Hive, permettant de requête vos données dans un langage proche de SQL qui est HiveSQL.

image

 

Configuration

Le menu “Configuration” permet le paramétrage de l’accès distant au nœud de tête du cluster HDInsight. En bas de la page, cliquez sur “Activez Distant” (y’a mieux comme traduction, je vous l’accorde Sourire)

image

 

après avoir cliquez sur le bouton, la fenêtre “Configurer le bureau à distance” apparaît. Renseignez les informations et définissez une date d’expiration de cette connexion à distance. Cette date ne peut excéder 7 jours après la date de création.

 

image

 

Après validation, la connexion à distance est disponible au bout d’environ une minute. Cliquez sur le bouton “Connecter

image

La fenêtre “Remote Desktop Connection” apparaît. Cliquez sur “Connect”. 

image

 

Puis dans la fenêtre “Windows Security”, entrez les informations de connexion puis cliquez sur “Ok”.

image

Au bout de quelques secondes, vous serez connecté sur le nœud de tête de votre cluster HDInsight !

image

Récupération des données

Donc, comme évoqué en début d’article, nous allons récupérer les données venant du site de logs de Wikipédia. et plus précisément, nous allons sur la page où les logs sont regroupés par fichiers représentants les logs par heure : https://dumps.wikimedia.org/other/pagecounts-raw/2014/2014-10/

Afin de facilité le rapatriement des données sur notre cluster, nous allons automatiser la copie via un script PowerShell :

$wc = New-Object System.Net.WebClient
foreach ($i in 0..23) {
    $n = "{0:D2}" -f $i
    echo $n
    $url = "https://dumps.wikimedia.org/other/pagecounts-raw/2014/2014-10/pagecounts-20141023-" + $n + "0000.gz"
     $wc.DownloadFile($url, [System.IO.Path]::Combine($pwd.Path, $url.SubString($url.LastIndexOf("/")+1)))
}

 

Dans notre cluster HDInsight, nous allons créer un dossier, puis un fichier texte, dans lequel nous allons copier le script PowerShell. après avoir sauvegarder ce fichier texte, nous allons remplacer l’extension du fichier texte (txt) par “ps1”. Si l’extension du fichier, n’est pas visible, depuis l’explorateur, cliquez sur l’onglet “View” puis cocher la case “File Name Extension”.

image

Une fois le fichier “ps1” créé, exécutez-le. Par exemple, faîtes un clic droit sur le fichier, puis dans le menu contextuel cliquez sur “Run with PowerShell”.

image

Les fichiers sont alors copiés dans votre cluster :

image 

 

Copie des données dans le stockage Azure

Une fois la copie terminée, vous devez avoir récupéré les 24 fichiers du 23 Octobre 2014. Pour le moment ces fichiers sont copiés sur le stockage local du cluster. Nous allons maintenant les copier sur un stockage Azure afin de pouvoir conserver les informations, même après la destruction du cluster une fois les traitements terminés.

Double-cliquez sur l’icône “Hadoop Command Line”. La fenêtre “Hadoop Command Line” s’ouvre.

image

Entrez la ligne de commande : cd %pig_home%. Vous devez vous retrouver maintenant à la racine de “Pig”

image

Changez de répertoire pour se placer dans le répertoire bin. Entrez la commande  “cd bin”

image

Une fois dans le répertoire “bin” entrez la commande “pig”.

image

.

Le cochon étant poli, il vous répond “grunt” Sourire.

Etant maintenant dans le langage Pig Latin, nous allons utiliser la commande suivante pour copier nos fichiers locaux (stockés dans le cluster) dans un conteneur Azure :

CopyFromLocal C:\wp1023 .\LogsWP

Attention à ne pas oublier le point “.”. Cela signifie la racine sous le dossier de l’utilisateur connecté au cluster. Dans notre cas, les fichiers seront copiés dans le stockage Azure dans Demo\LogsWP.

image

 

Si on regarde côté stockage Azure avec un outil tel que “CloudXplorer”, voici où sont stockés nos fichiers :

 

image

Traitement des données avec PIG

Maintenant, nous allons traités les fichiers “.gz” pour en extraire les données et les formater afin de les rendre lisible et exploitable avec des outils simple et familier comme Excel.

Toujours depuis notre cluster HdInsight, depuis la fenêtre de ligne de commandes en PIG, nous allons exécuter le script suivant

 

records = load '/user/demo/LogsWP/pagecounts-20141023-*.gz' using PigStorage(' ') as (project:chararray, page:chararray, requests:int, size:int);
filtered_records = filter records by (project == 'en') or (project == 'fr');
records_by_page = group filtered_records by (page, project);
sum_pages = foreach records_by_page generate group, SUM(filtered_records.requests);
result = order sum_pages by $1 desc;
result_limit = limit result 1000;
store result_limit into 'wp_October_23';

Pig Latin est un langage procédural, ce qui signifie que les instructions vont être traitées les unes à la suite des autres et chaque résultat des traitements vont être stockés dans une variable.

La première ligne du script charge les données dans la variable “records”, et donne les informations sur la manière de “parser” les données. Ici, les données sont séparées par des espaces et nous allons définir 4 colonnes (ainsi que le type): Project, Page, Requests (nombre de hit sur la page qui ici sera toujours égale à &), size (taille de la page).

records = load '/user/demo/LogsWP/pagecounts-20141023-*.gz' using PigStorage(' ') as (project:chararray, page:chararray, requests:int, size:int);

 

La deuxième ligne du script va filtrer les données venant de la variable “records” pour ne conserver que les pages Françaises et Anglaises :

filtered_records = filter records by (project == 'en') or (project == 'fr');

 

La troisième ligne va réaliser un groupement par pages et par langue, afin d’agréger les données à la journée :

records_by_page = group filtered_records by (page, project);

 

La quatrième ligne va comptabiliser le nombre de fois la même page a été consultée :

sum_pages = foreach records_by_page generate group, SUM(filtered_records.requests);

 

La cinquième ligne va ordonnées les pages de la plus vue à la moins vue :

result = order sum_pages by $1 desc;

 

La sixième ligne va limiter le résultat au 1000 premières lignes pour éviter de se retrouver avec des pages avec 1 seul hit.

result_limit = limit result 1000;

 

Enfin, la septième ligne va enregistrer le résultat dans un fichier stocké dans notre conteneur Azure.

store result_limit into 'wp_October_23';

 

Dans la console, faîtes un simple copier coller du script. Puis appuyez sur la touche “Enter” du clavier.

image

Au bout de quelques minutes le traitement est terminé :

image

 

Et le fichier est disponible dans notre conteneur Azure sous le nom de part-r-00000.

image

Exploitation des résultats

En fait, à ce stade du traitement on est bien content d’avoir un fichier contenant nos résultats dans notre conteneur Azure. La question légitime est : “On en fait quoi!”. Et bien, la réponse est : “On va l’ouvrir dans Excel” Sourire. Et plus précisément avec Power Query!

Depuis Excel, dans l’onglet Power Query, cliquez sur “From Other Sources”, puis sur “From Microsoft Azure HDInsight

image

 

Dans la fenêtre “Microsoft Azure HDInsight”, renseignez le nom du compte stockage de votre cluster HDInsight.

image

Pour info, vous pouvez récupérer le nom du compte de stockage lié dans le tableau de bord de votre cluster HDInsight.

image

Si vous vous connectez depuis la première fois depuis Power Query à votre compte de stockage, il va vous demander votre “Account Key” :

image

 

Cette clef peut se récupérer depuis le tableau de bord de votre compte de stockage en cliquant sur “Gérer les clés d’accès” :

image

 

Dans la fenêtre “Gérer les clés d’accès”, copiez une des clefs

image

 

Puis collez la clef dans Excel et cliquez sur le bouton “Save”

image

 

Une fois connecté à notre compte de stockage, les différents conteneur sont visibles dans la partie droite d’Excel. Dans notre cas nous allons choisir le conteneur “franmerdemo”.

image

 

Après avoir double-cliqué sur le nom du conteneur, son contenu s’affiche s’affiche dans Power Query. retrouvez le fichier part-r-00000 (vous pouvez faire un tri sur la colonne date par exemple). Cliquez sur “Binary” dans la colonne “Content”.

image

Après avoir cliqué sur “Binary”, Power Query ouvre le fichier. Ci-dessous un aperçu du fichier :

image

 

Nous allons faire un nettoyage du fichier. Comme il y a déjà eu de nombreux articles sur Power Query, je vais aller très vite sur cette partie. En bref, je vais renommer les colonnes, créer une colonne pour la langue des pages et nettoyer les données. Voici une copie d’écran après un passage des données à travers Power Query :

image

Nous allons maintenant cliquez sur “Close and Load” pour envoyer les données dans une feuille Excel.

image 

Une fois les données chargés dans une feuille Excel, nous allons les exploiter dans un tableau croisé dynamique. Cliquez sur une cellule du tableau, puis dans le menu “Insert” cliquez sur “Pivot Table”.

 

image

Dans la fenêtre “Create PivotTable”, cliquez sur “Ok”.

image

 

A partir de là, vous pouvez créer un beau tableau croisé dynamique.

image

 

Ci dessous un exemple de tableau fini avec un segment permettant de filtrer sur la langue des pages.

image

Comme j’ai eu la question durant ma démonstration, pour rappel voici comment créer un segment (slicer). Lors de la création de votre tableau croisé dynamique, faîtes un clic droit sur le champ que vous souhaitez rajouter comme segment, puis cliquez sur “Add as Slicer”. Ultra simple….quand on sait Sourire

image

 

Franck Mercier

Sessions de formation gratuites :

Pour tester Windows Server 2012, Windows 8, SQL Server 2012 et SQL Server 2014 CTP2, vous pouvez télécharger gratuitement la version d’évaluation disponible sous la forme :

Windows Server 2012 :

SQL Server 2012 :

Evaluation SQL Server 2014 CTP2 :

Evaluation Power BI :

Testez Azure gratuitement pendant un mois :

Comments

  • Anonymous
    May 05, 2015
    Merci infiniment pour ce tuto , c'est très intéressent :)
    J'ai une question , en tapant la commande "records = load '.LogsWP/pagecounts-20150504-*.gz' using PigStorage(' ') as (project:chararray, page:chararray, requests:int, size:int); "
    J'ai un message d'erreur : 6007 unable to check name .
    J'ai beau cherché sur internet mais j'ai pas trouvé une solution, pouvez vous svp m'aider.
    Merci
  • Anonymous
    May 05, 2015
    Merci infiniment pour ce tuto , c'est très intéressent :)
    J'ai une question , en tapant la commande "records = load '.LogsWP/pagecounts-20150504-*.gz' using PigStorage(' ') as (project:chararray, page:chararray, requests:int, size:int); "
    J'ai un message d'erreur : 6007 unable to check name .
    J'ai beau cherché sur internet mais j'ai pas trouvé une solution, pouvez vous svp m'aider.
    Merci