J'essaie d'exécuter un simple en NaiveBayesClassifer
utilisant hadoop, obtenant 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 le NaiveBayes.bin
fichier et l'objet de configuration est en cours d'impression -Configuration: core-default.xml, core-site.xml
Je pense que c'est à cause des pots, des idées?
file:///path/to/dir
Réponses:
C'est un cas typique du
maven-assembly
plugin qui casse des choses.Pourquoi cela nous est arrivé
Différents JAR (
hadoop-commons
pourLocalFileSystem
,hadoop-hdfs
pourDistributedFileSystem
) contiennent chacun un fichier différent appeléorg.apache.hadoop.fs.FileSystem
dans leurMETA-INFO/services
répertoire. Ce fichier répertorie les noms de classe canoniques des implémentations de système de fichiers qu'ils souhaitent déclarer (cela s'appelle une interface de fournisseur de services implémentée viajava.util.ServiceLoader
, voirorg.apache.hadoop.FileSystem#loadFileSystems
).Lorsque nous l'utilisons
maven-assembly-plugin
, il fusionne tous nos JAR en un seul, et tous seMETA-INFO/services/org.apache.hadoop.fs.FileSystem
remplacent les uns les autres. Un seul de ces fichiers reste (le dernier qui a été ajouté). Dans ce cas, laFileSystem
liste dehadoop-commons
écrase la liste dehadoop-hdfs
, doncDistributedFileSystem
n'a plus été déclarée.Comment nous l'avons réparé
Après avoir chargé la configuration Hadoop, mais juste avant de faire quoi que ce soit
FileSystem
lié, nous appelons ceci:Mise à jour: le correctif correct
Il a été porté à mon attention par le fait
krookedking
qu'il existe un moyen basé sur la configuration pourmaven-assembly
utiliser une version fusionnée de toutes lesFileSystem
déclarations de services, consultez sa réponse ci-dessous.la source
val hadoopConfig: Configuration = spark.hadoopConfiguration hadoopConfig.set("fs.hdfs.impl", classOf[org.apache.hadoop.hdfs.DistributedFileSystem].getName) hadoopConfig.set("fs.file.impl", classOf[org.apache.hadoop.fs.LocalFileSystem].getName)
http://mvnrepository.com/artifact/org.apache.hadoop/hadoop-hdfs/2.2.0
maven à maven et le problème est résolu.Pour ceux qui utilisent le plugin shadow, en suivant les conseils de david_p, vous pouvez fusionner les services dans le jar ombré en ajoutant le ServicesResourceTransformer à la configuration du plugin:
Cela fusionnera tous les services org.apache.hadoop.fs.FileSystem dans un seul fichier
la source
Pour mémoire, cela se produit toujours dans hadoop 2.4.0. Si frustrant...
J'ai pu suivre les instructions de ce lien: http://grokbase.com/t/cloudera/scm-users/1288xszz7r/no-filesystem-for-scheme-hdfs
J'ai ajouté ce qui suit à mon core-site.xml et cela a fonctionné:
la source
merci david_p, scala
ou
la source
Il m'a fallu des années pour le comprendre avec Spark 2.0.2, mais voici ma part:
Et les parties pertinentes de mon
build.sbt
:J'espère que cela peut vous aider!
la source
Pour maven, ajoutez simplement la dépendance maven pour hadoop-hdfs (reportez-vous au lien ci-dessous) pour résoudre le problème.
http://mvnrepository.com/artifact/org.apache.hadoop/hadoop-hdfs/2.7.1
la source
En supposant que vous utilisez la distribution mvn et 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 des dépendances hadoop et mvn.
n'oubliez pas d'ajouter le référentiel cloudera mvn.
la source
J'utilise l'assembly sbt pour empaqueter mon projet. Je rencontre également ce problème. Ma solution est ici. Étape 1: ajoutez la stratégie de fusion META-INF dans votre build.sbt
Étape 2: ajoutez la bibliothèque hadoop-hdfs à build.sbt
Étape 3: sbt propre; assemblage sbt
J'espère que les informations ci-dessus peuvent vous aider.
la source
case PathList("META-INF", "services", "org.apache.hadoop.fs.FileSystem") => MergeStrategy.filterDistinctLines
Cela conservera tous les systèmes de fichiers enregistrésJe suppose que vous créez un échantillon avec maven.
Veuillez vérifier le contenu du JAR que vous essayez d'exécuter. Surtout
META-INFO/services
répertoire, fichierorg.apache.hadoop.fs.FileSystem
. Il devrait y avoir une liste de classes d'implémentation de filsystem. La ligne de contrôleorg.apache.hadoop.hdfs.DistributedFileSystem
est présente dans la liste pour HDFS etorg.apache.hadoop.fs.LocalFileSystem
pour le schéma de fichier local.Si tel est le cas, vous devez remplacer la ressource référencée lors de la génération.
Une autre possibilité est que vous n'avez tout simplement pas
hadoop-hdfs.jar
dans votre chemin de classe, mais cela a une faible probabilité. Habituellement, si vous avez unehadoop-client
dépendance correcte, ce n'est pas une option.la source
Une autre cause possible (bien que la question OPs n'en souffre pas elle-même) est si vous créez une instance de configuration qui ne charge pas les valeurs par défaut:
Si vous ne chargez pas les valeurs par défaut, vous n'obtiendrez pas les paramètres par défaut pour des choses comme les
FileSystem
implémentations, ce qui conduit à des erreurs identiques comme celle-ci lorsque vous essayez d'accéder à HDFS. Le passage au constructeur sans paramètre de transmissiontrue
aux valeurs par défaut de chargement 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) au
Configuration
objet,addResource()
faites attention à la surcharge que vous utilisez. Par exemple, si vous utilisez,addResource(String)
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:la source
Il m'a fallu un certain temps pour trouver une solution à partir des réponses données, en raison de ma nouveauté. Voici ce que j'ai proposé, si quelqu'un d'autre a besoin d'aide dès le début:
J'utilise Spark 2.1
Et j'ai cette part dans mon
build.sbt
la source
set fs.defaultFS fonctionne pour moi! Hadoop-2.8.1
la source
Pour SBT, utilisez ci-dessous mergeStrategy dans build.sbt
la source
Utilisez ce plugin
la source
Si vous utilisez sbt :
la source
J'ai fait face au même problème. J'ai trouvé deux solutions: (1) Édition manuelle du fichier jar:
Ouvrez le fichier jar avec WinRar (ou des outils similaires). Allez dans Meta-info> services, et éditez "org.apache.hadoop.fs.FileSystem" en ajoutant:
(2) Changer l'ordre de mes dépendances comme suit
la source
Ce n'est pas lié à Flink, mais j'ai également trouvé ce problème dans Flink.
Pour les personnes utilisant Flink, vous devez télécharger Hadoop pré-groupé et le mettre à l'intérieur
/opt/flink/lib
.la source
Je suis également tombé sur un problème similaire. Ajout de core-site.xml et hdfs-site.xml en tant que ressources de conf (object)
Également édité des conflits de version dans pom.xml. (Par exemple, si la version configurée de hadoop est 2.8.1, mais dans le fichier pom.xml, les dépendances ont la version 2.7.1, changez-la en 2.8.1) Exécutez à nouveau l'installation de Maven.
Cette erreur a résolu pour moi.
la source