Próbuję uruchomić prosty NaiveBayesClassifer
przy użyciu hadoop, otrzymując ten błąd
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)
Kod :
Configuration configuration = new Configuration();
NaiveBayesModel model = NaiveBayesModel.materialize(new Path(modelPath), configuration);// error in this line..
modelPath
wskazuje NaiveBayes.bin
plik, a obiekt konfiguracyjny drukuje -Configuration: core-default.xml, core-site.xml
Myślę, że to z powodu słoików, jakieś pomysły?
file:///path/to/dir
Odpowiedzi:
Jest to typowy przypadek
maven-assembly
zepsucia wtyczki.Dlaczego to nam się przydarzyło
Każdy z różnych plików JAR (
hadoop-commons
forLocalFileSystem
,hadoop-hdfs
forDistributedFileSystem
) zawiera inny plik o nazwieorg.apache.hadoop.fs.FileSystem
w swoimMETA-INFO/services
katalogu. Ten plik zawiera kanoniczne nazwy klas implementacji systemu plików, które chcą zadeklarować (nazywa się to interfejsem dostawcy usług zaimplementowanym za pośrednictwemjava.util.ServiceLoader
, patrzorg.apache.hadoop.FileSystem#loadFileSystems
).Kiedy używamy
maven-assembly-plugin
, łączy wszystkie nasze pliki JAR w jeden i wszystkieMETA-INFO/services/org.apache.hadoop.fs.FileSystem
nadpisują się nawzajem. Pozostał tylko jeden z tych plików (ostatni dodany). W tym przypadkuFileSystem
lista zhadoop-commons
nadpisuje listę zhadoop-hdfs
, więcDistributedFileSystem
nie była już deklarowana.Jak to naprawiliśmy
Po załadowaniu konfiguracji Hadoop, ale tuż przed zrobieniem czegokolwiek związanego
FileSystem
, nazywamy to:Aktualizacja: poprawna poprawka
Zwróciło mi uwagę,
krookedking
że istnieje sposób oparty na konfiguracji, abymaven-assembly
użyć połączonej wersji wszystkichFileSystem
deklaracji usług, sprawdź jego odpowiedź poniżej.źródło
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
mavena do mavena i rozwiązałem problem.Dla tych, którzy używają wtyczki cieniowania, zgodnie z radą david_p, możesz scalić usługi w cieniowanym jar, dodając ServicesResourceTransformer do konfiguracji wtyczki:
Spowoduje to scalenie wszystkich usług org.apache.hadoop.fs.FileSystem w jeden plik
źródło
Dla przypomnienia, to nadal się dzieje w Hadoop 2.4.0. Bardzo frustrujące...
Udało mi się postępować zgodnie z instrukcjami w tym linku: http://grokbase.com/t/cloudera/scm-users/1288xszz7r/no-filesystem-for-scheme-hdfs
Dodałem następujący plik do mojego core-site.xml i zadziałało:
źródło
dzięki david_p, scala
lub
źródło
Wieki zajęło mi rozgryzienie tego w Spark 2.0.2, ale oto moja część:
I odpowiednie części mojego
build.sbt
:Mam nadzieję, że to pomoże!
źródło
W przypadku maven wystarczy dodać zależność maven dla hadoop-hdfs (patrz link poniżej), aby rozwiązać problem.
http://mvnrepository.com/artifact/org.apache.hadoop/hadoop-hdfs/2.7.1
źródło
Zakładając, że używasz dystrybucji hadoop mvn i cloudera. Używam cdh4.6 i dodanie tych zależności zadziałało. Myślę, że powinieneś sprawdzić wersje zależności hadoop i mvn.
nie zapomnij dodać repozytorium cloudera mvn.
źródło
Używam zestawu SBT do spakowania mojego projektu. Ja też spotykam się z tym problemem. Moje rozwiązanie jest tutaj. Krok 1: dodaj strategię łączenia META-INF w pliku build.sbt
Krok 2: dodaj bibliotekę hadoop-hdfs do build.sbt
Step3: sbt clean; montaż sbt
Mam nadzieję, że powyższe informacje mogą ci pomóc.
źródło
case PathList("META-INF", "services", "org.apache.hadoop.fs.FileSystem") => MergeStrategy.filterDistinctLines
To zachowa wszystkie zarejestrowane systemy plikówZakładam, że tworzysz sample używając Mavena.
Sprawdź zawartość pliku JAR, który próbujesz uruchomić. Szczególnie
META-INFO/services
katalog, plikorg.apache.hadoop.fs.FileSystem
. Powinna być lista klas implementacji systemu plików. Linia kontrolnaorg.apache.hadoop.hdfs.DistributedFileSystem
jest obecna na liście dla HDFS iorg.apache.hadoop.fs.LocalFileSystem
lokalnego schematu plików.W takim przypadku musisz przesłonić przywołany zasób podczas kompilacji.
Inną możliwością jest to, że po prostu nie masz
hadoop-hdfs.jar
w swojej ścieżce klas, ale jest to małe prawdopodobieństwo. Zwykle, jeśli masz poprawnąhadoop-client
zależność, nie ma takiej opcji.źródło
Inną możliwą przyczyną (chociaż samo pytanie OPs nie cierpi z tego powodu) jest utworzenie instancji konfiguracji, która nie ładuje ustawień domyślnych:
Jeśli nie załadujesz ustawień domyślnych, nie uzyskasz ustawień domyślnych dla rzeczy takich jak
FileSystem
implementacje, które prowadzą do identycznych błędów, takich jak ten, podczas próby uzyskania dostępu do HDFS. Przełączenie do konstruktora bez parametrów, który przekazujetrue
wartości domyślne w celu załadowania, może rozwiązać ten problem.Dodatkowo, jeśli dodajesz niestandardowe lokalizacje konfiguracji (np. W systemie plików) do
Configuration
obiektu, uważaj na to, jakiego przeciążeniaaddResource()
używasz. Na przykład, jeśli używasz,addResource(String)
Hadoop zakłada, że ciąg jest zasobem ścieżki klasy, jeśli chcesz określić plik lokalny, spróbuj wykonać następujące czynności:źródło
Zajęło mi trochę czasu, aby znaleźć rozwiązanie na podstawie udzielonych odpowiedzi, ze względu na moją nowość. Oto co wymyśliłem, jeśli ktoś potrzebuje pomocy od samego początku:
Używam Spark 2.1
I mam tę część w moim
build.sbt
źródło
zestaw fs.defaultFS działa dla mnie! Hadoop-2.8.1
źródło
Dla SBT użyj poniżej mergeStrategy w build.sbt
źródło
Użyj tej wtyczki
źródło
Jeśli używasz sbt :
źródło
Miałem ten sam problem. Znalazłem dwa rozwiązania: (1) Ręczna edycja pliku jar:
Otwórz plik jar za pomocą WinRar (lub podobnych narzędzi). Przejdź do Meta-info> services i edytuj „org.apache.hadoop.fs.FileSystem”, dodając:
(2) Zmiana kolejności moich zależności w następujący sposób
źródło
Nie jest to związane z Flink, ale znalazłem ten problem również w Flink.
W przypadku osób korzystających z Flink należy pobrać wstępnie dołączony Hadoop i umieścić go w środku
/opt/flink/lib
.źródło
Trafiłem też na podobny problem. Dodano core-site.xml i hdfs-site.xml jako zasoby conf (obiekt)
Również edytowane konflikty wersji w pom.xml. (np. jeśli skonfigurowana wersja hadoop to 2.8.1, ale w pliku pom.xml, zależności mają wersję 2.7.1, zmień ją na 2.8.1) Uruchom ponownie instalację Mavena.
Ten błąd rozwiązał za mnie.
źródło