108 votes

hadoop Pas de système de fichiers pour le schéma : file

J'essaie d'exécuter un simple NaiveBayesClassifer en utilisant hadoop, j'obtiens cette erreur

Exception in thread "main" java.io.IOException: No FileSystem for scheme: file
    at org.apache.hadoop.fs.FileSystem.createFileSystem(FileSystem.java:1375)
    at org.apache.hadoop.fs.FileSystem.access$200(FileSystem.java:66)
    at org.apache.hadoop.fs.FileSystem$Cache.get(FileSystem.java:1390)
    at org.apache.hadoop.fs.FileSystem.get(FileSystem.java:196)
    at org.apache.hadoop.fs.FileSystem.get(FileSystem.java:95)
    at org.apache.hadoop.fs.FileSystem.get(FileSystem.java:180)
    at org.apache.hadoop.fs.Path.getFileSystem(Path.java:175)
    at org.apache.mahout.classifier.naivebayes.NaiveBayesModel.materialize(NaiveBayesModel.java:100)

Code :

    Configuration configuration = new Configuration();
    NaiveBayesModel model = NaiveBayesModel.materialize(new Path(modelPath), configuration);// error in this line..

modelPath pointe vers NaiveBayes.bin et l'objet de configuration est imprimé - Configuration: core-default.xml, core-site.xml

Je pense que c'est à cause des pots, des idées ?

7voto

kwky Points 379

Pour maven, il suffit d'ajouter la dépendance maven pour hadoop-hdfs (voir le lien ci-dessous) pour résoudre le problème.

http://mvnrepository.com/artifact/org.apache.hadoop/hadoop-hdfs/2.7.1

5voto

husnu Points 293

En supposant que vous utilisez mvn et la distribution cloudera de hadoop. J'utilise cdh4.6 et l'ajout de ces dépendances a fonctionné pour moi.je pense que vous devriez vérifier les versions de hadoop et des dépendances mvn.

<dependency>
        <groupId>org.apache.hadoop</groupId>
        <artifactId>hadoop-core</artifactId>
        <version>2.0.0-mr1-cdh4.6.0</version>
    </dependency>

    <dependency>
        <groupId>org.apache.hadoop</groupId>
        <artifactId>hadoop-common</artifactId>
        <version>2.0.0-cdh4.6.0</version>
    </dependency>

    <dependency>
        <groupId>org.apache.hadoop</groupId>
        <artifactId>hadoop-client</artifactId>
        <version>2.0.0-cdh4.6.0</version>
    </dependency>

n'oubliez pas d'ajouter le dépôt mvn de cloudera.

<repository>
        <id>cloudera</id>
        <url>https://repository.cloudera.com/artifactory/cloudera-repos/</url>
</repository>

4voto

Haimei Points 328

J'utilise l'assemblage sbt pour empaqueter mon projet. Je rencontre également ce problème. Ma solution est la suivante. Etape 1 : ajouter META-INF mergestrategy dans votre build.sbt

case PathList("META-INF", "MANIFEST.MF") => MergeStrategy.discard
case PathList("META-INF", ps @ _*) => MergeStrategy.first

Etape 2 : ajouter la librairie hadoop-hdfs à build.sbt

"org.apache.hadoop" % "hadoop-hdfs" % "2.4.0"

Étape 3 : nettoyage de la sbt ; assemblage de la sbt

J'espère que les informations ci-dessus pourront vous aider.

2voto

Roman Nikitchenko Points 3085

Je suppose que vous construisez l'échantillon en utilisant maven.

Veuillez vérifier le contenu du JAR que vous essayez d'exécuter. En particulier META-INFO/services répertoire, fichier org.apache.hadoop.fs.FileSystem . Il devrait y avoir une liste des classes de mise en œuvre du système de fils. Ligne de contrôle org.apache.hadoop.hdfs.DistributedFileSystem est présent dans la liste pour HDFS et org.apache.hadoop.fs.LocalFileSystem pour le système de fichiers local.

Si c'est le cas, vous devez remplacer la ressource référencée pendant la construction.

L'autre possibilité est que vous n'avez tout simplement pas hadoop-hdfs.jar dans votre classpath mais cela a une faible probabilité. Habituellement, si vous avez correctement hadoop-client la dépendance n'est pas une option.

2voto

RobV Points 13708

Une autre cause possible (bien que la question de l'OP n'en souffre pas) est que vous créez une instance de configuration qui ne charge pas les valeurs par défaut :

Configuration config = new Configuration(false);

Si vous ne chargez pas les valeurs par défaut, vous n'obtiendrez pas les paramètres par défaut pour des éléments tels que l'indicateur d'état de santé. FileSystem qui conduit à des erreurs identiques comme celle-ci lorsqu'on essaie d'accéder à HDFS. En passant au constructeur sans paramètre et en passant dans le fichier true pour charger les valeurs par défaut peut résoudre ce problème.

De plus, si vous ajoutez des emplacements de configuration personnalisés (par exemple, sur le système de fichiers) à l'option Configuration faites attention à la surcharge de l'objet addResource() que vous utilisez. Par exemple, si vous utilisez addResource(String) alors Hadoop suppose que la chaîne est une ressource de chemin de classe, si vous devez spécifier un fichier local, essayez ce qui suit :

File configFile = new File("example/config.xml");
config.addResource(new Path("file://" + configFile.getAbsolutePath()));

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X