samedi 7 avril 2018

Apache Drill : Sql distribué - fédérateur de données


Apache Drill est un moteur Sql distribué permettant de fédérer les données non-relationnelles (NoSql databases, file systems, hadoop, Amazon S3, Azure, …) et les données relationnelles (oracle, mysql, mssql, posgresql, ...) et ce, en utilisant le Sql Ansi.

Exemple : vous pouvez requêter en Sql Ansi les données dans hive avec croisement avec les données dans oracle, ou un fichier json croisé avec les données dans MongoDb, … C'est une sorte de dblink mutli-sources. 

Une simple requête peut joindre multiple données depuis plusieurs sources de données.

Pour plus de détails : https://drill.apache.org/

Ce tutoriel utilise le mode "embedded" d'Apache Drill (installation locale), pour une installation distribuée, vous avez toutes les informations nécessaires ici : https://drill.apache.org/docs/distributed-mode-prerequisites/

Installation en mode embedded (sous Windows):

Pré-requis :
- Télécharger Apache Drill ici https://drill.apache.org/download/ et de-zippe le fichier dans un répertoire de votre choix
- Assurez-vous d'avoir une variable d'environnement JAVA_HOME qui pointe sur un jdk 1.8, et que cet emplacement est dans le path du système d'exploitation

Lancement d'Apache Drill :
- Depuis la ligne de commande de windows, positionnez-vous dans le répertoire bin du répertoire d'installation d'Apache Drill, exemple : C:\dev\apache-drill-1.13.0\bin>
- Lancer la commande :sqlline.bat -u "jdbc:drill:zk=local"
- Si tout ce passe bien, vous aurez un message qui ressemble à :
INFOS: Initiating Jersey application, version Jersey: 2.8 2014-04-29 01:25:26...
apache drill 1.13.0
"this isn't your grandfather's sql"
0: jdbc:drill:zk=local>
Depuis cette ligne de commande, vous pouvez explorer les données exemples embarquées dans Apache Drill en exécutant par exemples les requêtes suivantes :

SELECT * FROM cp.`employee.json` Limit 20;

SELECT position_title,max(salary),min(salary)
FROM cp.`employee.json` group by position_title;

Pour quitter Apache Drill, dans la ligne de commande taper : !quit

Ajout de "Data Source / Storage"

Chaque source de données doit être déclarer pour être utiliser dans Apache Drill : file system hadoop, bdd oracle, bdd posgresql, mongodb, ...

La déclaration est à faire dans l'url d'administration des "Storage" : http://localhost:8047/storage

Exemple ajout d'une base de données Postgresql :

- récupérer le driver jdbc de votre version de postgresql ici: https://jdbc.postgresql.org/download.html
- copier ce driver jdbc dans le répertoire "..\jars\3rdparty\" de votre installation Apache Drill
- dans http://localhost:8047/storage , créer un nouveau storage, donner un nom (le mien c'est postgreSakila), et dans configuration, renseigner les paramètres suivants (à personnaliser) :

{
  "type": "jdbc",
  "driver": "org.postgresql.Driver",
  "url": "jdbc:postgresql://serveur:port/postgres",
  "username": "postgres",
  "password": "password",
  "enabled": true
}

Exemple ajout d'une base de données MySql :

- récupérer le driver jdbc de votre version de MySql ici: https://dev.mysql.com/downloads/connector/j/
- copier ce driver jdbc dans le répertoire "..\jars\3rdparty\" de votre installation Apache Drill
- dans http://localhost:8047/storage , créer un nouveau storage, donner un nom (le mien mysqlSakila), et dans configuration, renseigner les paramètres suivants (à personnaliser) :

{
  "type": "jdbc",
  "driver": "com.mysql.jdbc.Driver",
  "url": "jdbc:mysql://machine:port",
  "username": "root",
  "password": "sakila",
  "enabled": true
}

Ici j'ai simulé une migration du bdd MySql Sakila vers PostgreSql. Mon but c'est de comparer si les données de la base Sakila versées dans PostgreSql sont équivalente à sa source MySql:

select a.actor_id,b.actor_id as actor_id_b,a.first_name,b.first_name as first_name_b 
from postgreSakila.public.actor a 
join mysqlSakila.sakila.actor b on a.actor_id=b.actor_id;

Je peux joindre facilement les données des deux bases, la comparaison est facilitée.

Utilisation d'un Sql Client, exemple Squirrel
- Télécharger Squirrel ici et de-zippe-le dans un répertoire de votre choix: https://sourceforge.net/projects/squirrel-sql/files/1-stable/3.8.1-plainzip/

- Récupérer le driver jdbc drill-jdbc-all-1.13.0.jar d'Apache Drill dans le répertoire ..\jars\jdbc-driver. Ce fichier est à copier dans le répertoire lib de l'installation de Squirrel.

- Dans l'onglet Drivers cliquer sur "+" pour ajouter le driver Apache Drill :


- Renseigner les informations comme suit :


C'est tout, vous pouvez créer une connexion à votre Apache Drill


Divers :

- Pour savoir la liste des tables (vue,...) accessibles :
SELECT TABLE_SCHEMA, TABLE_NAME, TABLE_TYPE
FROM INFORMATION_SCHEMA.`TABLES`
Where TABLE_TYPE = 'TABLE'
ORDER BY TABLE_NAME DESC;
- Utilisation d'Apache Drill par ODBC, voir le site :

https://drill.apache.org/docs/installing-the-driver-on-windows/



mercredi 24 mai 2017

Hadoop et Big Data Studio

Tester Hadoop nécessite une configuration matérielle puissante. Presque toutes les distributions sandbox hadoop actuelles nécessitent au moins 8go de ram de disponible. J'en ai testé quelques une, mais difficile de travailler correctement si on a un pc avec 8go ram, et un windows qui prends déjà au minimum 2go.

Et suis tombé sur la distribution "Syncfusion Big Data Platform", avec cette distribution ,et les 6go de ram disponible, seul  le service spark refuse de démarrer par manque de mémoire avec le service Hbase laissé en arrêt (pour économiser un peu de ram), les autres composants Hdfs, pig, hive, fonctionnent correctement. Pas mal de démos accompagnent cette distribution.

Lien de téléchargement : https://www.syncfusion.com/products/big-data

Attention, c'est une version d'essai (30jours), télécharger la version pour développement.

L'installation est très simple.

A la fin de l'installation, lancer "Syncfusion Big Data Dashboard"

Cliquer sur "Service Manager", et attendre que les services hadoop et hive démarrent correctement


Cliquer sur "Launch Studio" : l'interface pour accéder graphiquement à tous les composants


Plan de test : charger un fichier dans HDFS et créer une table Hive pour faciliter l'exploitation, exploiter cette table depuis Qlik Sense 
1) Import de fichier dans Hdfs

Pour test, j'ai prix le fichier suivant :
https://www.data.gouv.fr/fr/datasets/les-moyens-consacres-a-la-r-d-les-entreprises-par-branche-d-activite-mesr/
Ce jeu de données présente les moyens financiers et humains consacrés à la recherche et au développement dans les entreprises par zone géographique, année, branche d'activité et type de personnel.

Pour insérer un fichier manuellement dans hadoop, il faut utiliser la commande :

hdfs dfs -copyFromLocal <fichier source> <hdfs de destination>

L'outil offre une interface graphique pour le faire facilement.

Depuis l'onglet HDFS, cliquer sur "New" pour créer le répertoire de destination
Sélectionner ce nouveau répertoire, et clique droit et choisir "Permissions" :


Pour charger le fichier, mettez-vous dans le répertoire créé, et cliquer sur le bouton "Upload", cocher "File", sélectionner le fichier que vous avez récupéré et cliquer sur "Upload"


2) Test du fichier dans Hdfs

Cliquer sur l'onglet "Hadoop", cliquer sur "Script" puis "New"
Et taper et exécuter la commande "hdfs dfs -tail /datawarehouse/fr-esr-rd-moyens-entreprises-branche.csv;" 

Cela affiche les derniers kilobytes notre fichier

3) Table Hive

Hive : c'est l'accès aux données en "Sql like" dans hadoop

Cliquer sur l'onglet "Hive", cliquer sur "New Database" pour créer une nouvelle base (ici dwh), et cliquer sur "Script" puis "New" pour exécuter un script de création de la table hive :

Il y a un bouton "New Table" pour créer la table, je préfère le faire en script, cela permet de gérer pas mal d'options, ci-après le script de création de la table :
CREATE TABLE dwh.stat_entreprise_rd(
code_zone_geo INT,
zone_geographique STRING,
annee INT,
code_indicateur STRING,
indicateur STRING,
code_type_pers INT,
type_de_personnel STRING,
code_branche INT,
branche_d_activite STRING,
secret STRING,
non_disponible STRING,
etat_des_donnees STRING,
valeur DECIMAL(12,2))
COMMENT 'Table contenant les stats RD des entreprises'
ROW FORMAT SERDE 'org.apache.hadoop.hive.serde2.OpenCSVSerde'
WITH SERDEPROPERTIES (
   "separatorChar" = "\u0059"
)
STORED AS TEXTFILE
LOCATION '/datawarehouse'
tblproperties ("skip.header.line.count"="1");

"separatorChar" = "\u0059" -> indique le séparateur ";"
tblproperties ("skip.header.line.count"="1") -> pour ignorer la première ligne

Testons avec le sql suivant :

select zone_geographique,sum(valeur) from dwh.stat_entreprise_rd group by zone_geographique;


A suivre : exploitation de la table


dimanche 21 mai 2017

Oracle Data Integrator 12c : Partie 2 - Création d'un référentiel

Qu'est ce qu'un référentiel Odi ?

Dans Odi, un référentiel est un endroit (base de données), où l'outil enregistre le code, les sessions, .... En gros, Odi enregistre et trace tous ce qu'on fait depuis Odi studio dans son référentiel.

Pour pouvoir continuer, assurez-vous d'avoir suivi et fait les installations suivantes :

Odi Studio 12c : http://arakotovao.blogspot.fr/2017/05/oracle-data-integrator-12c-partie-1.html
Pour le référentiel : http://arakotovao.blogspot.fr/2017/05/installer-une-base-de-donnee-oracle.html

Un référentiel odi est composé deux parties : un référentiel maître et un référentiel de travail

Le référentiel maître est un emplacement (ici schéma oracle) qu'odi utilise pour enregistrer les informations techniques (tous ce qui se trouvent dans Topologie et Sécurité): les connexions, les schémas physiques et logiques, les contextes, les agents, et la sécurité

Le référentiel de travail est un endroit (ici schéma oracle) qu'odi utilise pour enregistrer les informations concernant le développement (interface, scénarios, sessions, ...)

Physiquement, on peut utiliser un seul schéma pour les deux, ou deux schémas distincts

1. Création d'un schéma oracle pour le référentiel
  • Assurez-vous que votre container "Oracle-Xe" est bien demarré
  • Lancer Dbeaver (ou autre client Sql) et créé une nouvelle connexion :

Paramètres à adapter selon vos propres paramétrages.
  • Créer un nouveau script et exécuter les commandes ci-dessous

-- on créé l'utilisateur odi_repo avec mot de passe oracle
CREATE USER odi_repo IDENTIFIED BY oracle
-- on donne à l'utilisateur créé le droit de dba 
GRANT DBA TO odi_repo;

Installer une base de données Oracle sous Windows avec Docker (Kitematic)

Besoin : avoir une base de données Oracle (test ou petit développement)

Installer une base de données Oracle sur son Pc pour des besoins de test ou de développement est très consommatrices de ressources. Pour éviter cela, je vous conseille d'utiliser docker (via Kitematic).
Avec docker, pas de services qui démarrent en même temps que votre système windows. Vous démarrez votre base à la demande.
"Docker c'est quoi"
"Docker est un logiciel libre qui automatise le déploiement d'applications dans des conteneurs logiciels. Selon la firme de recherche sur l'industrie 451 Research, « Docker est un outil qui peut empaqueter une application et ses dépendances dans un conteneur isolé, qui pourra être exécuté sur n'importe quel serveur Linux ». Ceci permet d'étendre la flexibilité et la portabilité d’exécution d'une application, que ce soit sur la machine locale, un cloud privé ou public, une machine nue, etc" https://fr.wikipedia.org/wiki/Docker_(logiciel)
Télécharger le ici : https://www.docker.com/products/docker-toolbox
L'installation est simple.

1. Installation d'une base de données oracle sous Docker


Lancer "Docker Kitematic" et cliquer sur "New" (en haut à gauche de l'interface)

Dans la barre de recherche à droite, saisissez "oracle xe", dans la liste, cliquer sur le bouton "Create" du container "wnameless oracle-xe-11g"

Après complétion du téléchargement, le conteneur démarre automatiquement


 2. Paramétrage du container

Pour pouvoir accéder au container oracle-xe, il faut renseigner les ports d'accès externe comme suit :
Cliquer sur l'onglet "Settings" (à droite de l'interface Kitematic) puis "Ports"
Renseigner les ports d'accès externe 32768, 32769, 32767 -> évidemment personnalisable selon vos contraintes

3. Test d'accès

Pour accéder à la base de données "oracle-xe" créée, vous pouvez utiliser un sql client comme Sql developer, Squirrel, ou dbeaver

Pour dbeaver, vous pouvez le télécharger gratuitement ici: http://dbeaver.jkiss.org/download/enterprise/

Informations d'accès :

Host : 192.168.99.100 (à modifier, selon l'adresse IP afficher par votre container)
Port : 32769 (au lieu de 1521)
Sid  : xe
User : system ou sys
Mdp  : oracle


Oracle Data Integrator 12c : Partie 1 - Installation de l'outil Studio

Pré-requis : 

  • Jdk 1.8 + -> http://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html 
  • Télécharger les fichiers d'installation d'odi 12c: Oracle Data Integrator 12cR2 (12.2.1.2.6) -> http://www.oracle.com/technetwork/middleware/data-integrator/downloads/index.html
Installer le Jdk, de-zipper les fichiers d'installations dans un répertoire

Exemple :

  • emplacement du jdk : C:\Program Files\Java\jdk1.8.0_131
  • répertoire fichiers d'installation : C:\odi
Installation : 

Lancer l'invite de commandes windows et exécuter-le en "Exécuter en tant qu'administrateur" 
Lancer la commande :
cd C:\odi  
"C:\Program Files\Java\jdk1.8.0_131\bin\java" –jar fmw_12.2.1.2.6_odi.jar
Attention -> commande à personnaliser si vous avez choisi d'autre emplacement
  • Un écran de bienvenu est affiché, cliquer sur "Suivant"
  • Demande de mise à jour automatiques, à ignorer ou renseigner les informations nécessaires sinon, cliquer sur "Suivant"

jeudi 18 mai 2017

Talend et tWaitForFile : scan de dossier

Ayant eu un besoin personnel de scruter un dossier et d'envoyer les fichiers arrivés par mail, je vous partage la solution que j'ai choisi.
N'hésitez pas à commenter

Besoin : scan d'un dossier particulier, attente de l'arrivé de fichiers, puis envoi par mail
Version de Talend utilisé : 6.4.0


1) Créer un job Talend (clique droit sur Jobs / puis Créer un job)


Remarque : j'ai classé mon job dans un dossier créé à part


2) Principe et composants utilisés 

On scrute le répertoire par le composant tWaitForFile
Par itération (si plusieurs fichiers), on envoi par mail le(s) fichier(s)
Chaque fichier traité est déplacé dans un autre répertoire


3) Réalisation 

 a) Depuis la palette d'outils, dans « Orchestration », prendre le composant « tWaitForFile » vers votre job

 b) Depuis la palette d'outils, dans « Internet », prendre le composant « tSendMail » vers votre job

 c) Depuis la palette d'outils, dans « Fichier / Gestion », prendre le composant « tFileCopy » vers votre job