Installation d’un disque SSD sur mon PC équipé de Debian Jessie

Après 6 ans de bons et loyaux services, mon PC commençait à fatiguer un petit peu. J’ai donc décidé de m’équipe d’un disque SSD. J’ai souhaité conserver mon ancien disque et répartir selon les besoins les données entre les deux.

Voici les étapes de l’installation , de la configuration et des optimisations effectuées.3319_ssd-2

Références

Je me suis appuyé principalement sur les documentations Debian et Ubuntu. Elles sont vraiment bien faites. Je vous les conseille 🙂

Montage du disque SSD

Afin d’optimiser le montage et de limiter les I/O sur le disque SSD, il faut ajouter l’option noatime au montage du disque.

Voici le contenu de mon fichier /etc/fstab

Alignement du disque

On peut paramétrer le montage du disque avec l’option discard ou comme ici, utiliser la commande fstrim et la lancer via un cron. J’ai choisi la deuxième option ( cron hebdomadaire )

Paramétrage de certains répertoires

Répertoire TMP en mémoire

Une des bonnes pratiques est de ne pas mettre les répertoires qui ont des contenus qui ne cessent d’être modifiés (ex. /tmp, /var ) . Pour ça il y a deux stratégies, l’une de mettre en mémoire les espaces souhaités (dans mon cas le /tmp ) ou sur un disque classique (le /var ).

Tout d’abord, il faut activer la fonctionnalité via le fichier /etc/default/tmpfs

puis monter le répertoire /tmp en mode tmpfs

Répertoire /var

J’ai décidé d’externaliser le répertoire /var dans mon ancien disque

Pour monter le répertoire au démarrage, il faut utiliser la fonctionnalité « bind » dans le fichier /etc/fstab.

Montage des différents disques au démarrage

Par défaut, mon ancien disque n’est pas accessible. J’ai donc utiliser gnome-disks pour configurer les partitions et les rendre accessibles au boot.

Répertoires des utilisateurs

Pour tous les utilisateurs, j’ai externalisé les éléments suivants :

  • répertoire .cache
  • répertoires Downloads, Documents, Desktop, Musique,Vidéos

Ils sont liés par des liens symboliques.

Conclusion

Il n’y a rien de vraiment compliqué. Je ne sais pas si ces étapes sont obligatoires, mais je me suis dit que quitte à réinstaller le système, autant bien le faire 🙂

Si vous voyez des choses à améliorer et/ou corriger, n’hésitez pas à le mettre en commentaire 🙂

Utilisation de spark en mode streaming

Après avoir intégré toutes les briques dans docker, il ne me « restait » plus qu’à coder la brique permettant de me connecter à une queue MQTT et d’insérer des données dans Elasticsearch.

 

Spark-logo-192x100px

J’ai décidé d’utiliser Apache Spark. Ce composant remplace Hadoop pour les traitements map reduce et permet d’exécuter ce genre de traitement dans plusieurs typologies d’environnement ( batch, cluster spark, cluster hadoop,…).

J’aime bien ce framework car il offre différentes possibilités et permet via un simple batch ( commande java -jar ) de lancer des traitements map reduce performants avec différents langages (scala, java,python, R).

Pour ce faire j’ai aussi décidé d’utiliser le langage SCALA. Spark est développé sur ce langage et fournit plus de fonctionnalités en scala que sur les autres.

Connexion à une queue MQTT

Sauvegarde dans Elasticsearch

Elasticsearch fournit une API permettant à des dérivés d’Hadoop de se connecter à un cluster Elasticsearch. L’utilisation est des plus simples.

Le programme

J’ai volontairement crée plus de variables qu’il ne faut car j’ai pas mal mis de logs 🙂

Je vais essayer de mettre mon code sur github prochainement.

 

 

 

 

 

 

 

Docker compose

Me voilà avec mes images docker réalisées. Maintenant, il faut les lier entre elles et packager le tout.

J’ai choisi d’utiliser docker-compose. c’est l’outil standard fourni par docker. Sa principale lacune est que cet outil ne s’exécute que localement. En gros, on ne pourra pas utiliser docker-compose pour exécuter de manière distribuée les différents containers (ex. la base de données sur un nœud, le serveur web sur un autre,…). Pour mon POC je n’ai pas trop besoin de ça et, il faut le dire, j’ai un peu la flemme d’installer des softs comme kubernetes.

Je ne décrirai pas l’installation. C’est beaucoup mieux fait ici.

Je mettrai prochainement le code sur github. Je pense que le code sera mis à jour ultérieurement. Il se peut donc que certains exemples de cet articles soient obsolètes.

Définition des différents composants

J’ai trois composants :

  • une instance rabbitmq qui réceptionne des messages via le protocole MQTT
  • elasticsearch qui stocke les différents évènements et les mets à disposition
  • un programme s’appuyant sur spark-streaming qui se connecte à rabbitmq , transforme les évènements réceptionnés et les envoient dans elasticsearch.

La spécification des différents composants se fait par un fichier docker-compose.yml qui est dans le répertoire racine.

Je spécifie les images que je souhaite construire, les ports exposés et les variables d’environnement

Le fichier docker-compose.yml

elasticsearch

J’ai surchargé l’image officielle d’elasticsearch en ajoutant un fichier de configuration personnalisé et en installant le plugin shield et marvel. Voici le dockerfile:

Rabbitmq

Ici j’ai souhaité ajouter deux utilisateurs au démarrage du container

La configuration se fait dans le fichier init.sh

Spark

Enfin mon code scala qui exécute SPARK est packagé sous qui la forme d’un JAR qui contient toutes les dépendances.

Le dockerfile correspondant

Je ne décrirai pas le code ici. Peut-être dans un futur article.

Construction

Exécution

Atom derrière un proxy d’entreprise

Je n’ai pas trop d’inspiration en ce moment….

J’ai néanmoins une petite manipulation utile si vous utilisez l’éditeur atom en entreprise. Dans ma boite, il y a un proxy. Pour télécharger les packages et thèmes il est nécessaire de paramétrer les URLS du proxy.

Voici la manipulation :

Créer un fichier .apmrc dans le répertoire $HOME/.atom ou c:/Users/monutilisateur/.atom sous windows avec le contenu suivant :

Redémarrer atom et dorénavant, vous pouvez télécharger les packages à travers le proxy.

Créer une image docker d’elasticsearch avec marvel préinstallé

Je fais suite à un précédent post sur elasticsearch et docker.

Il existe déjà des images docker pré configurées avec elasticsearch et marvel. Cependant, il n’en existe pas d’officielles et celle qu’il y a ne me conviennent pas trop.

J’ai décidé de créer une image se basant sur une archive de marvel pré-téléchargée.

Dans un répertoire, j’ai ajouté un répertoire install_plugins avec le zip de marvel installé ( je pourrai installer ensuite les plugins shield et license)

Voici le contenu du fichier Dockerfile:

 

Ma configuration SBT

SBT est l’outil standard de build de l’écosystème scala ( et pas que… ).1158012

Afin de « l’acclimater » à la vie en entreprise, j’ai du faire quelques modifications. Elles sont adaptées pour les configurations des développeurs utilisant:

  • maven
  • un référentiel partagé (nexus, artifactory)

Pour info, j’ai souhaité déplacer le cache ivy dans un autre répertoire. Par défaut, c’est dans le répertoire $HOME/.ivy.

Créer le fichier sbt.boot.properties dans le répertoire $SBT_HOME/bin

Dans le fichier sbt.bat j’ai ajouté au début le fichier suivant :

 

Elasticsearch avec Docker

Comme évoqué dans un précédent article, j’ai décidé de me mettre (modestement) à Docker. Comme je devais utiliser elasticsearch pour un projet, j’ai dit pourquoi pas utiliser l’image docker. Voici les actions que j’ai réalisé et le (petit) problème vite résolu.

 

elasticdocker

Installation

Que du simple et du basique. elastic.co fournit une image officielle.

Problème de binding réseau

Si je démarre l’instance de manière classique, j’ai un petit soucis de binding réseau. En effet, l’instance Docker positionne le hostname à 172.17.0.1 et … ça occasionne quelques soucis lors de l’appel à mon cluster (ex.: timeout, impossibilité de joindre le cluster, catastrophe nucléaire,…).

Si on exécute la requête suivante : http://localhost:9200/_nodes/process?pretty on obtient :

Bref, ça ne le fait pas. Pour pouvoir utiliser cette image sans avoir à créer ma propre image, j’ai donc positionné les variables HOSTNAME, es.network.bind_host et es.network.host au démarrage de la machine.

Maintenant j’ai la configuration suivante :

Extraire les données d’une base de données relationnelle avec Spark

Me voila en train de tester Apache Spark.AAEAAQAAAAAAAAImAAAAJDcyMTQ0N2JkLWRjYzMtNDZjMy05OWQ4LTljNzFiM2M0NTg0Mw

Pour info, Spark est un projet libre du consortium Apache qui a le vent en poupe depuis quelques temps. Il permet entre autres de réaliser des opérations de type Map Reduce en mémoire

Je souhaite automatiser le chargement de données dans ELASTIC SEARCH et faire au passage un petit map reduce sur les données en entrée.

Voici ce que j’ai fait pour extraire les données d’une base relationnelle ORACLE via JDBC. Bien évidemment, ça fonctionne avec toutes les autres SGBDR accessibles via JDBC.

Configuration de Spark

J’utilise le mode « autonome » de spark, c.-à.d sans cluster hadoop.

Pour l’instant, je n’utilise que les modules streaming et sql.

Au préalable , il faut configurer la variable d’environnement SPARK_CLASSPATH et ajouter le chemin vers le driver JDBC

Je n’ai pas téléchargé la distribution car j’utilise spark au travers des librairies utilisées dans mon programme.

Développement

J’ai décidé d’utiliser le langage SCALA pour développer mon module. Pourquoi SCALA me direz vous ? Parce que ça fait quelques années que je me dis que je dois m’y mettre ( peut être est-ce trop tard ….) et que selon plusieurs commentaires que j’ai pu avoir au DEVOXX, SCALA est clairement plus adapté aux traitements réalisés par SPARK

Dépendances

Voici la configuration de mon pom.xml build.sbt :

Pour l’exemple, voici une classe « fourre tout » qui montre le chargement de Spark ainsi que l’extraction des données

Problèmes rencontrés

Gestion des champs numériques

Comme évoqué ci-dessus, j’ai eu un bug sur la gestion des NUMERIC ,

Comme moyen de contournement, j’ai (après quelques recherches sur le net) opté pour surcharger le dialecte JDBC:

et enregistré le dialecte à l’exécution

Présence du binaire winutils.exe sur windows 7 64bits

Si comme moi vous avez le bug référencé sur le JIRA du projet, il suffit de télécharger le binaire winutils.exe, puis de positionner la variable d’environnement au démarrage en mettant le bon chemin ( attention, il faut un sous répertoire « bin’ .

And now, something completely different

Outre les difficultés liées à l’apprentissage simultané de plusieurs technologies, on y arrive. Le projet est bien documenté.

Maintenant, je vais créer plusieurs indicateurs et faire un chargement dans Elasticsearch. Je décrirai ça dans un prochain article

 

 

Comment customiser une image Docker

Je suis actuellement en train de me mettre sur Docker. En résumé (Wikipedia le fait mieux que moi), Docker est une solution libre de virtualisation qui optimise le déploiement des applications en virtualisation un peu tout l’OS, la base de données, le serveur d’application et soyons fous le poste de développeur.

Au Devoxx 2015, c’était le sujet Hype du moment.

J’ai décidé de me lancer sur ce sujet car je suis en train d’expérimenter quelques technos (MQTT entre autres) et les installations m’exaspèrent…

Bon voila mon problème, pour faire un POC, j’ai voulu installer rabbitmq et ajouter quelques configurations supplémentaires

  • Activation du plugin mqtt
  • Activation de la console d’administration
  • Paramétrage d’un utilisateur pouvant accéder à la console

Pré requis

vérifier que docker est bien installé sur votre poste.

Perso, j’utilise pour cela Debian (what else ) 8.0.

Construction de l’image

Dans le fichier Dockerfile

En résumé, j’utilise l’image Docker officielle rabbitmq, j’ajoute deux variables d’environnement spécifiant les utilisateurs et je lance une commande permettant d’activer le support de mqtt

Ensuite, il suffit de construire l’image dans le répertoire crée

Et voilà, il ne reste plus qu’à exécuter un container basé sur cette image

Conclusion

on peut voir que l’ajout de fonctionnalités supplémentaires est assez facile avec docker. L’exemple est volontairement simpliste. Il existe également docker-compose qui permet de faire la même chose ( et + encore) en étant beaucoup plus puissant dans la gestion des dépendances

 

 

Premiers pas avec Cassandra

Lors de la conférence BIG DATA PARIS 2015, j’ai rencontré l’éditeur de la base NoSQL CASSANDRA (DATASTAX). J’ai pu échanger avec eux sur leur solution et les avantages.Cassandra_logo.svg_
Il y a pas mal de choses qui m’ont séduites:

  • Le mode colonne
  • L’interfaçage CQL qui ressemble un peu au SQL
  • L’UPDATE qui gère l’insertion si la ligne n’existe pas
  • La scalabilité linéaire
  • L’interface graphique du OpsCenter
  • Leur documentation que je trouve bien foutue

Après avoir eu les yeux qui ont brillé, le retour à la réalité m’ a permis de voir que pas mal de restrictions existaient:

  • Certaines briques permettant l’intégration ( apache camel, logstash,…) ne permettent pas de se connecter à cassandra. Il faut le faire via leur API
  • Datastax ne fournit pas une solution de reporting intégrée comme mongodb. On peut utiliser JasperReports pour cela.
  • On ne peut pas générer automatiquement une colonne via le mode d’interfaçace CQL. On peut néanmoins contourner le problème via une MAP

Bref, plein de petits détails qui je pense vont à mon avis être oublié dès lors que je maitriserai un peu plus la technologie.

Je ne vais pas mettre d’exemple dans cet article car je n’ai pas encore trop de matière. Je le ferais sans doute dans un prochain article.

Si vous voulez en savoir un peu plus, allez sur leur site, c’est très bien expliqué.