De nombreux débutants de Hadoop sont probablement les mêmes. Puisqu'il n'y a pas assez de ressources de machine, je ne peux que créer une pseudo-distribution de Hadoop installée dans la machine virtuelle. Ensuite, j'utilise l'idée Eclipse ou IntelliJ dans Win7 pour écrire des tests de code. La question est donc de savoir comment soumettre à distance la carte / réduire les tâches à la débogage hadoop et un point d'arrêt distant dans Win7?
1. Préparation
1.1 Dans Win7, trouvez un répertoire et décompressez Hadoop-2.6.0. Dans cet article, d: /yangjm/code/study/hadoop/hadoop-2.6.0 (ce qui suit est représenté par $ hadoop_home)
1.2 Ajouter plusieurs variables d'environnement dans Win7
Hadoop_home = d: /yangjm/code/study/hadoop/hadoop-2.6.0
Hadoop_bin_path =% hadoop_home% / bin
Hadoop_prefix = d: /yangjm/code/study/hadoop/hadoop-2.6.0
De plus, la variable de chemin est ajoutée à la fin; % Hadoop_home% / bin
2. Débogage à distance d'éclipse
1.1 Télécharger le plugin Hadoop-Eclipse-Plugin
Hadoop-Eclipse-Plugin est un plugin Hadoop spécialement utilisé pour Eclipse, qui peut afficher le répertoire et le contenu de fichier de HDFS directement dans l'environnement IDE. Son code source est hébergé sur GitHub, et l'adresse officielle du site Web est https://github.com/winghc/hadoop2x-eclipse-plugin
Si vous êtes intéressé, vous pouvez télécharger le code source et le compiler vous-même. Baidu prendra beaucoup d'articles, mais si vous utilisez simplement https://github.com/winghc/hadoop2x-eclipse-plugin/tree/master/release%20, diverses versions compilées sont fournies ici. Utilisez-le simplement directement. Copiez le Hadoop-Eclipse-Plugin-2.6.0.0.0. de Hadoop-Eclipse-Plugin-2.6.0.jar dans le répertoire Eclipse / Plugins, puis redémarrez Eclipse. Tout est fait.
1.2 Téléchargez le package de plug-in Hadoop2.6 pour la plate-forme Windows64 bits (Hadoop.dll, WinUtils.exe)
Sous Hadoop-Common-Project / Hadoop-Common / SRC / Main / WinUtils dans le code source Hadoop2.6.0, il y a un projet VS.NET. La compilation de ce projet peut obtenir ce tas de fichiers et de fichiers de sortie.
Hadoop.dll et WinUtils.exe sont les plus utiles. Copiez WinUtils.exe dans le répertoire $ HADOOP_HOME / BIN, et copiez Hadoop.dll dans le répertoire% Windir% / System32 (principalement pour empêcher le plug-in de signaler diverses erreurs inexplicables, telles que les références d'objets vides).
Remarque: Si vous ne souhaitez pas compiler, vous pouvez télécharger directement le fichier compilé Hadoop2.6 (x64) v0.2.rar
1.3 Configuration du plugin Hadoop-Eclipse-Plugin
Démarrer Eclipse, Windows-> Afficher la vue-> Autre
Fenêtre-> Préférences-> Hadoop Map / Réduction Spécifiez le répertoire racine de Hadoop sur Win7 (c'est-à-dire: $ hadoop_home)
Ensuite, dans le panneau Map / Réduction des emplacements, cliquez sur l'icône Baby Elephant
Ajouter un emplacement
Cette interface est très importante. Je vais expliquer plusieurs paramètres:
Le nom de l'emplacement est juste un nom, appelez-le
MAP / Réduction (V2) Hôte maître voici l'adresse IP correspondant au maître Hadoop dans la machine virtuelle. Le port ci-dessous correspond au port spécifié par l'attribut dfs.datanode.ipc.Address dans hdfs-site.xml
Port maître DFS: Le port correspond ici au port spécifié par Fs.defaultfs dans core-site.xml
Le dernier nom d'utilisateur doit être le même que le nom d'utilisateur qui exécute Hadoop dans la machine virtuelle. J'ai installé et couru Hadoop 2.6.0 avec Hadoop, alors remplissez Hadoop ici. Si vous l'avez installé avec root, changez-le en racine en conséquence.
Une fois ces paramètres spécifiés, cliquez sur Terminer et Eclipse pour savoir comment se connecter à Hadoop. Si tout se passe bien, vous pouvez voir les répertoires et les fichiers dans HDFS dans le panneau Explorer Project.
Vous pouvez cliquer avec le bouton droit sur le fichier et sélectionner Supprimer pour essayer. Habituellement, la première fois est échoué, et il y aura beaucoup de choses. L'idée générale est que les autorisations sont insuffisantes. La raison en est que l'utilisateur de connexion Win7 actuel n'est pas l'utilisateur exécutif de Hadoop dans la machine virtuelle. Il existe de nombreuses solutions. Par exemple, vous pouvez créer un nouvel utilisateur d'administrateur Hadoop sur Win7, puis passer à Hadoop pour vous connecter à Win7, puis utiliser Eclipse pour se développer. Cependant, c'est trop ennuyeux, le moyen le plus simple:
Ajouté dans HDFS-site.xml
<propriété> <nom> dfs.permissions </name> <value> false </value> </ propriété>
Ensuite, dans la machine virtuelle, exécutez Hadoop Dfsadmin -SafeMode Leave
Pour être en sécurité, un autre Hadoop FS -chmod 777 /
En bref, il s'agit de désactiver complètement la détection de sécurité de Hadoop (il n'y en a pas besoin dans la phase d'apprentissage, ne le faites pas lorsqu'il est officiellement produit), enfin redémarrer Hadoop, puis aller à Eclipse et répéter l'opération de fichier de suppression tout à l'heure, et ça devrait aller.
1.4 Création d'un échantillon de WoldCount
Créer un nouveau projet et sélectionner la carte / réduire le projet
Il suffit de mettre le prochain sur wodcount.java, le code est le suivant:
package yjmyzz; import java.io.ioexception; import java.util.stringtokenizer; import org.apache.hadoop.conf.configuration; import org.apache.hadoop.fs.path; import org.apache.hadoop.io.intwitable; import org.apache.hadoop.io.Text; importation; importation; org.apache.hadoop.mapreduce.job; import org.apache.hadoop.mapreduce.mapper; import org.apache.hadoop.mapreduce.reducer; import org.apache.hadoop.mapreduce.lib.input.fileInputformat; import org.apache.hadoop.mapreduce.lib.output. org.apache.hadoop.util.GenericOptionsParser; public class wordCount {public static class tokenizermapper étend le mappeur <objet, texte, texte, intrwitable> {privé final statique intrwitable one = new intwitable (1); Texte privé Word = new Text (); MAP public void (clé d'objet, valeur du texte, contexte de contexte) lève IOException, InterruptedException {StringTokenizer iTr = new StringTokenizer (value.toString ()); while (itr.hasmoretokens ()) {word.set (itr.nextToken ()); context.write (word, un); }}} Classe statique publique IntsumReducer étend le réducteur <texte, intrwitable, texte, intrwitable> {private intwitable result = new intwitable (); public void réduction (clé de texte, valeurs iTable <ntwitable>, contexte de contexte) lève IOException, InterruptedException {int sum = 0; for (intwitable val: valeurs) {sum + = val.get (); } result.set (sum); context.write (clé, résultat); }} public static void main (String [] args) lève une exception {configuration conf = new Configuration (); String [] AUTHARGS = new GenericOptionsParser (conf, args) .getReMingingArgs (); if (otherArgs.Length <2) {System.err.println ("usage: wordCount <in> [<in> ...] <out>"); System.exit (2); } Job Job = Job.getInstance (conf, "Word Count"); job.setjarbyclass (wordCount.class); job.setMapperClass (tokenizermapper.class); job.setcombinerclass (intsumReducer.class); job.setReducerclass (intsumReducer.class); job.setOutputKeyClass (text.class); job.setOutputValuClass (intwitable.class); pour (int i = 0; i <alternative.Length - 1; ++ i) {fileInputFormat.addinputPath (Job, new Path (AUTHARGS [i])); } FileOutputFormat.setOutputPath (Job, New Path (OtherArgs [ATHOTHARGS.LENGTH - 1])); System.exit (Job.WaitForCompletion (true)? 0: 1); }}Ensuite, mettez un log4j.properties, le contenu est le suivant: (Pour la commodité de l'exécution, vérifiez diverses sorties)
log4j.rootlogger = info, stdout # log4j.logger.org.springframework = info # log4j.logger.org.apache.activemq = info # log4j.logger.org.apache. activemq.spring = warn # log4j.logger.org.apache.activemq.store.journal = info # log4j.logger.org.apache.activemq.or g.activeo.journal = infolog4j.appendender.stdout = org.apache.log4j.consoleAppenderLog4j.appender.stdout.layout = org.apache.log4j.patternlayoutlog4j.apprender.stdout.layout.conversionpattern =% d {Absolute} | % -5.5p | % -16.16t | % -32.32c {1} | % -32,32 ° C% 4L | % m% nLa structure du répertoire final est la suivante:
Ensuite, vous pouvez l'exécuter, bien sûr, il ne réussira pas, car aucun paramètre n'est entré pour WordCount, reportez-vous à la figure suivante:
1.5 Définir les paramètres de fonctionnement
Parce que WordCount doit entrer un fichier pour compter les mots, puis sortir dans un autre dossier, alors donnez deux paramètres, reportez-vous à la figure ci-dessus, entrez dans les arguments du programme
hdfs: //172.28.20.xxx: 9000 / jimmy / entrée / readme.txt
hdfs: //172.28.20.xxx: 9000 / jimmy / output /
Veuillez vous référer à cela pour le modifier (remplacer principalement l'IP par l'IP dans votre machine virtuelle). Notez que si le fichier d'entrée / readm.txt ne l'a pas, veuillez le télécharger manuellement, puis / out output / ne doit pas exister. Sinon, si le programme se déroule jusqu'à la fin et constate que le répertoire cible existe, une erreur sera signalée. Après cela, vous pouvez définir un point d'arrêt dans la position appropriée et vous pouvez enfin le déboguer:
3. Intellij Idea Demote débogage hadoop
3.1 Créer un projet Maven WordCount
Le fichier POM est le suivant:
<? xml version = "1.0" Encoding = "utf-8"?> <project xmlns = "http://maven.apache.org/pom/4.0.0" xmlns: xsi = "http://www.w3.org/2001/xmlschema-instance" XSI: ScheMalocation = "http://maven.apache.org/pom/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modersversion> 4.0.0 </mackversion> <proupId> yjmyzz </prenidId> <ArtifActid> MapRedUS <version> 1.0-snapshot </ version> <Dependces> <dependency> <proupId> org.apache.hadoop </proupId> <ArtifactId> Hadoop-Common </ Artifactid> <Dersion> 2.6.0 </ version> </Dependency> <Dedency> <proupId> org.apache.hadoop </prounid> <ArtefactId> Hadoop-MapReduce-Client-Jobclient </ ArtifactId> <Dersion> 2.6.0 </DERNIERSE> </ Dependency> <Dedidency> <ProupId> Commons-Cli </ GroupId> <Artifactid> Commons-Cli </ artifactid> <in version> 1.2 </DERNIFRÉDÉE> </DENSENCENCE> <FinalName> $ {project.artifActid} </inalName> </ build> </ project>La structure du projet est la suivante:
Cliquez avec le bouton droit sur le projet -> Ouvrez les paramètres du module ou appuyez sur F12 pour ouvrir les propriétés du module
Ajout de références à libary de dépendance
Ensuite, importez tous les packages correspondants sous $ hadoop_home
Le libary importé peut être nommé, comme Hadoop2.6
3.2 Définir les paramètres de fonctionnement
Notez deux places :
1 est des régimes de programme, qui est similaire à Eclipes, spécifiant les fichiers d'entrée et les dossiers de sortie
2 est le répertoire fonctionnel, c'est-à-dire le répertoire de travail, spécifié comme le répertoire où se trouve $ hadoop_home
Alors tu peux déboguer
La seule chose qui est mécontente sous Intellij, c'est qu'il n'y a pas de plugin Hadoop similaire à Eclipse. Chaque fois que vous exécutez WordCount, vous ne pouvez supprimer manuellement le répertoire de sortie sur la ligne de commande, puis déboguer. Pour résoudre ce problème, vous pouvez améliorer le code WordCount et supprimer le répertoire de sortie avant l'exécution, consultez le code suivant:
package yjmyzz; import java.io.ioException; import java.util.stringtokenizer; import org.apache.hadoop.conf.configuration; import org.apache.hadoop.fs.filesystem; import org.apache.hadoop.fs.path; import org.apache.hadoop.io.intwitable; import org.apache. org.apache.hadoop.mapreduce.job; import org.apache.hadoop.mapreduce.mapper; import org.apache.hadoop.mapreduce.reducer; import org.apache.hadoop.mapreduce.lib.input.fileInputformat; import org.apache.hadoop.mapreduce.lib.output. org.apache.hadoop.util.GenericOptionsParser; public class wordCount {public static class tokenizermapper étend le mappeur <objet, texte, texte, intrwitable> {privé final statique intrwitable one = new intwitable (1); Texte privé Word = new Text (); MAP public void (clé d'objet, valeur du texte, contexte de contexte) lève IOException, InterruptedException {StringTokenizer iTr = new StringTokenizer (value.toString ()); while (itr.hasmoretokens ()) {word.set (itr.nextToken ()); context.write (word, un); }}} Classe statique publique IntsumReducer étend le réducteur <texte, intrwitable, texte, intrwitable> {private intwitable result = new intwitable (); public void réduction (clé de texte, valeurs iTable <ntwitable>, contexte de contexte) lève IOException, InterruptedException {int sum = 0; for (intwitable val: valeurs) {sum + = val.get (); } result.set (sum); context.write (clé, résultat); }} / ** * Supprimer le répertoire spécifié * * @param conf * @param dirpath * @throws ioException * / private static void Deletedir (configuration conf, string dirpath) lève ioException {fileSystem fs = fileSystem.get (conf); Path TargetPath = new Path (dirpath); if (fs.exists (ciblePath)) {boolean delResult = fs.delete (ciblePath, true); if (delResult) {System.out.println (TargetPath + "a été supprimé réussi."); } else {System.out.println (TargetPath + "Deletion a échoué."); }}} public static void main (String [] args) lève l'exception {configuration conf = new Configuration (); String [] AUTHARGS = new GenericOptionsParser (conf, args) .getReMingingArgs (); if (otherArgs.Length <2) {System.err.println ("usage: wordCount <in> [<in> ...] <out>"); System.exit (2); } // Supprimer le répertoire de sortie d'abord supprimé (confue, otherArgs [otherArgs.length - 1]); Job Job = Job.getInstance (conf, "Word Count"); job.setjarbyclass (wordCount.class); job.setMapperClass (tokenizermapper.class); job.setcombinerclass (intsumReducer.class); job.setReducerclass (intsumReducer.class); job.setOutputKeyClass (text.class); job.setOutputValuClass (intwitable.class); pour (int i = 0; i <alternative.Length - 1; ++ i) {fileInputFormat.addinputPath (Job, new Path (AUTHARGS [i])); } FileOutputFormat.setOutputPath (Job, New Path (OtherArgs [ATHOTHARGS.LENGTH - 1])); System.exit (Job.WaitForCompletion (true)? 0: 1); }} Mais ce n'est pas suffisant. Lors de l'exécution dans l'environnement IDE, l'IDE doit savoir à quelle instance HDFS à connecter (c'est comme dans le développement de DB, vous devez spécifier DataSource dans la configuration XML), copier le Core-site.xml sous $ hadoop_home / etc / hadoop dans le répertoire des ressources, similaire à ce qui suit:
Le contenu est le suivant:
<? xml version = "1.0" Encoding = "UTF-8"?> <? Xml-Stylesheet Type = "Text / XSL" HREF = "Configuration.xsl"?> <NIFIGIGURATION> <propriété> <name> Fs.defaultfs </ name> <value> hdfs: //172.28.20.***: 9000 </ Value>
Remplacez simplement l'IP ci-dessus par l'IP dans la machine virtuelle.