Réglage externe des pots de hadoop classpath
Je suis en train de mettre externes pots à hadoop classpath mais pas de chance jusqu'à présent.
J'ai la configuration suivante
$ version hadoop
Hadoop 2.0.6-alpha
Subversion https://git-wip-us.apache.org/repos/asf/bigtop.git -r ca4c88898f95aaab3fd85b5e9c194ffd647c2109
Compilé par jenkins sur 2013-10-31T07:55Z
À partir de la source avec la somme de contrôle 95e88b2a9589fa69d6d5c1dbd48d4e
Cette commande a été exécutée à l'aide de /usr/lib/hadoop/hadoop-common-2.0.6-alpha.jar
Classpath
$ echo $HADOOP_CLASSPATH
/home/tom/workspace/libs/opencsv-2.3.jar
Je suis capable de voir au-dessus de la HADOOP_CLASSPATH a été ramassé par hadoop
$ hadoop classpath
/etc/hadoop/conf:/usr/lib/hadoop/lib/:/usr/lib/hadoop/.//:/home/tom/workspace/libs/opencsv-2.3.jar:/usr/lib/hadoop-hdfs/./:/usr/lib/hadoop-hdfs/lib/:/usr/lib/hadoop-hdfs/.//:/usr/lib/hadoop-yarn/lib/:/usr/lib/hadoop-yarn/.//:/usr/lib/hadoop-mapreduce/lib/:/usr/lib/hadoop-mapreduce/.//
Commande
$ sudo hadoop pot FlightsByCarrier.jar FlightsByCarrier /utilisateur/root/1987.csv /utilisateur/root/résultat
J'ai essayé avec -libjars option
$ sudo hadoop pot FlightsByCarrier.jar FlightsByCarrier /utilisateur/root/1987.csv /utilisateur/root/résultat -libjars /home/tom/workspace/libs/opencsv-2.3.jar
La stacktrace
14/11/04 16:43:23 INFO mapreduce.Travail: travail en cours d'Exécution: job_1415115532989_0001
14/11/04 16:43:55 INFO mapreduce.D'emploi: Emploi job_1415115532989_0001 cours d'exécution dans uber mode : false
14/11/04 16:43:56 INFO mapreduce.Emploi: carte 0% réduire à 0%
14/11/04 16:45:27 INFO mapreduce.Emploi: la carte de 50% de réduire à 0%
14/11/04 16:45:27 INFO mapreduce.Emploi: l'Id de la Tâche : attempt_1415115532989_0001_m_000001_0, Statut : ÉCHEC de la
Erreur: java.lang.ClassNotFoundException: au.com.bytecode.opencsv.CSVParser
à java.net.URLClassLoader$1.exécuter(URLClassLoader.java:366)
à java.net.URLClassLoader$1.exécuter(URLClassLoader.java:355)
à java.de sécurité.AccessController.doPrivileged(Native method)
à java.net.URLClassLoader.findClass(URLClassLoader.java:354)
à java.lang.Chargeur de classe.loadClass(ClassLoader.java:425)
au coucher du soleil.misc.Lanceur$AppClassLoader.loadClass(Lanceur.java:308)
à java.lang.Chargeur de classe.loadClass(ClassLoader.java:358)
au FlightsByCarrierMapper.carte(FlightsByCarrierMapper.java:19)
au FlightsByCarrierMapper.carte(FlightsByCarrierMapper.java:10)
au org.apache.hadoop.mapreduce.Mappeur.exécuter(Mappeur.java:144)
au org.apache.hadoop.mapred.MapTask.runNewMapper(MapTask.java:757)
au org.apache.hadoop.mapred.MapTask.exécuter(MapTask.java:339)
au org.apache.hadoop.mapred.YarnChild$2.exécuter(YarnChild.java:158)
à java.de sécurité.AccessController.doPrivileged(Native method)
au javax.de sécurité.auth.Sujet.doAs(sous réserve.java:415)
au org.apache.hadoop.de sécurité.UserGroupInformation.doAs(UserGroupInformation.java:1478)
au org.apache.hadoop.mapred.YarnChild.principale(YarnChild.java:153)
Toute aide est très appréciée.
Vérifier ma réponse ici, je l'ai expliqué toutes les options disponibles pour résoudre ce problème ici: stackoverflow.com/a/36227260/1766402
J'ai utilisé ceci: stackoverflow.com/a/54459211/529442
OriginalL'auteur mnm | 2014-11-05
Vous devez vous connecter pour publier un commentaire.
Votre pot est manquante sur le nœud de cartes de course. Vous devez ajouter dans le cache pour le rendre disponible. Essayez :
Pas sûr de la version de
DistributedCache
était obsolète, mais à partir de Hadoop 2.2.0 ultérieur, vous pouvez utiliser :J'ai gardé un pot dans HDFS à l'aide de ... hadoop fs -mettre java-json.jar /user/root/jars/java-json.jar ... Dans ma classe, j'ai donné de l'emploi.addFileToClassPath(new Path("/user/root/jars/java-json.jar")); Mais lors de l'exécution de boulot NoClassDefFoundError Suis-je raté quelque chose ?
J'ai essayé la même
job.addFileToClassPath(new Path("pathToJar"));
et le chemin de mon fichier HDFS. Et j'ai essayé de donner le fichier 777 autorisations, mais toujours pas en mesure de résoudre ce problème. Pouvez-vous svp m'aider dans cette.OriginalL'auteur blackSmith
J'ai essayé le réglage de la opencsv pot dans hadoop classpath mais il ne fonctionne pas.Nous devons explicitement copier le jar dans le classpath pour que cela fonctionne.Il a travaillé pour moi.
Ci-dessous sont les étapes que j'ai suivi:
J'ai fait ça dans un HDP CLuster.Je n'ont copié mon opencsv pot dans hbase libs et de l'exportation avant l'exécution de mon pot
Copie ExternalJars à HDP LIBS:
Pour Exécuter Ouvrir CSV Jar:
1.Copiez le opencsv jar dans le répertoire /usr/hdp/2.2.9.1-11/hbase/lib et /usr/hdp/2.2.9.1-11/hadoop-fil/lib
2.Donner les autorisations de fichier à l'aide de
sudo chmod 777 opencsv-3.7.jar
3.Liste Des Fichiers
ls -lrt
4.l'exportation
hadoop classpath
:hbase classpath
5.Maintenant exécuter votre Bocal.Il sera ramasser le opencsv pot et va s'exécuter correctement.
OriginalL'auteur nitinm
Si vous ajoutez l'externe POT aux Hadoop classpath alors de son mieux pour copier votre POT à l'un des répertoires existants que hadoop est en train de regarder. Sur la ligne de commande, exécutez la commande "hadoop classpath" et ensuite trouver un dossier et copiez votre fichier jar à cet emplacement et hadoop va ramasser les dépendances à partir de là. Cela ne marchera pas avec CloudEra, etc que vous ne pouvez pas avoir droit en lecture/écriture pour copier des fichiers à la hadoop classpath dossiers.
Ressemble-vous essayé le LIBJARs option, avez-vous modifier votre chauffeur classe implémente l'interface de l'OUTIL? Assurez-vous d'abord que vous modifiez votre classe du pilote, comme indiqué ci-dessous:
Maintenant modifier votre "hadoop pot de commande comme indiqué ci-dessous:
Maintenant permet de comprendre ce qui se passe en dessous. Fondamentalement, nous sommes la manipulation de la nouvelle arguments de ligne de commande par la mise en œuvre de la L'Interface de l'OUTIL. ToolRunner est utilisé pour exécuter les classes implémentant l'interface de l'Outil. Il fonctionne en conjonction avec GenericOptionsParser pour analyser le générique hadoop arguments de ligne de commande et modifie la Configuration de l'Outil.
Au sein de notre Main() nous appelons
ToolRunner.run(new Configuration(), new myDriverClass(), args)
- cela va de l'Outil par Outil.exécuter(String[]), après l'analyse avec le générique arguments. Il utilise la Configuration donnée, ou en construit un, si c'est nul et puis définit l'Outil de configuration avec la version éventuellement modifiée de la conf.Maintenant dans la méthode run, quand nous appelons getConf() nous obtenons la version modifiée de la Configuration. Donc, assurez-vous que vous avez la ligne ci-dessous dans votre code. Si vous mettez en œuvre tout le reste et font encore l'utilisation de la Configuration conf = new Configuration(), rien ne fonctionnerait.
OriginalL'auteur Isaiah4110
J'ai trouvé une autre solution de contournement par la mise en œuvre de ToolRunner comme ci-dessous. Avec cette approche hadoop accepte les options de ligne de commande. Nous pouvons éviter le codage en dur de l'ajout de fichiers à DistributedCache
OriginalL'auteur mnm
J'ai trouvé une solution très simple à ce problème:
connexion en tant que root :
Ramasser les locatin du fichier. Dans mon cas >je l'ai trouvé sous /usr/lib/ruche/lib/opencsv*.jar
Maintenant soumettre la commande
Le résultat montre que le direcory où hadoop recherches jar fichiers.
Ramasser un répertoire et copier opencsv*jar dans le dossier.
Dans mon cas, cela a fonctionné.
OriginalL'auteur user5856557