Ich versuche, eine einfache NaiveBayesClassifer
Verwendung von Hadoop auszuführen, wobei dieser Fehler auftritt
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
zeigt auf eine NaiveBayes.bin
Datei und das Konfigurationsobjekt wird gedruckt -Configuration: core-default.xml, core-site.xml
Ich denke, es liegt an Gläsern, irgendwelche Ideen?
file:///path/to/dir
Antworten:
Dies ist ein typischer Fall, in dem das
maven-assembly
Plugin Dinge kaputt macht.Warum ist uns das passiert?
Verschiedene JARs (
hadoop-commons
fürLocalFileSystem
,hadoop-hdfs
fürDistributedFileSystem
) enthalten jeweils eine andere Datei, dieorg.apache.hadoop.fs.FileSystem
in ihremMETA-INFO/services
Verzeichnis aufgerufen wird . Diese Datei listet die kanonischen Klassennamen der Dateisystemimplementierungen auf, die deklariert werden sollen (dies wird als Service Provider-Schnittstelle bezeichnet, die über implementiert wirdjava.util.ServiceLoader
, sieheorg.apache.hadoop.FileSystem#loadFileSystems
).Wenn wir verwenden
maven-assembly-plugin
, werden alle unsere JARs zu einem zusammengeführt und alleMETA-INFO/services/org.apache.hadoop.fs.FileSystem
überschreiben sich gegenseitig. Es bleibt nur eine dieser Dateien übrig (die letzte, die hinzugefügt wurde). In diesem Fall wird dieFileSystem
Liste vonhadoop-commons
von Überschreibungen der Listehadoop-hdfs
, soDistributedFileSystem
wurde nicht mehr erklärt.Wie wir es behoben haben
Nach dem Laden der Hadoop-Konfiguration, aber kurz bevor Sie etwas in
FileSystem
Bezug auf etwas tun , nennen wir dies:Update: das richtige Update
Ich wurde darauf aufmerksam gemacht,
krookedking
dass es eine konfigurationsbasierte Möglichkeit gibt, diemaven-assembly
Verwendung einer zusammengeführten Version allerFileSystem
Dienstdeklarationen zu machen. Lesen Sie seine Antwort unten.quelle
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
zu Maven hinzugefügt und das Problem gelöst.Wenn Sie das Schatten-Plugin verwenden, können Sie gemäß den Anweisungen von david_p die Dienste im schattierten Glas zusammenführen, indem Sie den ServicesResourceTransformer zur Plugin-Konfiguration hinzufügen:
Dadurch werden alle org.apache.hadoop.fs.FileSystem-Dienste in einer Datei zusammengeführt
quelle
Für die Aufzeichnung geschieht dies immer noch in Hadoop 2.4.0. So frustrierend...
Ich konnte den Anweisungen in diesem Link folgen: http://grokbase.com/t/cloudera/scm-users/1288xszz7r/no-filesystem-for-scheme-hdfs
Ich habe meiner core-site.xml Folgendes hinzugefügt und es hat funktioniert:
quelle
danke david_p, scala
oder
quelle
Ich habe ewig gebraucht, um es mit Spark 2.0.2 herauszufinden, aber hier ist mein Teil:
Und die relevanten Teile meiner
build.sbt
:Ich hoffe das kann helfen!
quelle
Fügen Sie für Maven einfach die Maven-Abhängigkeit für hadoop-hdfs hinzu (siehe Link unten), um das Problem zu beheben.
http://mvnrepository.com/artifact/org.apache.hadoop/hadoop-hdfs/2.7.1
quelle
Angenommen, Sie verwenden die mvn- und cloudera-Verteilung von hadoop. Ich verwende cdh4.6 und das Hinzufügen dieser Abhängigkeiten hat bei mir funktioniert. Ich denke, Sie sollten die Versionen der Hadoop- und MVN-Abhängigkeiten überprüfen.
Vergessen Sie nicht, das Cloudera MVN-Repository hinzuzufügen.
quelle
Ich verwende sbt Assembly, um mein Projekt zu verpacken. Ich treffe auch dieses Problem. Meine Lösung ist hier. Schritt 1: Fügen Sie META-INF Mergestrategy in Ihre build.sbt ein
Schritt 2: Fügen Sie hadoop-hdfs lib zu build.sbt hinzu
Schritt 3: sbt sauber; sbt montage
Hoffe, die oben genannten Informationen können Ihnen helfen.
quelle
case PathList("META-INF", "services", "org.apache.hadoop.fs.FileSystem") => MergeStrategy.filterDistinctLines
Ich gehe davon aus, dass Sie ein Beispiel mit Maven erstellen.
Bitte überprüfen Sie den Inhalt der JAR, die Sie ausführen möchten. Besonders
META-INFO/services
Verzeichnis, Dateiorg.apache.hadoop.fs.FileSystem
. Es sollte eine Liste der Dateisystem-Implementierungsklassen vorhanden sein. Check Zeileorg.apache.hadoop.hdfs.DistributedFileSystem
ist in der Liste für HDFS undorg.apache.hadoop.fs.LocalFileSystem
für lokales Dateischema.In diesem Fall müssen Sie die referenzierte Ressource während des Builds überschreiben.
Eine andere Möglichkeit ist, dass Sie einfach keinen
hadoop-hdfs.jar
in Ihrem Klassenpfad haben, aber dies hat eine geringe Wahrscheinlichkeit. Wenn Sie die richtigehadoop-client
Abhängigkeit haben, ist dies normalerweise keine Option.quelle
Eine andere mögliche Ursache (obwohl die OP-Frage selbst nicht darunter leidet) ist, dass Sie eine Konfigurationsinstanz erstellen, die die Standardeinstellungen nicht lädt:
Wenn Sie die Standardeinstellungen nicht laden, erhalten Sie nicht die Standardeinstellungen für Dinge wie die
FileSystem
Implementierungen, was zu identischen Fehlern wie diesen führt, wenn Sie versuchen, auf HDFS zuzugreifen. Das Umschalten auf den parameterlosen Konstruktor für die Übergabetrue
an Ladevorgaben kann dies beheben.Wenn Sie dem
Configuration
Objekt benutzerdefinierte Konfigurationsspeicherorte hinzufügen (z. B. im Dateisystem), achtenaddResource()
Sie außerdem darauf, welche Überlastung Sie verwenden. Wenn Sie beispielsweise verwenden,addResource(String)
geht Hadoop davon aus, dass die Zeichenfolge eine Klassenpfadressource ist. Wenn Sie eine lokale Datei angeben müssen, versuchen Sie Folgendes:quelle
Aufgrund meiner Neulinge brauchte ich einige Zeit, um anhand der gegebenen Antworten eine Lösung zu finden. Das habe ich mir ausgedacht, wenn jemand von Anfang an Hilfe braucht:
Ich benutze Spark 2.1
Und ich habe diesen Teil in meinem
build.sbt
quelle
set fs.defaultFS funktioniert bei mir! Hadoop-2.8.1
quelle
Für SBT verwenden Sie unten mergeStrategy in build.sbt
quelle
Verwenden Sie dieses Plugin
quelle
Wenn Sie sbt verwenden :
quelle
Ich hatte das gleiche Problem. Ich habe zwei Lösungen gefunden: (1) Manuelles Bearbeiten der JAR-Datei:
Öffnen Sie die JAR-Datei mit WinRar (oder ähnlichen Tools). Gehen Sie zu Meta-info> services und bearbeiten Sie "org.apache.hadoop.fs.FileSystem", indem Sie Folgendes anhängen:
(2) Ändern Sie die Reihenfolge meiner Abhängigkeiten wie folgt
quelle
Dies hat nichts mit Flink zu tun, aber ich habe dieses Problem auch in Flink gefunden.
Für Benutzer von Flink müssen Sie das vorgefertigte Hadoop herunterladen und darin ablegen
/opt/flink/lib
.quelle
Ich bin auch auf ein ähnliches Problem gestoßen. Core-site.xml und hdfs-site.xml als Ressourcen von conf (Objekt) hinzugefügt
Auch bearbeitete Versionskonflikte in pom.xml. (zB Wenn die konfigurierte Version von hadoop 2.8.1 ist, die Datei pom.xml jedoch die Version 2.7.1 hat, ändern Sie diese in 2.8.1.) Führen Sie die Maven-Installation erneut aus.
Dieser Fehler wurde für mich behoben.
quelle