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.
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
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__` ?
# 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'])
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 :
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`.
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) :
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
> 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.
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?
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.
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
@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 :
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...
=> 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
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.
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
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
Mentor Data Architect / AI Engineer