Estou tentando executar um simples NaiveBayesClassifer
usando o hadoop, obtendo este erro
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)
Código:
Configuration configuration = new Configuration();
NaiveBayesModel model = NaiveBayesModel.materialize(new Path(modelPath), configuration);// error in this line..
modelPath
está apontando para o NaiveBayes.bin
arquivo e o objeto de configuração está sendo impresso -Configuration: core-default.xml, core-site.xml
Acho que é por causa dos potes, alguma ideia?
file:///path/to/dir
Respostas:
Este é um caso típico de
maven-assembly
falha do plugin.Por que isso aconteceu conosco
Diferentes JARs (
hadoop-commons
forLocalFileSystem
,hadoop-hdfs
forDistributedFileSystem
) cada um contém um arquivo diferente chamadoorg.apache.hadoop.fs.FileSystem
em seuMETA-INFO/services
diretório. Este arquivo lista os nomes de classe canônicos das implementações do sistema de arquivos que eles desejam declarar (isso é chamado de Interface de provedor de serviços implementada viajava.util.ServiceLoader
, consulteorg.apache.hadoop.FileSystem#loadFileSystems
).Quando usamos
maven-assembly-plugin
, ele mescla todos os nossos JARs em um e todosMETA-INFO/services/org.apache.hadoop.fs.FileSystem
sobrescrevem uns aos outros. Apenas um desses arquivos permanece (o último que foi adicionado). Nesse caso, aFileSystem
lista dehadoop-commons
substitui a lista dehadoop-hdfs
, entãoDistributedFileSystem
não foi mais declarada.Como consertamos
Depois de carregar a configuração do Hadoop, mas antes de fazer qualquer coisa
FileSystem
relacionada, chamamos isso de:Atualização: a correção correta
Fui informado de
krookedking
que existe uma forma baseada em configuração de fazer omaven-assembly
uso de uma versão mesclada de todas asFileSystem
declarações de serviços, verifique sua resposta abaixo.fonte
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
do maven ao maven e o problema foi resolvido.Para aqueles que usam o plugin de sombra, seguindo o conselho de david_p, você pode mesclar os serviços no jar sombreado adicionando o ServicesResourceTransformer à configuração do plugin:
Isso irá mesclar todos os serviços org.apache.hadoop.fs.FileSystem em um arquivo
fonte
Para registro, isso ainda está acontecendo no hadoop 2.4.0. Tão frustrante...
Consegui seguir as instruções neste link: http://grokbase.com/t/cloudera/scm-users/1288xszz7r/no-filesystem-for-scheme-hdfs
Eu adicionei o seguinte ao meu core-site.xml e funcionou:
fonte
obrigado david_p, scala
ou
fonte
Levei séculos para descobrir isso com o Spark 2.0.2, mas aqui vai minha parte:
E as partes relevantes do meu
build.sbt
:Espero que isso possa ajudar!
fonte
Para o maven, basta adicionar a dependência do maven para hadoop-hdfs (consulte o link abaixo) para resolver o problema.
http://mvnrepository.com/artifact/org.apache.hadoop/hadoop-hdfs/2.7.1
fonte
Supondo que você esteja usando a distribuição mvn e cloudera do hadoop. Estou usando o cdh4.6 e adicionar essas dependências funcionou para mim. Acho que você deve verificar as versões das dependências hadoop e mvn.
não se esqueça de adicionar o repositório cloudera mvn.
fonte
Eu uso o assembly sbt para empacotar meu projeto. Eu também encontro esse problema. Minha solução está aqui. Passo 1: adicione META-INF mergestrategy em seu build.sbt
Passo 2: adicione hadoop-hdfs lib a build.sbt
Passo 3: sbt clean; montagem sbt
Espero que as informações acima possam ajudá-lo.
fonte
case PathList("META-INF", "services", "org.apache.hadoop.fs.FileSystem") => MergeStrategy.filterDistinctLines
Isto irá manter todos os sistemas de arquivos registradosPresumo que você construa a amostra usando o maven.
Verifique o conteúdo do JAR que você está tentando executar. Especialmente
META-INFO/services
diretório, arquivoorg.apache.hadoop.fs.FileSystem
. Deve haver uma lista de classes de implementação do sistema de arquivos. A linha de verificaçãoorg.apache.hadoop.hdfs.DistributedFileSystem
está presente na lista para HDFS eorg.apache.hadoop.fs.LocalFileSystem
para esquema de arquivo local.Se for esse o caso, você deve substituir o recurso referido durante a construção.
Outra possibilidade é você simplesmente não ter
hadoop-hdfs.jar
em seu caminho de classe, mas isso tem baixa probabilidade. Normalmente, se você tiverhadoop-client
dependência correta , não é uma opção.fonte
Outra causa possível (embora a questão dos OPs não sofra com isso) é se você criar uma instância de configuração que não carregue os padrões:
Se você não carregar os padrões, não obterá as configurações padrão para coisas como as
FileSystem
implementações, o que leva a erros idênticos como este ao tentar acessar o HDFS. Mudar para o construtor sem parâmetros de passagemtrue
para padrões de carregamento pode resolver isso.Além disso, se você estiver adicionando locais de configuração personalizados (por exemplo, no sistema de arquivos) ao
Configuration
objeto, tome cuidado com a sobrecargaaddResource()
usada. Por exemplo, se você usaraddResource(String)
, o Hadoop pressupõe que a string é um recurso de caminho de classe; se você precisar especificar um arquivo local, tente o seguinte:fonte
Levei algum tempo para descobrir a correção a partir de respostas dadas, devido à minha novidade. Isso é o que eu descobri, se alguém precisar de ajuda desde o início:
Estou usando o Spark 2.1
E eu tenho essa parte no meu
build.sbt
fonte
set fs.defaultFS funciona para mim! Hadoop-2.8.1
fonte
Para SBT, use abaixo mergeStrategy em build.sbt
fonte
Use este plugin
fonte
Se você estiver usando sbt :
fonte
Eu enfrentei o mesmo problema. Encontrei duas soluções: (1) Editar o arquivo jar manualmente:
Abra o arquivo jar com WinRar (ou ferramentas semelhantes). Acesse Meta-info> serviços e edite "org.apache.hadoop.fs.FileSystem" anexando:
(2) Alterando a ordem das minhas dependências como segue
fonte
Isso não está relacionado ao Flink, mas também encontrei esse problema no Flink.
Para quem usa o Flink, você precisa baixar o Hadoop pré-empacotado e colocá-lo dentro
/opt/flink/lib
.fonte
Eu também me deparei com um problema semelhante. Adicionados core-site.xml e hdfs-site.xml como recursos de conf (objeto)
Também editou conflitos de versão em pom.xml. (por exemplo, se a versão configurada do hadoop for 2.8.1, mas no arquivo pom.xml, as dependências têm a versão 2.7.1, então mude para 2.8.1) Execute a instalação do Maven novamente.
Isso resolveu o erro para mim.
fonte