Tutoriel : Analyser les données Twitter avec Flume et Hive

L’objectif de ce tutoriel est de vous montrer comment utiliser Flume et Hive pour analyser des données en provenance de Twitter.

Il a également pour objectif de mettre en évidence les difficultés que l’on rencontre actuellement avec des plateformes Big Data en évolution rapide mais pas toujours stabilisées, d’où l’importance de disposer d’une expertise suffisante dans le domaine.

Ce tutoriel a été élaboré à partir de la version sandbox 2.1 de la distribution Hortonworks.

 

Présentation de Flume

Flume a été initialement développé par Cloudera avant d’être reversé à la communauté Apache. Il porte maintenant l’appellation Flume NG (Next Génération). C’est un outil relativement simple faisant aujourd’hui parti de l’éco-système Hadoop.

Flume fonctionne comme un service distribué pour assurer la collecte de données en temps réel, leur stockage temporaire et leur diffusion vers une cible.

Fig 1 - Fonctionnement flume devguide_image00-300x126

Techniquement, un agent Flume permet de créer des routes pour relier une source à une cible via un canal d’échange.

La « source » Flume a pour pour but de récupérer les messages à partir de différentes sources, en particulier des fichiers de logs mais aussi comme nous le verrons des données Twitter.

Le « canal » Flume est une zone tampon qui permet de stocker les messages avant qu’ils soient consommés. On utilise généralement un stockage en mémoire.

Le « cible » Flume consomme par lot les messages en provenance du « canal » pour les écrire sur une destination comme HDFS par exemple.

Lorsque la vitesse d’intégration des nouveaux messages est plus rapide que celle d’écriture vers la cible, la taille du « canal » augmente afin de garantir qu’aucun message ne soit perdu.

Installation de Flume

On se connecte tout d’abord à la machine virtuelle à partir d’un terminal distant:

ssh root@127.0.0.1 -p 2222

Puis on installe le package via la commande:

yum install -y flume

Fig 2 - Installation Flume

Le package s’installe et à la fin, votre écran devrait ressembler à ceci.

Fig 3 - Fin installation Flume

Configuration pour accéder à Twitter

Vous devez tout d’abord créer une application Twitter en allant sur le site des développeurs Twitter (https://dev.twitter.com/apps/) afin de générer vos identifiants.

Fig 4 - Identifiants Twitter

Avec ces identifiants, on va pouvoir mettre à jour le fichier de configuration flume.conf.

Fig 5 - Fichier de configuration Flume

 

Outre les identifiants Twitter, on va mettre à jour le paramètre keywords pour filtrer les tweets sur les éléments qui nous intéressent (dans mon exemple, je m’intéresse aux tweets sur le big data).

On remarque que tous les paramètres sont préfixés par le nom de l’agent, ici TwitterAgent.

On va également préciser l’emplacement HDFS où seront stockés les tweets récupérés.

TwitterAgent.sinks.HDFS.hdfs.path = 
hdfs://sandbox.hortonworks.com:8020/user/hue/twitter/tweets

Vous trouverez une information plus exhaustive du paramétrage sur http://flume.apache.org.

Si vous avez modifié le fichier sur votre machine, il ne reste plus qu’à le copier sur la VM.

scp -P 2222 flume.conf root@127.0.0.1:/etc/flume/conf/

Il faut maintenant télécharger flume-sources-1.0-SNAPSHOT.jar. Ce package contient les fonctions nécessaires pour accéder et récupérer les données de Twitter.

On va également le copier sur la VM, dans le répertoire des fichiers jars de Flume.

scp -P 2222 flume-sources-1.0-SNAPSHOT.jar 
root@127.0.0.1:/usr/lib/flume/lib/
 J'ai rencontré pas mal de soucis pour savoir où positionner ce fichier. J'ai essayé différentes configurations mais sans succès. Plusieurs blogs conseillaient de simplement le copier puis d'indiquer son emplacement dans le fichier flume-env.sh mais cela n'a jamais fonctionné chez moi.

 

Démarrer Flume

On démarre flume avec la commande suivante:

flume-ng agent -c /etc/flume/conf -f /etc/flume/conf/flume.conf -n TwitterAgent > twitter.log

On précise le répertoire et le fichier de configuration de Flume. On indique également l’agent que l’on démarre, ici TwitterAgent. On redirige la sortie dans un fichier pour analyse si besoin.

De mon côté, je préfère lancer cette commande via un script flume.sh dans lequel j’ai simplement reporté cette ligne.

Au bout de quelques secondes (minutes) en fonction de vos recherches, les données de tweets apparaissent sous HDFS.

Fig 6 - Apparition des données de tweets

Si on sélectionne un fichier, on peut visualiser les données transmises dans les tweets.

Fig 7 - Visualisation d'un tweet

Analyser les données avec Hive

Twitter fournit des données au format JSON. Or Hive ne sait pas les traiter nativement. Il faut donc récupérer une librairie java qui va permettre à l’outil Hive de travailler avec ce format spécifique.

Plusieurs blogs conseillaient d’utiliser le fichier suivant:

json-serde-1.1.6-SNAPSHOT-jar-with-dependencies.jar

Mais cela n’a jamais fonctionné chez moi comme pour de nombreux lecteurs dans la même situation. Je pense que l’extrême évolutivité des distributions Hadoop rend complexe la mise au point de tutoriaux qui restent valides dans le temps. Et ce post n’y échappera pas 🙂

Là encore, après de multiples recherches et tentatives, j’ai finalement trouvé une solution en récupérant la dernière version de ce fichier sur https://github.com/rcongiu/Hive-JSON-Serde. Je n’ai pas pris les sources mais directement le binaire suivant:

http://www.congiu.net/hive-json-serde/1.3/cdh5/
json-serde-1.3-jar-with-dependencies.jar

J’ai simplement copié ce fichier sur /root/.

On va ensuite créer une table Hive. Une table externe car nous n’avons pas besoin de déplacer physiquement les données. Celles-ci resteront toujours sur HDFS et ne seront pas dupliquées.

On n’oublie pas au début du script de rajouter en début de script une commande pour prendre en compte la librairie java évoquée ci-dessus.

Fig 8 - Fichier tweet_raw

Il suffit ensuite de lancer le fichier via la commande suivante:

hive -f tweet_raw.sql

Fig 9 - Création de la table des tweets

 

 

Fig 11 - Paramétrage de Hue avec le fichier jar

 

 

 

Si l’on veut utiliser l’interface web Hue pour visualiser la table, il faut au préalable copier le fichier jar json sur /apps/hive puis le charger dans l’interface en rajoutant ce fichier jar comme un fichier de ressource dans l’onglet Query Editor (Beewax).

 

 

 

 

 

 

 

On peut ensuite visualiser la table dans l’interface Hue directement.

Fig 10 - Table des tweets

On peut évidemment faire des requêtes.

Pour illustrer ce point, je vais classer les utilisateurs de tweets par ordre décroissant en fonction du nombre de followers. A noter l’accès au champ followers_count qui n’est pas un champs simple de la table mais un champs inclus dans une structure.

select user.screen_name, user.followers_count c from tweets_raw 
order by c desc

 

Et voici le résultat:

Fig 13 - Classement décroissant des users par nombre de followers

Merci de m’avoir suivi et a bientôt pour un tutoriel sur la visualisation des données analysées de Twitter avec Qlik.

  • A propos
  • Derniers articles

5 Comments

  1. PH Brunelle 30 avril 2015 Répondre

    Bonjour,

    Merci pour cet excellent tutoriel. J’ai suivi vos instructions en utilisant la version 2.2 de la sandbox Hortonworks, et il semble qu’il y ait quelques différences.

    Le répertoire de flume semble désormais se situer dans « /usr/hdp/2.2.0.0-2041/flume ». Malgré cette modification, l’exécution échoue avec des message de type « java.lang.NoSuchMethodError: twitter4j.conf.Configuration.getRequestHeaders()Ljava/util/Map; ». Cela vient d’un problème de version de twitter4j dans le repertoire flume/lib. En remplaçant la librairie existante par twitter4j-core-3.0.6-SNAPSHOT-sources.jar, cela fonctionne parfaitement.

    Bonne continuation.

    • Author

      Bonjour Pierre-Henri,

      Effectivement, les distributions évoluent très rapidement et on constate des différences de comportement dès qu’on change de version. C’est l’une des difficultés de ce type de tutoriel. Merci beaucoup pour votre complément.

  2. Bonjour,

    Après avoir suivi votre tutoriel (merci d’ailleurs), je m’aperçois que les multiples fichiers inscrits dans le HDFS contiennent les mêmes données (ie les mêmes tweets) lorsque je lance un agent flume.

    Est ce normal ?

    Je dois à chaque fois relancer l’agent si je veux que les fichiers contiennent des tweets « nouveaux » …

    • Author

      Bonjour Mélissa,
      Non ce n’est absolument pas normal.
      La seule explication à te donner serait que ces tweets ont été générés de manière automatique par un logiciel. Le contenu serait identique donnant l’illusion que les tweets sont les mêmes. Mais ils devraient avoir chacun un identifiant distinct.
      Bon courage pour ton projet.

  3. Stéphane Raynal 16 août 2016 Répondre

    Bonjour Stéphane,

    Une info pour ceux qui voudraient essayer de lire des flux tweeter via Cloudera.

    Dans la dernière version de Cloudera avec Flume integré, il n’est pas nécessaire d’importer le « flume-sources-1.0-SNAPSHOT.jar. ».
    Ce jar, ou son équivalent mis à jour, est déjà dans le $FLUME_HOME/lib.

    Par contre il est nécessaire de changer :
    TwitterAgent.sources.TwitterSource.type = com.cloudera.flume.source.TwitterSource
    en
    TwitterAgent.sources.TwitterSource.type=org.apache.flume.source.twitter.TwitterSource

    Une autre note utile, pour démarrer Flume en mode debug il faut rajouter la ligne suivante lors du lancement de flume-ng :
    -Dflume.root.logger=DEBUG,console

Laissez un commentaire

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

*