Я пытаюсь запустить простой NaiveBayesClassifer
с помощью hadoop, получаю эту ошибку
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)
Код:
Configuration configuration = new Configuration();
NaiveBayesModel model = NaiveBayesModel.materialize(new Path(modelPath), configuration);// error in this line..
modelPath
указывает на NaiveBayes.bin
файл, а объект конфигурации печатает -Configuration: core-default.xml, core-site.xml
Думаю, это из-за банок, есть идеи?
file:///path/to/dir
Ответы:
Это типичный случай
maven-assembly
поломки плагина.Почему это случилось с нами
Каждый из разных JAR (
hadoop-commons
forLocalFileSystem
,hadoop-hdfs
forDistributedFileSystem
) содержит разные файлы, вызываемыеorg.apache.hadoop.fs.FileSystem
в ихMETA-INFO/services
каталогах. В этом файле перечислены канонические имена классов реализаций файловой системы, которые они хотят объявить (это называется интерфейсом поставщика услуг, реализованным черезjava.util.ServiceLoader
, см.org.apache.hadoop.FileSystem#loadFileSystems
).Когда мы используем
maven-assembly-plugin
, он объединяет все наши JAR в один, и всеMETA-INFO/services/org.apache.hadoop.fs.FileSystem
перезаписывают друг друга. Остается только один из этих файлов (последний добавленный). В этом случаеFileSystem
список изhadoop-commons
заменяет список изhadoop-hdfs
, поэтомуDistributedFileSystem
больше не объявляется.Как мы это исправили
После загрузки конфигурации Hadoop, но непосредственно перед тем, как делать что-либо
FileSystem
, мы вызываем это:Обновление: правильное исправление
Мое внимание привлекло то,
krookedking
что существует способ, основанный на конфигурации, чтобыmaven-assembly
использовать объединенную версию всехFileSystem
объявлений сервисов, посмотрите его ответ ниже.источник
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, и проблема решена.Для тех, кто использует плагин тени, следуя совету david_p, вы можете объединить службы в затененной банке, добавив ServicesResourceTransformer в конфигурацию плагина:
Это объединит все службы org.apache.hadoop.fs.FileSystem в один файл.
источник
Для справки, это все еще происходит в hadoop 2.4.0. Так обидно ...
Мне удалось выполнить инструкции по этой ссылке: http://grokbase.com/t/cloudera/scm-users/1288xszz7r/no-filesystem-for-scheme-hdfs
Я добавил в свой core-site.xml следующее, и это сработало:
источник
спасибо david_p, scala
или
источник
Мне потребовалось много времени, чтобы понять это с помощью Spark 2.0.2, но вот моя часть:
И соответствующие части моего
build.sbt
:Надеюсь, это поможет!
источник
Для maven просто добавьте зависимость maven для hadoop-hdfs (см. Ссылку ниже), чтобы решить проблему.
http://mvnrepository.com/artifact/org.apache.hadoop/hadoop-hdfs/2.7.1
источник
Предполагая, что вы используете mvn и cloudera для распространения hadoop. Я использую cdh4.6, и добавление этих зависимостей у меня сработало. Думаю, вам следует проверить версии зависимостей hadoop и mvn.
не забудьте добавить репозиторий cloudera mvn.
источник
Я использую сборку sbt для упаковки своего проекта. Тоже встречаюсь с этой проблемой. Мое решение здесь. Шаг 1: добавьте стратегию слияния META-INF в свой build.sbt
Шаг 2: добавьте библиотеку hadoop-hdfs в build.sbt
Шаг 3: sbt clean; sbt сборка
Надеюсь, что приведенная выше информация поможет вам.
источник
case PathList("META-INF", "services", "org.apache.hadoop.fs.FileSystem") => MergeStrategy.filterDistinctLines
Это сохранит все зарегистрированные файловые системыЯ предполагаю, что вы создаете образец с помощью maven.
Проверьте содержимое JAR, который вы пытаетесь запустить. Особенно
META-INFO/services
каталог, файлorg.apache.hadoop.fs.FileSystem
. Должен быть список классов реализации файловой системы. Контрольная строкаorg.apache.hadoop.hdfs.DistributedFileSystem
присутствует в списке для HDFS иorg.apache.hadoop.fs.LocalFileSystem
для локальной файловой схемы.В этом случае вам необходимо переопределить указанный ресурс во время сборки.
Другая возможность - у вас просто нет
hadoop-hdfs.jar
в вашем пути к классам, но это имеет низкую вероятность. Обычно, если у вас правильнаяhadoop-client
зависимость, это не вариант.источник
Другая возможная причина (хотя вопрос OPs сам по себе не страдает от этого) заключается в том, что вы создаете экземпляр конфигурации, который не загружает значения по умолчанию:
Если вы не загрузите значения по умолчанию, вы не получите настройки по умолчанию для таких вещей, как
FileSystem
реализации, что приведет к таким же ошибкам, как эта, при попытке доступа к HDFS. Переключение на конструктор без параметров для переходаtrue
к загрузке значений по умолчанию может решить эту проблему.Кроме того, если вы добавляете в
Configuration
объект пользовательские конфигурации (например, в файловой системе), будьте осторожны с тем, какую перегрузкуaddResource()
вы используете. Например, если вы используетеaddResource(String)
then, Hadoop предполагает, что строка является ресурсом пути к классу, если вам нужно указать локальный файл, попробуйте следующее:источник
Мне потребовалось некоторое время, чтобы выяснить, как исправить полученные ответы из-за моей новизны. Вот что я придумал, если кому-то еще нужна помощь с самого начала:
Я использую Spark 2.1
И у меня эта часть в моем
build.sbt
источник
set fs.defaultFS у меня работает! Hadoop-2.8.1
источник
Для SBT используйте ниже mergeStrategy в build.sbt
источник
Используйте этот плагин
источник
Если вы используете sbt :
источник
Я столкнулся с той же проблемой. Я нашел два решения: (1) Редактирование файла jar вручную:
Откройте файл jar с помощью WinRar (или аналогичных инструментов). Перейдите в Meta-info> services и отредактируйте org.apache.hadoop.fs.FileSystem, добавив:
(2) Изменение порядка моих зависимостей следующим образом
источник
Это не связано с Flink, но я также обнаружил эту проблему во Flink.
Для людей, использующих Flink, вам необходимо загрузить предварительно собранный Hadoop и поместить его внутрь
/opt/flink/lib
.источник
Я тоже столкнулся с подобной проблемой. Добавлены core-site.xml и hdfs-site.xml в качестве ресурсов conf (object)
Также редактировал конфликты версий в pom.xml. (например, если настроенная версия hadoop - 2.8.1, но в файле pom.xml, у зависимостей есть версия 2.7.1, затем измените ее на 2.8.1) Снова запустите установку Maven.
Это решило ошибку для меня.
источник