comment exécuter une classe à partir d'un fichier jar java sur Hadoop?


J'ai un fichier jar exporté depuis Eclipse (JAR exécutable>>Copier les bibliothèques requises dans un sous-dossier).

En java si vous définissez la classe principale dans le manifeste.xml, vous pouvez exécuter:

java -jar MyTest.jar arguments

Si vous souhaitez exécuter une autre classe principale dans le fichier jar ou si vous n'avez pas défini une classe principale dans le manifeste.xml, vous pouvez exécuter:

java -cp MyTest.jar MyOtherMainClass arguments

Dans Hadoop si la classe main est définie dans manifest.xml, vous pouvez exécuter:

hadoop jar MyTest.jar arguments

Si vous tapez:

hadoop jar MyTest.jar MyOtherMainClass arguments

Il considérera MyOtherMainClass en tant qu'argument (pas en tant que classe à exécuter) dans le tableau "args" de la classe principale d'origine de jar.

Maintenant, si vous voulez exécuter une autre classe principale dans le fichier jar que vous tapez?

Je m'attends à quelque chose de similaire à:

hadoop java -cp MyTest.jar MyOtherMainClass arguments

Mais cela donne:

Error: Could not find or load main class java

Remarque: si je supprime "hadoop" de "hadoop java-cp MyTest.jar MyOtherMainClass arguments " il se lancera normalement

Author: Mosab Shaheen, 2017-03-25

1 answers

Le problème vient d'Eclipse vous forçant à définir la classe principale dans le fichier jar et vous empêchant donc d'exécuter la classe que vous voulez. Tout ce que vous avez à faire est de supprimer la classe principale du manifeste.fichier xml du fichier jar et exécuter:

hadoop jar MyTest.jar MyOtherMainClass arguments

Jetez un oeil ici: http://www.roman10.net/2012/07/26/specify-the-main-class-in-a-jar-file-for-hadoop/

J'ai tapé le même texte au cas où l'URL serait supprimée:

Hadoop prend en charge l'exécution du fichier jar. Pour une fichier jar exécutable en exécution java normale, on peut spécifier la classe principale dans la ligne de commande, comme couvert dans mon post précédent: basculer entre les classes principales dans un fichier jar.

Cependant, les règles sont un peu différentes pour les fichiers jar exécutables exécutés avec hadoop. Fondamentalement, les règles suivantes tiennent (j'ai testé sur Hadoop 1.0.3),

Si un fichier jar contient une classe principale spécifiée dans son fichier manifeste, hadoop prendra la classe principale même si la commande spécifie une autre classe principale. C'est différent de l'exécution java normale où nous pouvons spécifier une classe principale pour écraser celle du fichier manifeste. Si un fichier jar ne contient pas de classe principale dans le fichier de manifeste, hadoop permet de spécifier la classe principale. Chez eclipse, lorsque l'on exporte un projet en tant que fichier jar exécutable, il demande toujours une classe principale lors de la configuration de lancement.

La classe principale sélectionnée sera placée dans le fichier manifeste. Vous trouverez ci-dessous le contenu du MÉTA-INF/MANIFESTE.Fichier MF dans mon projet helloworld où le principal la classe est définie sur HelloWorld.

Manifest-Version: 1.0 Class-Path: . Classe principale: bonjour.HelloWorld On peut parcourir le fichier jar à l'aide d'un extracteur de fichiers, ouvrir le fichier manifeste à l'aide d'un éditeur de fichiers, et simplement supprimer la dernière ligne pour supprimer la configuration de classe principale, et enregistrer les modifications apportées au fichier jar lorsque vous y êtes invité. Cela créera un fichier jar exécutable sans classe principale.

Le fichier jar modifié peut ensuite être utilisé dans Hadoop avec la configuration de classe principale fournie par l'utilisateur, comme indiqué dans l'exemple de commande ci-dessous,

Had hadoop jar bonjour.jar bonjour.HelloWorld

 2
Author: Mosab Shaheen, 2017-03-26 07:00:11