J'essaye de placer les bocaux externes sur 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 ca4c88898f95aaababff85d5b5e9c194ffd647c2109. Compilé par jenkins le 2013-10-31T07: 55Z Du source avec checksum 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 peux voir ce qui précède HADOOP_CLASSPATH a été recueilli par hadoop
$ hadoop classpath
/etc/hadoop/conf:/usr/lib/hadoop/lib/:/usr/lib/hadoop /.//:/home/tom/espace de travail/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 /.//
Commander
$ Bocal hado Sudo FlightsByCarrier.jar FlightsByCarrier /user/root/1987.csv/user/root/result
J'ai aussi essayé avec l'option -libjars
$ Sudo hadoop jar FlightsByCarrier.jar FlightsByCarrier /user/root/1987.csv/utilisateur/root/result -libjars / home/espace/workspace/libs/opencsv-2.3.jar
Le stacktrace
14/11/04 16:43:23 INFO mapreduce.Job: Emploi en cours: job_1415115532989_0001 14/11/04 16:43:55 INFO mapreduce.Job: Emploi job_1415115532989_0001 en cours d'exécution en mode uber: false 14/11/04 16:43:56 INFO mapreduce.Job: carte 0% réduction 0% 14/11/04 16:45:27 INFO mapreduce.Job: carte réduction de 50% 0% 14/11/04 16:45:27 INFO mapreduce.Job: Identifiant de la tâche: tentative_1415115532989_0001_m_000001_0, Etat: ECHEC Erreur: Java.lang. ClassNotFoundException : au.com. bytecode.opencsv. CSVParser à Java.net.URLClassLoader $ 1.run (URLClassLoader.Java:366) à Java.net.URLClassLoader $ 1.run (URLClassLoader.Java:366) à Java.net.URLClassLoader $ 1.run (URLClassLoader.Java : 355) À Java.security.AccessController.doPrivileged (Méthode native) À Java.net.URLClassLoader.findClass (URLClassLoader.Java:354) à. Java.lang. ClassLoader.loadClass (ClassLoader.Java:425) À Sun.misc.Launcher $ AppClassLoader.loadClass (Launcher.Java:308) À Java.lang.ClassLoader.lo adClass (ClassLoader.Java:358) à FlightsByCarrierMapper.map (FlightsByCarrierMapper.Java:19) à FlightsByCarrierMapper.map (FlightsByCarrierMapper.Java:19) à. hadoop.mapreduce.Mapper.run (Mapper.Java:144) à l'org.Apache.hadoop.mapred.MapTask.runNewMapper (MapTask.Java:757) à l'org.Apache.hadoop. mapred.MapTask.run (MapTask.Java:339) à l'org.Apache.hadoop.mapred.YarnChild $ 2.run (YarnChild.Java:158) à Java.security.AccessController.doPrivileged (Méthode native) Sur javax.security.auth.Subject.doAs (Subject.Java:415) Sur org.Apache.hadoop.security.UserGroupInformation.doAs (UserGroupInformation.Java:1478) à org.Apache.hadoop.mapred.YarnChild.main (YarnChild.Java:153)
Toute aide est grandement appréciée.
Votre fichier JAR externe est manquant sur le noeud exécutant des cartes. Vous devez l'ajouter au cache pour le rendre disponible. Essayez:
DistributedCache.addFileToClassPath(new Path("pathToJar"), conf);
Vous ne savez pas dans quelle version DistributedCache
était obsolète, mais à partir de Hadoop 2.2.0, vous pouvez utiliser:
job.addFileToClassPath(new Path("pathToJar"));
J'ai essayé de définir le fichier java opencsv dans le chemin de classe hadoop, mais cela n'a pas fonctionné. Nous devons copier explicitement le fichier jar dans le chemin de classe pour que cela fonctionne. Cela a fonctionné pour moi. Voici les étapes que j'ai suivies:
Je l'ai fait dans un cluster HDP. J'ai copié mon fichier jar opencsv dans les bibliothèques hbase et je l'ai exporté avant d'exécuter mon fichier jar.
Copier ExternalJars sur HDP LIBS:
Pour exécuter un fichier jar CSV ouvert: 1.Copiez le fichier jar opencsv dans le répertoire /usr/hdp/2.2.9.1-11/hbase/lib/ et /usr/hdp/2.2.9.1- 11/hadoop-yarn/lib
**Sudo cp /home/sshuser/Amedisys/lib/opencsv-3.7.jar /usr/hdp/2.2.9.1-11/hbase/lib/**
2.Donnez les autorisations de fichier en utilisant Sudo chmod 777 opencsv-3.7.jar 3.List Files ls -lrt
4. exporthadoop classpath
: hbase classpath
5.Maintenant, lancez votre bocal. Il récupérera le bocal et s’exécutera correctement.
Si vous ajoutez le fichier JAR externe au chemin de classe Hadoop, il est préférable de copier votre fichier JAR dans l'un des répertoires existants examinés par hadoop. Sur la ligne de commande, exécutez la commande "hadoop classpath" puis recherchez un dossier approprié et copiez votre fichier jar à cet emplacement. Hadoop récupérera les dépendances à partir de cet emplacement. Cela ne fonctionnera pas avec CloudEra, etc., car vous n’avez peut-être pas les droits en lecture/écriture pour copier des fichiers dans les dossiers hadoop classpath.
On dirait que vous avez également essayé l'option LIBJARs. Avez-vous modifié votre classe de pilotes pour implémenter l'interface TOOL? Commencez par vous assurer que vous éditez votre classe de pilote comme indiqué ci-dessous:
public class myDriverClass extends Configured implements Tool {
public static void main(String[] args) throws Exception {
int res = ToolRunner.run(new Configuration(), new myDriverClass(), args);
System.exit(res);
}
public int run(String[] args) throws Exception
{
// Configuration processed by ToolRunner
Configuration conf = getConf();
Job job = new Job(conf, "My Job");
...
...
return job.waitForCompletion(true) ? 0 : 1;
}
}
Maintenant, éditez votre commande "hadoop jar" comme indiqué ci-dessous:
hadoop jar YourApplication.jar [myDriverClass] args -libjars path/to/jar/file
Voyons maintenant ce qui se passe en dessous. Fondamentalement, nous traitons les nouveaux arguments de ligne de commande en implémentant l'interface TOOL Interface . ToolRunner est utilisé pour exécuter des classes implémentant l'interface Tool. Il fonctionne conjointement avec GenericOptionsParser pour analyser les arguments de ligne de commande hadoop génériques et modifie la configuration de l'outil.
Dans notre main (), nous appelons ToolRunner.run(new Configuration(), new myDriverClass(), args)
- ceci exécute l'outil donné par Tool.run (String []), après l'analyse avec les arguments génériques donnés . Il utilise la configuration donnée, ou en construit une si elle est nulle, puis définit la configuration de l'outil avec la version éventuellement modifiée de la conf.
Maintenant, dans la méthode run, lorsque nous appelons getConf (), nous obtenons la version modifiée de la configuration.Assurez-vous donc que vous avez la ligne ci-dessous dans votre code. Si vous implémentez tout le reste et que vous utilisez toujours Configuration conf = new Configuration (), rien ne fonctionnera.
Configuration conf = getConf();
J'ai trouvé une autre solution de contournement en implémentant ToolRunner, comme ci-dessous. Avec cette approche, hadoop accepte les options de ligne de commande. Nous pouvons éviter le codage difficile de l'ajout de fichiers à DistributedCache
public class FlightsByCarrier extends Configured implements Tool {
public int run(String[] args) throws Exception {
// Configuration processed by ToolRunner
Configuration conf = getConf();
// Create a JobConf using the processed conf
JobConf job = new JobConf(conf, FlightsByCarrier.class);
// Process custom command-line options
Path in = new Path(args[1]);
Path out = new Path(args[2]);
// Specify various job-specific parameters
job.setJobName("my-app");
job.setInputPath(in);
job.setOutputPath(out);
job.setMapperClass(MyMapper.class);
job.setReducerClass(MyReducer.class);
// Submit the job, then poll for progress until the job is complete
JobClient.runJob(job);
return 0;
}
public static void main(String[] args) throws Exception {
// Let ToolRunner handle generic command-line options
int res = ToolRunner.run(new Configuration(), new FlightsByCarrier(), args);
System.exit(res);
}
}
J'ai trouvé une solution très simple au problème: Identifiez-vous en tant que root:
cd /usr/lib find. -name "opencsv.jar"
Ramassez l'emplacement du fichier. Dans mon cas> je l'ai trouvé sous /usr/lib/Hive/lib/opencsv*.jar
Maintenant, soumettez la commande
hadoop classpath
Le résultat montre le répertoire dans lequel hadoop cherche les fichiers jar. Choisissez un répertoire et copiez-le dans le répertoire opencsv * jar.
Dans mon cas cela a fonctionné.