mercredi 16 décembre 2015

Création d'un cluster hadoop 8 noeuds

Dernièrement, dans un data lab, j'ai créé un cluster hadoop à 8 noeuds, 3 noeuds pour gérer la haute disponibilité du namenode et 5 noeuds pour les data. Ce cluster a été construit sur une architecture de type commodity hardware, 8 PC dont la configuration est la suivante: 4 threads, 32 GB RAM et qqes TB de disque magnétique. L'OS installé est Ubuntu ( 12.04 pour les master nodes, un ancien cluster Cassandra reconverti et 14.04 pour les data nodes ). En production, pour rappel, chaque noeud doit être configuré de manière identique. Quant aux JVM, elles se basent sur openjdk-7-jre.

Pour ce faire, je me suis basé sur les liens suivants:
- Installation d'un cluster hadoop sans ha sur Ubuntu;
- Installation d'un cluster hadoop en mode ha;
- HDFS haute disponibilité: howto.

Comme toute installation a toujours son lot de surprises, en particulier sur un environnement expérimental, voici le répertoire google drive où j'ai mis mes notes sur l'installation ainsi que les fichiers de configuration hadoop.

Par la suite, j'ai fait qqes tests de map-reduce sur un wordcount perso et le cluster a parfaitement bien répondu. Quelques screenshots sont disponibles dans le répertoire de partage.

mercredi 11 novembre 2015

Hadoop

Après avoir travaillé sur les bases nosql, je m'intéresse désormais à la notion de socle big data, c'est à dire à une architecture big data  de type cloudera ou hortonworks. La base de cette architecture est constituée par hadoop, un système de fichiers distribué sur plusieurs noeuds. Pour éviter d'écrire du map/reduce en natif, vous disposez pour faire du batch d'outils comme Hive, Tez, Impala ou encore Spark pour les plus innovants.

Pour vous initier à tous ces nouveaux concepts, je vous conseille de lire comme point de départ Hadoop: The Definitive Guide de Tom White, un ouvrage d'une grande pédagogie.

Bien entendu, une telle plate-forme ne traite pas que le partie batch et vous disposez d'autres outils pour exposer des services comme des bases nosql, des moteurs de recherche ou même du machine learning sous forme de data lab.

Tables temporaires

Jusqu’à la 11g, les tables temporaires en mode commit preserve rows sont à manier avec précaution. Si vous vous contentez de les utiliser pour stocker quelques calculs intermédiaires, vous n’aurez pas de problèmes car un full scan fera bien l’affaire.

En revanche, si des tables temporaires sont utilisées dans un batch suite par exemple à une migration de Sybase vers Oracle, vous risquez alors de faire face à des problèmes de performance une fois une certaine volumétrie atteinte.

En effet, si une même requête au sens sql_id est utilisée plusieurs fois, un dynamic sampling souvent insuffisant sera utilisé pour collecter quelques statistiques afin d’élaborer un plan d’exécution lors de la création du curseur dans le shared pool. De plus, si cette requête est utilisée plusieurs fois par d’autres sessions, ce même plan d’exécution sera appliqué alors que le jeu de données risque d’être fort différent en volumétrie et en nature des données.

Pour éviter des performances dégradées et aléatoires, deux solutions peuvent être mises en oeuvre :
1)  Utilisation d’un hint pour forcer le dynamic sampling à 6, voire plus si nécessaire ;
2) Forcer le hard parsing à chaque exécution de requête (http://ahmedaangour.blogspot.fr/2011/07/forcer-un-hard-parse.html) pour obtenir un plan d’exécution adapté à chaque jeu de données.

A partir de la 12c, la possibilité de collecter des statistiques au niveau de chaque session (https://oracle-base.com/articles/12c/session-private-statistics-for-global-temporary-tables-12cr1) change la donne.

vendredi 26 juin 2015

Big data: perspectives

Une tribune sur le big data et les horizons qu'il apporte.

samedi 16 mai 2015

Exemple d'utilisation du segment advisor

Cet exemple va permettre de récupérer de l'espace disque : 

set serveroutput on size unlimited
DECLARE
  CURSOR curs_list_index
  IS
    SELECT regexp_replace(regexp_replace(c1, 'alter index ', ''), ' shrink space', '') index_name
    FROM TABLE(DBMS_SPACE.ASA_RECOMMENDATIONS)
    WHERE TASK_ID IN
      (SELECT task_id
      FROM dba_advisor_log
      WHERE task_name LIKE 'SYS_AUTO_SPCADV%'
      AND EXECUTION_START > (sysdate - 7)
      )
  AND C1 LIKE 'alter index%'
  ORDER BY task_id;
 
  cmd varchar2(160);
  ecode number;
  emesg varchar2(200);
BEGIN
   for rec in curs_list_index
   loop
      if substr(rec.index_name, 2, 3) = 'xxx' then
         begin
            cmd := 'alter index ' || rec.index_name || ' rebuild online parallel 16 nologging';
            dbms_output.put_line(cmd);
            execute IMMEDIATE cmd;
            cmd := 'alter index ' || rec.index_name || ' noparallel';
            execute IMMEDIATE cmd;
         exception
            -- ORA-00054: resource busy and acquire with NOWAIT specified
            when others then
               ecode := SQLCODE;
               emesg := SQLERRM;
               dbms_output.put_line(TO_CHAR(ecode) || '-' || emesg);      
         end;
      end if;
   end loop;
END;

Vous pouvez aussi l'étendre aux segments de type table. Vous serez surpris de l'espace gagné !

vendredi 16 janvier 2015

Histogramme: comment les décrypter

Un histogramme sur une colonne peut être utile si cette colonne a une distribution non uniforme de ses valeurs; on parle alors de skew distribution. Jusqu'à la 12c, il existait deux types d'histogramme: les histogrammes de type fréquence et les histogrammes de type height-balanced. Les premiers, sorte de diagramme en bâton, sont précis, mais ils sont limités à 256 valeurs. Les seconds, se basant sur un algorithme d'identification de valeurs populaires,  permettent de traiter les autres cas, mais ils peuvent être amenés à être imprécis pour certains types de distribution. Lorsque cela se produit, soit on supprime l'histogramme, soit on le fake si les données ont une certaine stabilité dans le temps.

Mais, avant de mettre en défaut un histogramme, il est utile de pouvoir le décrypter ( ! ) afin de vérifier sa validité. En effet, la lecture d'un histogramme est parfois tout sauf une chose aisée. Afin de vous aider dans cette tâche, j'ai chargé dans Google Drive un fichier exemple ( /oracle/histogram/etude_histogram.sql ). Sur ce point, un grand merci à J.Lewis, comme d'habitude ...

Depuis la 12c, on peut désormais avoir 2048 valeurs dans un histogramme de type fréquence. De plus, deux nouveaux types d'histogramme sont apparus: les histogrammes de type top frequency et les histogrammes hybrides.  Les premiers sont très intéressants car ce sont des histogrammes de type fréquence qui regroupe les top-n valeurs d'une colonne, ce qui est souvent représentatif de la réalité ( penser à une distribution de Zipfian pour simuler ce genre de colonne ). Les seconds sont une amélioration des histogrammes de type height-balanced.

Si vous souhaitez avoir plus d'infos sur ce sujet et plus généralement sur les nouveautés de la 12c au niveau de l'optimiseur: /oracle/paris_oracle_meetup/The Query Optimizer in Oracle Database 12c - What's new ? ( written by C.Antognini ).

Jusqu'à maintenant, je vous ai parlé d'histogramme sur une colonne. Ce type d'outil reste valide tant que les valeurs des colonnes sont indépendantes les unes des autres. Mais quand cela n'est plus le cas, l'optimiseur ne peut plus estimer correctement la sélectivité d'une clause where comportant par exemple deux colonnes dépendantes l'une de l'autre. Pour pallier ce défaut, Oracle a introduit en 11g la notion d'extended statistics.

Oracle implémente cette notion en créant une colonne virtuelle correspondant à la concaténation des colonnes ciblées, puis calcule les statistiques sur la colonne virtuelle: on peut alors obtenir un histogramme sur plusieurs colonnes. La colonne virtuelle est définie via la fonction sys_op_combined_hash.

Enfin, pour finir, SVP, ne supprimer pas les histogrammes d'une base sans raison !


jeudi 8 janvier 2015

Liens invalides

Dernièrement, Free a interdit la lecture des répertoires sur les sites FTP perso à la demande de la CNIL. Par conséquent, seuls les liens sur un fichier fonctionnent désormais.

Pour les liens sur les répertoires, je les ai remplacés par un accès en mode public via google drive. Ils sont désormais au niveau des posts de mon compte Google+.

Désolé.