Partage
  • Partager sur Facebook
  • Partager sur Twitter

[Cours] Créez votre data lake

AKA Comment j'ai appris à ne plus m'en faire et stocker des petaoctets

11 septembre 2017 à 17:11:48

Vous pouvez désormais apprendre à stocker pleeeeeeeeein de données dans HDFS : https://openclassrooms.com/courses/creez-votre-data-lake

Au delà de l'apprentissage pur et simple de ces outils que sont HDFS et Avro, on y parle aussi de comment organiser des données, passer à l'échelle, réaliser des requêtes sur des gros jeux de données composés de fichiers... Plein de choses utiles pour n'importe quel dév, devops, sysadmin ou data scientist.

Il s'agit du troisième cours du parcours data architect, le parcours de ceux qui <3 les mégadonnées et réalisé en partenariat avec CentraleSupélec.

J'espère que vous aurez autant de plaisir à suivre ce cours que moi à le faire ! Et n'hésitez pas à me poser toutes vos questions ici, je suis là pour ça.

-
Edité par RégisB. 11 septembre 2017 à 17:20:10

  • Partager sur Facebook
  • Partager sur Twitter
17 septembre 2017 à 5:53:25

Salut, ce cours est très intéressant (tout comme ceux qui sont en lien au debut du cours),

Cependant j'ai un problème, 

Je suis sous mac j'ai installer le java runtime environment sans problème ainsi que HDFS j'ai fait la configuration comme expliquer dans le cours en mettant bien le bon path cependant les nodes ne se lancent pas voila ce que le terminal me dit :

17/09/17 05:40:26 INFO namenode.NameNode: registered UNIX signal handlers for [TERM, HUP, INT]
17/09/17 05:40:26 INFO namenode.NameNode: createNameNode []
17/09/17 05:40:26 INFO impl.MetricsConfig: loaded properties from hadoop-metrics2.properties
17/09/17 05:40:26 INFO impl.MetricsSystemImpl: Scheduled Metric snapshot period at 10 second(s).
17/09/17 05:40:26 INFO impl.MetricsSystemImpl: NameNode metrics system started
17/09/17 05:40:26 INFO namenode.NameNode: fs.defaultFS is file:///
17/09/17 05:40:26 WARN util.NativeCodeLoader: Unable to load native-hadoop library for your platform... using builtin-java classes where applicable
17/09/17 05:40:26 ERROR namenode.NameNode: Failed to start namenode.
java.lang.IllegalArgumentException: Invalid URI for NameNode address (check fs.defaultFS): file:/// has no authority.
	at org.apache.hadoop.hdfs.DFSUtilClient.getNNAddress(DFSUtilClient.java:631)
	at org.apache.hadoop.hdfs.DFSUtilClient.getNNAddressCheckLogical(DFSUtilClient.java:660)
	at org.apache.hadoop.hdfs.DFSUtilClient.getNNAddress(DFSUtilClient.java:622)
	at org.apache.hadoop.hdfs.server.namenode.NameNode.getRpcServerAddress(NameNode.java:531)
	at org.apache.hadoop.hdfs.server.namenode.NameNode.loginAsNameNodeUser(NameNode.java:662)
	at org.apache.hadoop.hdfs.server.namenode.NameNode.initialize(NameNode.java:682)
	at org.apache.hadoop.hdfs.server.namenode.NameNode.<init>(NameNode.java:898)
	at org.apache.hadoop.hdfs.server.namenode.NameNode.<init>(NameNode.java:877)
	at org.apache.hadoop.hdfs.server.namenode.NameNode.createNameNode(NameNode.java:1603)
	at org.apache.hadoop.hdfs.server.namenode.NameNode.main(NameNode.java:1671)
17/09/17 05:40:26 INFO util.ExitUtil: Exiting with status 1
17/09/17 05:40:26 INFO namenode.NameNode: SHUTDOWN_MSG:
/************************************************************
SHUTDOWN_MSG: Shutting down NameNode at imac-de-nakedip/123.456.7.89
************************************************************/

Je suis un peu dégoûter d'être bloquer au moment ou sa devient intéressant mdr

Même si je suis sûr que je finirais par trouver le problème je voulais voir si cela t'est familier.

En tout cas merci pour le cours il commence bien (y)

Edit : Bon bah j'ai trouver le problème était tout bête il fallait juste que je dorme un peu mdr

J'avais simplement pas activer les sessions à distance dans les preferences système :-°

Par contre maintenant j'ai un soucis avec le python :

from hdfs import InsecureClient
client = InsecureClient("http://0.0.0.0:50070")

# La il me dit :
# ImportError: cannot import name 'InsecureClient'

client = hdfs.InsecureClient("http://0.0.0.0:50070")

# et la il me dit :
# AttributeError:
# module 'hdfs' has no attribute 'InsecureClient'


C'est sûrement encore un détail tout bête mais c'est les trucs du genre que je met le plus de temp à trouver généralement >_< donc je demande ici au cas oû je reste bloqué dessus plus longtemp que prévu

-
Edité par Lbekri 18 septembre 2017 à 0:59:45

  • Partager sur Facebook
  • Partager sur Twitter
18 septembre 2017 à 8:59:28

Bonjour Lbekri,

Le problème que tu rencontres est que le module `hdfs` que tu importes ne contient pas la classe `InsecureClient`. Ca peut être dû à plusieurs raisons.

  • Déjà, peux-tu vérifier que le module `hdfs` est bien installé dans sa version 2.1.0 ? Tu peux voir la version installée à l'aide de la commande `pip freeze | grep hdfs`. Si ce n'est pas le cas tu peux mettre à jour le module en exécutant `pip install -U hdfs`.
  • Ensuite, est-ce que tu n'aurais pas un répertoire nommé `hdfs` dans le répertoire courant ? Ca pourrait troubler l'import de modules de python. Si c'est le cas, essaye d'exécuter ce script à partir d'un autre répertoire, ou de renommer le répertoire `hdfs`.
  • Si les deux points précédents n'ont rien amélioré, peux-tu me donner la valeur de la variable python `hdfs.__path__` ?
  • Partager sur Facebook
  • Partager sur Twitter
19 septembre 2017 à 19:57:36

# Je suis bien avec la bonne version
pip freeze | grep hdfs
Warning: cannot find svn location for setuptools===0.6c12dev-r88846
hdfs==2.1.0

# En changeant le nom du dossier l'erreur a changer
python3 train.py
Traceback (most recent call last):
  File "train.py", line 2, in <module>
    import hdfs
ModuleNotFoundError: No module named 'hdfs'

Cependant j'ai python3 et python qui est dans sa version 2.7 serait-il possible que lorsque je lance pip install hdfs il ne le fasse que pour la version de python en 2.7 ? Si oui saurait-tu comment y remédier ?

Merci pour ton aide btw c'est très appreciable :)

Ah oui et pour la valeur de la variable hdfs.__path__ vu qu'il ne trouve pas le module hdfs maintenant j'ai du rechanger le nom du dossier hdfs qui se trouve dans le repertoire courant ..

Python 3.6.2 (default, Sep 17 2017, 17:51:44)
[GCC 4.2.1 Compatible Apple LLVM 6.0 (clang-600.0.57)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> hdfs.__path__
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
NameError: name 'hdfs' is not defined
>>> import hdfs
>>> hdfs.__path__
_NamespacePath(['/Users/mbeckert/code/hdfs'])



-
Edité par Lbekri 19 septembre 2017 à 20:09:43

  • Partager sur Facebook
  • Partager sur Twitter
21 septembre 2017 à 9:38:51

@Lbekri,

Tu as deux problèmes :

  • 1) tu installes `hdfs` avec python 2.7 alors que tu exécutes ton programme avec python 3.6. C'est comme si c'était deux langages complètement différents, ils ne partagent pas du tout les mêmes modules. Je te suggère de tout faire avec python 3.6. Pour commencer, il faut installer `hdfs` pour python 3.
La solution un peu "sale" consiste à installer directement `hdfs` pour python 3 dans tout le système :
pip3 install hdfs

La solution "propre" consiste à utiliser un environnement virtuelpour python 3 et à installer `hdfs` dans cet environnement :
virtualenv --python=python3 ./env
source ./env/bin/activate
pip install hdfs


Pour en apprendre plus sur les environnements virtuels, je te suggère de consulter ce chapitre de cours : https://openclassrooms.com/courses/manipulez-des-donnees-avec-python-1/travaillez-dans-un-environnement-virtuel

  •  2) tu as un répertoire `hdfs` qui embrouille l'import de module. En gros, au moment où tu exécutes `import hdfs` python regarde d'abord s'il y a un répertoire `hdfs` ou un module `hdfs.py` dans le répertoire courant, puis ensuite il regarde parmi les packages installés. Donc soit tu renommes le répertoire `hdfs` en autre chose (`mv hdfs hdfs-pouac`) soit tu déplaces le script dans un autre répertoire, qui ne contiendra pas  de sous-répertoire `hdfs`.
  • Partager sur Facebook
  • Partager sur Twitter
21 septembre 2017 à 17:46:17

Ah voila je me disait bien qu'il y avait un truc du genre :lol:

Merci c'est nickel maintenant, super cours encore une fois !

  • Partager sur Facebook
  • Partager sur Twitter
5 novembre 2017 à 15:20:11

Hello,

Pour ma part mon cluster fonctionne (cependant il est très lent) j'ai tout installe dans une vm avec vagrant.

Lorsque je veux exécuter le script paris.py avec la version python 3 (que j'ai installe) j'ai le message suivant:

-
Edité par Raphynet 6 novembre 2017 à 9:18:25

  • Partager sur Facebook
  • Partager sur Twitter
6 novembre 2017 à 18:58:17

@Raphynet,

Pour une raison étrange, le script cherche à écrire dans le fichier avec un encoding 'latin-1', et non utf-8. Je vois que tu es sous Ubuntu Precise ? Cette distribution date de 2012, ce qui fait... un peu vieux :-p Je te suggère de lancer une autre machine virtuelle plus récente. Par exemple, avec Vagrant, voilà comment lancer une Ubuntu 16.04 (de 2016) :

    vagrant init ubuntu/xenial64

    vagrant up

  • Partager sur Facebook
  • Partager sur Twitter
13 novembre 2017 à 11:16:45

Quelle architecture adopter ? Pour les namenode et datanode? Faut il un serveur physique ou une VM ? Faut il un os par datanode?  Y'a t'il un outils qui nous permet de scaler automatiquement? À savoir si mes datanode sont pleins creer automatiquement des commandes qui créerons des nouveaux datanode?

Merci d'avance.

PS: le lancement de la commande vagrant init ubuntu/xenial64

    vagrant up à fonctionné merci

  • Partager sur Facebook
  • Partager sur Twitter
13 novembre 2017 à 12:02:40

> Quelle architecture adopter ? Pour les namenode et datanode? Faut il un serveur physique ou une VM ?

Peu importe. Les deux doivent convenir.

> Faut il un os par datanode?

Euh non. Dans le cours on lance deux datanodes sur la même machine... Par ailleurs, il est tout à fait possible de lancer un datanode dans un conteneur docker.

> Y'a t'il un outils qui nous permet de scaler automatiquement? À savoir si mes datanode sont pleins creer automatiquement des commandes qui créerons des nouveaux datanode?

Oui, mais ces outils sont indépendants de HDFS. Ils appliquent des règles "si espace disque < SEUIL alors lancer une machine supplémentaire". Par exemple, sur Amazon Web Services il est possible de mettre en place de l'autoscaling (voir la dernière partie du cours https://openclassrooms.com/courses/realisez-des-calculs-distribues-sur-des-donnees-massives). Pareil avec openstack et docker swarm.

  • Partager sur Facebook
  • Partager sur Twitter
22 novembre 2017 à 12:19:54

Merci pour tes réponses.

En faite je cherchai a savoir quelles sont les best practice (performance) pour installer un cluster Hdfs en production.

Voici ce que j'ai pense faire, ai je raison, ou ai je trop bu au bar de "L'école buissonnière" ;-)

Mon idée est de partir sur 2 vm sur 2 hôtes différents pour mon namenode et sa réplication, afin de sécuriser mon installation, si un namenode tombe je le remplace par le 2 eme.

Ensuite pour les datanodes (qui sont des baies physique différentes sur des hébergeur différents) est ce que je perds en performance si je créer 1 seul vm avec 3 datanodes ? ou il vaut mieux creer 1 vm par datanode? 

D'avance merci pour tes reponses.

Ps: Merci pour ton cours il est extra.

  • Partager sur Facebook
  • Partager sur Twitter
23 novembre 2017 à 10:21:00

@Raphynet :

1. Merci pour tes encouragements !

2. L'abus d'alcool est dangereux pour la santé, consomme les ti-punch de l'école buissonnière avec modération.

Pour le namenode on dirait que tu fais le bon choix. Par contre je ne comprends pas l'intérêt de mettre 3 datanodes sur la même VM. En même temps, tu dis que ces datanode sont chez des hébergeurs différents ? J'ai l'impression qu'il y a une contradiction dans ce que tu écris, mais je comprends peut-être mal ? L'idée c'est que si une VM devient indisponible (par exemple si tu configures mal ton firewall ou que la VM tombe à court d'espace disque) le cluster hdfs continuera de fonctionner. Avoir plusieurs datanodes sur la même VM va faire baisser les performances de la VM sans augmenter la tolérance aux pannes.

  • Partager sur Facebook
  • Partager sur Twitter
27 novembre 2017 à 10:12:56

Perfect merci pour tes réponses.
  • Partager sur Facebook
  • Partager sur Twitter
18 mars 2018 à 18:57:04

Bonjour à tous,

Le cours est très interessant et bien expliqué. Pour ma part, je rencontre 2 soucis :

1) Tout comme @Raphynet, j'obtiens une erreur d'encodage lorsque je lance le script paris.py. J'ai donc forcé le script à utiliser utf8 mais rien n'y fait. Aussi j'utilise une VM sur AWS récente je pense ubuntu/images/hvm-ssd/ubuntu-xenial-16.04-amd64-server

2) J'utilise un virtual env dans lequel j'exécute pip install fastavro, mais celui ci est en erreur :

J'ai pourtant bien activé le virtual env juste avant

Merci pour votre aide

-
Edité par MelissaOCC 18 mars 2018 à 18:58:01

  • Partager sur Facebook
  • Partager sur Twitter

Mentor Data Architect / AI Engineer

28 juin 2018 à 18:06:39

@Méli94 : je réponds très tard à votre question...

1) Vous utilisez bien python3 ? Vous pouvez vérifier la version de python utilisée en exécutant "python --version".

2) L'erreur à noter est "Python.h: No such file or directory". Cela signifie que vous n'avez pas les headers de développement de python nécessaires à la compilation de fastavro. Sous ubuntu, ces headers peuvent être installés en exécutant :

    sudo apt install python3-dev

-
Edité par RégisB. 28 juin 2018 à 18:12:43

  • Partager sur Facebook
  • Partager sur Twitter
8 mai 2019 à 18:29:58

Bonjour,

Merci pour ce cours très intéressant et bien expliqué.

Dans la partie Avro, je rencontre un soucis lors de l'execution du script de sérialisation donné en exemple dans le cours.

En local, ça fonctionne très bien, mais si j'essaye d'écrire le résultat sur hdfs avec le client du même nom, j'ai le message "Errno 111 connection refused".

Je n'avais déjà pas réussi a me connecter sur l'interface d'administration de hdfs, je suppose que c'est lié, mais je ne trouve pas la solution.

J'ai installé hdfs et avro sur une machine virtuelle sous ubuntu 16.04 (avec python3)

Si quelqu'un avait une idée, ça m'arrangerait bien, je suis bloqué depuis plusieurs jours... ^^

Merci par avance

  • Partager sur Facebook
  • Partager sur Twitter
10 mai 2019 à 16:58:14

Bonjour TotemPremier,

(Débutant aussi, mes indications sont à prendre avec réserve.)

Je pense qu'il s'agit d'un problème de port :

Si tu as suivi l'exemple à la lettre, tu dois avoir dans ton fichier .py :

      hdfs_client = hdfs.InsecureClient("http://0.0.0.0:50070")


=> Regarde dans ton fichier de configuration  etc/hadoop/core-site.xml  :

<value>hdfs://localhost:9000</value>

Tant que ces 2 valeurs de port ne sont pas identiques, j'avais le même message que toi.

J'ai indiqué le port 50070 dans le fichier core-site.xml et relancé le namenode.

--> Bonne nouvelle : ce message d'erreur n'apparaît plus !

Ceci dit, je serai très intéressé d'avoir plus d'information sur la suite car de mon côté, j'ai un autre message d'erreur :

  • A l'exécution du script :

Connection aborted.', BadStatusLine('\x00\x00\x00|{\x08ÿÿÿÿ\x0f\x10\x02\x18\t")org.apache.hadoop.ipc.RPC$VersionMismatch*>Server IPC version 9 cannot communicate with client version 470\x0e:\x00@\x01

  • côté Namenode, il me confirme le problème de version :

2019-05-10 16:47:38,112 WARN ipc.Server: Incorrect header or version mismatch from 127.0.0.1:55820 got version 47 expected version 9


Ma version Hadoop est la 3.1.2, et d'après pip freeze, la version hdfs est 2.5.2

(venv) pierre@pierre-HP-G72:~/code/python$ pip freeze
certifi==2019.3.9
chardet==3.0.4
docopt==0.6.2
fastavro==0.21.23
hdfs==2.5.2
idna==2.8
pkg-resources==0.0.0
requests==2.21.0
six==1.12.0
urllib3==1.24.3

Savez-vous comment régler ce problème ?

Merci d'avance,

Pierre

  • Partager sur Facebook
  • Partager sur Twitter
11 mai 2019 à 15:39:20

Bonjour Pierre,

Bien vu l'aveugle, c'était bien ça. J'utilise localhost:9000 dans core-site.xml et dans le script, ça passe, mais pas longtemps :

Je me cogne depuis sur le même problème de header (lesquels) ou version  que toi.

- J'ai vu qu'il y avait un module hdfs3 pour python, je me suis dit qu'il était bien pour pyton3, mais il ne contient pas .InsecureClient (). C'est ballot.

- Je suis aussi avec la version 3.1.2 de hadoop. Je me suis aperçu que le cours utilisait la version 2.8.1. La loi de l'emmerdement maximum fait que cette version a plus de 2 ans et est introuvable. J'ai essayé avec la 2.8.5, j'étais très confiant en voyant qu je pouvais accéder au site d'administration de hdfs, mais je me suis repris la même erreur avec le script.

Je viens de trouver une version 2.8.4, je vais voir ce que ça donne, mais je ne suis plus trop optimiste.

Après, je ne sais pas où chercher...

  • Partager sur Facebook
  • Partager sur Twitter
14 mai 2019 à 11:50:00

Bonjour,
Merci pour ce cours que je viens de suivre.
Je suis parti sur la version hadoop 3.1.2. mais j'ai l'impression d'avoir des soucis avec les ports d'écoute.

1) Tout d'abord, les telnet sur les ports par défaut 50070 et 50075 ne donnent rien.
2) L'interface admin ne répond pas sur http://localhost:50070
3) Ensuite en lançant les 3 datanodes avec les conf xml spécifiant les ports de l'exercice, j'arrive à en lancer un mais pour les suivants, j'ai le mg d'erreur :
Faut il changer le fichier hdfs-site.xml pour indiquer le chemin des 3 datanodes ? (quelle modif par rapport au lancement avec 1 seul datanode comme précédemment dans le cours?).
"datanode is running as process 7465.  Stop it first."
4) du coup mes connexion via python ne fonctionnent pas sur le port 50070

Merci pour votre aide

  • Partager sur Facebook
  • Partager sur Twitter
11 juin 2019 à 23:33:09

Bonjour,

Depuis hadoop 3.0 les ports ont changés :

https://issues.apache.org/jira/browse/HDFS-9427 la liste des ports changés (en gros plus de ports éphémères)

La doc actuelle d'hadoop/hdfs est ici : https://hadoop.apache.org/docs/r3.1.2/

Pour le port 50070 (port par défaut de l'interface http du namenode) c'est maintenant par défaut le port 9870

-
Edité par JulienLeroux38 11 juin 2019 à 23:33:34

  • Partager sur Facebook
  • Partager sur Twitter
30 août 2019 à 1:25:25

Merci pour vos réponses

-
Edité par Data100drine 4 septembre 2019 à 10:05:52

  • Partager sur Facebook
  • Partager sur Twitter
8 novembre 2019 à 12:05:32

Bonjour,

J'ai un souci lorsque je lance plusieurs datanodes sur ma machine: 

je lance le namenode: ./bin/hdfs namenode

puis le premier datanode: ./bin/hdfs datanode -conf /home/francois/Hadoop/hadoop-3.1.2/etc/hadoop/datanode1.xml 

puis le second, et la j'ai cette erreur: datanode is running as process 9897.  Stop it first.

le fichier de conf a l air d'être pris en compte mais il refuse dans mon cas de lancer 2 fois la commande datanode..

Quelqu'un aurait eu ce problème? Ou peut m'aider?

Merci :)

EDIT:

ça fonctionne avec hadoop 2.10 ...

-
Edité par f2buttet 24 janvier 2020 à 9:04:27

  • Partager sur Facebook
  • Partager sur Twitter
2 mars 2020 à 11:55:55

Bonjour

J'ai la même erreur que @f2buttet je suis sur hadoop 3.1.3!!

justement le système ne veut pas lancer plus d'un datanode à la fois! Besoin d'aide SVP

Merci d'avance

  • Partager sur Facebook
  • Partager sur Twitter
29 septembre 2020 à 17:06:21

f2buttet a écrit:

Bonjour,

J'ai un souci lorsque je lance plusieurs datanodes sur ma machine: 

je lance le namenode: ./bin/hdfs namenode

puis le premier datanode: ./bin/hdfs datanode -conf /home/francois/Hadoop/hadoop-3.1.2/etc/hadoop/datanode1.xml 

puis le second, et la j'ai cette erreur: datanode is running as process 9897.  Stop it first.

le fichier de conf a l air d'être pris en compte mais il refuse dans mon cas de lancer 2 fois la commande datanode..

Quelqu'un aurait eu ce problème? Ou peut m'aider?

Merci :)

EDIT:

ça fonctionne avec hadoop 2.10 ...

-
Edité par f2buttet 24 janvier 2020 à 9:04:27

Idem, j'ai le même problème...

EDIT: Du coup, j'ai fais un multinode sur AWS avec https://medium.com/@jootorres_11979/how-to-set-up-a-hadoop-3-2-1-multi-node-cluster-on-ubuntu-18-04-2-nodes-567ca44a3b12

-
Edité par PierrePoitevin 2 octobre 2020 à 15:39:52

  • Partager sur Facebook
  • Partager sur Twitter