Bienvenue dans ce cours sur le calcul distribué et les données massives !
Ce cours est le premier d'une série visant à former au métier de data architect ; on commence sur un gros morceau avec Hadoop MapReduce, Spark et le lancement de clusters de calculs sur AWS.
Je suis un peu occupé à réaliser les prochains cours de la série (en collaboration avec CentraleSupelec), mais je tâcherai de répondre promptement à vos questions. Ne soyez pas timides !
Par contre, si vous avez une question concernant le fonctionnement du cours (accès aux exercices, envoi des exercices, inscription au cours...), contactez plutôt OpenClassrooms à hello@openclassrooms.com.
Je viens de finir la 1ère partie et je pense qu'il comporte une erreur. Vous indiquez que les caractères utf-8 comportent 4 octets : ce n'est pas le cas.
Les caractères Unicode supportent plusieurs encodages. Sous Windows, chaque caractère Unicode comporte 2 octets (je ne sais plus si c'est UCS-2 ou UTF-16, big endian ou little endian). En UTF-8, le nombre d'octets pour un caractère est variable. Les caractères Unicode en dessous de 127 sont représentés avec un seul octet, les autres avec 2 voire 3 selon leur position. L'utf-8 est donc plus efficace pour les langues occidentales. Par contre, on ne peut pas connaître la longueur de la chaîne (en nombre de caractères) sans la parcourir et la décoder.
Sinon le cours est excellent, mais cette imprécision dans les premières lignes m'a troublé...
@TresorDjonga : Je ne crois pas que cela soit possible. Cependant, le contenu des cours est en licence CC-BY-NC-SA, ce qui vous autorise à dupliquer le contenu du cours, et même à le diffuser (avec attribution et sans utilisation commerciale). Est-ce que je peux vous demander quel est le scénario d'utilisation ?
@GuillaumeDuBourguet : oui, effectivement, en unicode les caractères peuvent être stockés sur un nombre variable d'octets. Dans le cours on a écrit "Chaque caractère stocké dans un ordinateur requiert environ quatre octets quand il est stocké au format utf-8". En fait, le "environ" devrait être compris comme "en moyenne". Et encore, c'est une moyenne tout à fait arbitraire. Je vais reformuler cette phrase pour clarifier.
J'ai relevé 2 bugs dans le code proposé de WordCountReducer.py de la section "Familiarisez-vous avec Hadoop" :
Le nombre d’occurrences calculé est incorrect.
La dernière valeur n'est pas retournée.
Ci-dessous une proposition de correction:
#!/usr/bin/env python3
import sys
total = 0
lastword = None
for line in sys.stdin:
line = line.strip()
# recuperer la cle et la valeur et conversion de la valeur en int
word, count = line.split()
count = int(count)
# passage au mot suivant (plusieurs cles possibles pour une meme execution de programme)
if lastword is None:
lastword = word
if word == lastword:
total += count
else:
print("%s\t%d occurences" % (lastword, total))
total = count # !!! count au lieu de 0
lastword = word
if lastword is not None:
print("%s\t%d occurences" % (lastword, total)) # !!! On affiche le dernier element traite
De plus, j'ai également ajouté le shebang python3 aux deux fichiers WordCount*.py.
Cordialement,
Eric
- Edité par EricBouteillon 29 juillet 2017 à 0:34:35
Je crois avoir relevé une faute de frappe dans le Latex à la section 6 du cours sur la multiplication matrice-vecteur. Soit A est une matrice carrée nxn et donc Av=x avec x de taille n et non m. Ou A de taille mxn, v taille n. Ou A taille n,m; v taille m et x taille n.
Merci pour ce cours très bien vulgarisé. Le code Python d'implem est d'une grande valeur ajoutée et j'espère que l'on retrouvera des scripts similaires d'application pour les prochains cours.
En revanche lorsque je lance Yarn, le RessourceManager se lance bien, mais pas le NodeManager :
2017-10-07 11:00:19,510 FATAL org.apache.hadoop.yarn.server.nodemanager.NodeManager: Error starting NodeManager org.apache.hadoop.yarn.exceptions.YarnRuntimeException: org.apache.hadoop.yarn.exceptions.YarnRuntimeException: Recieved SHUTDOWN signal from Resourcemanager ,Registration of NodeManager failed, Message from ResourceManager: NodeManager from DataScience-PC doesn't satisfy minimum allocations, Sending SHUTDOWN signal to the NodeManager.
Une idée ?
Cyril
- Edité par CyrilLegrand2 7 octobre 2017 à 11:03:25
A vue de nez, je dirais que tu n'as soit pas assez de RAM disponible, soit pas assez d'espace disque. Les quantités nécessaires peuvent être spécifiées par un paramètre de configuration, comme expliqué dans le lien ci-dessus.
Au temps pour moi, en testant le code python en local sans Hadoop, je me suis rendu compte que l'encodage posait problème après copié collé d'internet ... Du coup j'ai bien spécifié utf-8 et corrigé les caractères non reconnus et mon WordCount passe maintenant ...
Je peux continuer !
####
Bonjour,
Je progresse lentement, c'était effectivement un problème d'allocation de mémoire et vcores que j'ai paramétré plus finement dans yarn-site.xml et mapred-site.xml. J'arrive à présent à lancer mon NodeManager.
Par contre je bloque maintenant sur une autre erreur pendant le map et malheureusement, l'erreur ne me parle pas du tout.
J'ai 7 containers qui me renvoient tous ce même message :
packageJobJar: [/tmp/hadoop-unjar6771583347744548964/] [] /tmp/streamjob8955362784324894983.jar tmpDir=null 17/10/23 17:05:26 INFO client.RMProxy: Connecting to ResourceManager at /0.0.0.0:8032 17/10/23 17:05:26 INFO client.RMProxy: Connecting to ResourceManager at /0.0.0.0:8032 17/10/23 17:05:27 INFO mapred.FileInputFormat: Total input paths to process : 1 17/10/23 17:05:27 INFO mapreduce.JobSubmitter: number of splits:2 17/10/23 17:05:27 INFO mapreduce.JobSubmitter: Submitting tokens for job: job_1508770794272_0002 17/10/23 17:05:27 INFO impl.YarnClientImpl: Submitted application application_1508770794272_0002 17/10/23 17:05:27 INFO mapreduce.Job: The url to track the job: http://DataScience-PC:8088/proxy/application_1508770794272_0002/ 17/10/23 17:05:27 INFO mapreduce.Job: Running job: job_1508770794272_0002 17/10/23 17:05:35 INFO mapreduce.Job: Job job_1508770794272_0002 running in uber mode : false 17/10/23 17:05:35 INFO mapreduce.Job: map 0% reduce 0%
17/10/23 17:05:39 INFO mapreduce.Job: Task Id : attempt_1508770794272_0002_m_000001_0, Status : FAILED Error: java.lang.RuntimeException: PipeMapRed.waitOutputThreads(): subprocess failed with code 1 at org.apache.hadoop.streaming.PipeMapRed.waitOutputThreads(PipeMapRed.java:322) at org.apache.hadoop.streaming.PipeMapRed.mapRedFinished(PipeMapRed.java:535) at org.apache.hadoop.streaming.PipeMapper.close(PipeMapper.java:130) at org.apache.hadoop.mapred.MapRunner.run(MapRunner.java:61) at org.apache.hadoop.streaming.PipeMapRunner.run(PipeMapRunner.java:34) at org.apache.hadoop.mapred.MapTask.runOldMapper(MapTask.java:453) at org.apache.hadoop.mapred.MapTask.run(MapTask.java:343) at org.apache.hadoop.mapred.YarnChild$2.run(YarnChild.java:164) at java.security.AccessController.doPrivileged(Native Method) at javax.security.auth.Subject.doAs(Subject.java:422) at org.apache.hadoop.security.UserGroupInformation.doAs(UserGroupInformation.java:1746) at org.apache.hadoop.mapred.YarnChild.main(YarnChild.java:158)
... (x 7 containers)
Merci pour vos conseils.
- Edité par CyrilLegrand2 23 octobre 2017 à 19:21:09
petite question anodine concernant la formule donnée dans l’énoncé de l'exercice sur TF-IDF:
w_t,d = n_d × tf_t,d × log(N/df_t)
avec :
tf_t,d qui représente la fréquence d'un mot t dans un document d. Tiens... cela ne vous rappelle rien ?
n_d qui représente le nombre de mots dans un document d (on pourra l'appeler WordPerDoc).
df_t qui représente la fréquence du terme dans la collection, soit le nombre de documents dans lequel le mot t est présent (dans notre cas, ce sera 1 ou 2).
Enfin N est le nombre de documents dans notre collection, soit ici 2.
Pour la mission 2, calcul du PageRank, à la lecture de plusieurs articles, il semble que la formule soit P=(1-s)T + s et non pas P=(1-s)T +s/n, est-ce que ma comprehension est correcte ?
Effectivement, pas d'erreur dans la formule du PageRank, c'est moi qui avait mal interprété un article.
J'ai par contre un question, après seulement 3 itérations, j'ai des PR stabilisés, mais très faibles (de l'ordre de 10E-5) est-ce que ça semble cohérent ?
J'ai une erreur "ssh_exchange_identification: Connection closed by remote host" lors de la connexion en ssh au noeud maître de mon cluster créé en suivant le tutoriel. Est ce que quelqu'un a déjà eu cette erreur?
debug1: Reading configuration data /Users/Hasna/.ssh/config
debug1: /Users/Hasna/.ssh/config line 2: Applying options for *.compute.amazonaws.com
debug1: Reading configuration data /etc/ssh/ssh_config
debug2: resolving "ec2-54-77-132-215.eu-west-1.compute.amazonaws.com" port 22
debug2: ssh_connect_direct: needpriv 0
debug1: Connecting to ec2-54-77-132-215.eu-west-1.compute.amazonaws.com [54.77.132.215] port 22.
debug1: Connection established.
debug1: key_load_public: No such file or directory
debug1: identity file /Users/Hasna/.ssh/hasna-ec2.pem type -1
debug1: key_load_public: No such file or directory
debug1: identity file /Users/Hasna/.ssh/hasna-ec2.pem-cert type -1
debug1: Enabling compatibility mode for protocol 2.0
debug1: Local version string SSH-2.0-OpenSSH_7.4
ssh_exchange_identification: Connection closed by remote host
Question 2 :
Au niveau de la création d'un cluster Hadoop avec Amazon AWS EMR, dans le cours, on utilise m3.xlarge qui n'est pas pas incluse dans l'offre gratuite d'AWS. Y-a-t il une configuration EMR gratuite ?
Je viens de terminer ce cours dans le cadre de mon parcours Data Architect. Il est très bien fait et permet d'acquérir un solide background dans le domaine. Bravo à l'auteur.
Je suis en attente de mes notes pour les activités (je sais que le délai est important, je patiente). J'ai eu quelques difficultés avec le pagerank. Est-ce qu'il sera possible d'avoir la correction (ou au moins en partie) ?
Merci.
Rien n'arrive dans la vie... ni comme on le craint, ni comme on l'espère.
Je suis en train de corriger les exercices MapReduce de 3 candidats (j'ai soumis le mien hier) mais pour certaines questions il faut que je compare les résultats obtenus par le candidat avec les résultats "attendus". Je n'ai trouvé nulle part de corrigé type me permettant de faire cette comparaison, où puis-je trouver cela? Il n'y a aucun fichier avec les résultats attendus dans l'interface de correction des exercices.
Bonjour, Merci pour le cours bien expliqué. J'ai un souci à la section 3.Familiarisez-vous avec Hadoop. J'ai la même erreur avec le WordCount.jar et le streaming python. Je suis sous ubuntu 14.04 lts et j'ai installé hadoop en mode pseudo-distribué. Je pense, d'après l'erreur, avoir fait une mauvaise configuration mais je ne vois pas comment le résoudre. Auriez-vous des propositions?
cmd: hadoop/bin/hadoop jar ooc_cours1_wordcount.jar ooc.cours1.wordcount.WordCountDriver input/montexte.txt output
error:
...
... 18/04/09 17:52:13 INFO ipc.Client: Retrying connect to server: 0.0.0.0/0.0.0.0:8032. Already tried 8 time(s); retry policy is RetryUpToMaximumCountWithFixedSleep(maxRetries=10, sleepTime=1000 MILLISECONDS) 18/04/09 17:52:14 INFO ipc.Client: Retrying connect to server: 0.0.0.0/0.0.0.0:8032. Already tried 9 time(s); retry policy is RetryUpToMaximumCountWithFixedSleep(maxRetries=10, sleepTime=1000 MILLISECONDS) 18/04/09 17:52:14 INFO retry.RetryInvocationHandler: java.net.ConnectException: Your endpoint configuration is wrong; For more details see: http://wiki.apache.org/hadoop/UnsetHostnameOrPort, while invoking ApplicationClientProtocolPBClientImpl.getNewApplication over null after 1 failover attempts. Trying to failover after sleeping for 39896ms.
Voici une piste en l'absence de plus de précisions sur ton problème: la syntaxe que tu utilises pour print est celle de Python 2. Donc, si tu utilises Python 3, il faut rajouter des parenthèses, ce qui donne:
print(word.encode("utf8"), count)
Michel.
Rien n'arrive dans la vie... ni comme on le craint, ni comme on l'espère.