web-dev-qa-db-fra.com

Définition de jarres externes sur hadoop classpath

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.

7
mnm

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")); 
3
blackSmith

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.

2
nitinm

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();
1
Isaiah4110

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);
       }
     }
0
mnm

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é.

0
user5856557