Estoy tratando de ejecutar un simple NaiveBayesClassifer
usando hadoop, obteniendo este error
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)
Codigo:
Configuration configuration = new Configuration();
NaiveBayesModel model = NaiveBayesModel.materialize(new Path(modelPath), configuration);// error in this line..
modelPath
está apuntando al NaiveBayes.bin
archivo, y el objeto de configuración está imprimiendo -Configuration: core-default.xml, core-site.xml
Creo que es por frascos, ¿alguna idea?
file:///path/to/dir
Respuestas:
Este es un caso típico en el que el
maven-assembly
complemento rompe cosas.¿Por qué nos pasó esto?
Cada uno de los diferentes JAR (
hadoop-commons
paraLocalFileSystem
,hadoop-hdfs
paraDistributedFileSystem
) contiene un archivo diferente llamadoorg.apache.hadoop.fs.FileSystem
en suMETA-INFO/services
directorio. Este archivo enumera los nombres de clase canónicos de las implementaciones del sistema de archivos que desean declarar (esto se denomina Interfaz de proveedor de servicios implementada a través dejava.util.ServiceLoader
, consulteorg.apache.hadoop.FileSystem#loadFileSystems
).Cuando lo usamos
maven-assembly-plugin
, fusiona todos nuestros JAR en uno y todos seMETA-INFO/services/org.apache.hadoop.fs.FileSystem
sobrescriben entre sí. Solo queda uno de estos archivos (el último que se agregó). En este caso, laFileSystem
lista dehadoop-commons
sobrescribe la lista dehadoop-hdfs
, porDistributedFileSystem
lo que ya no se declaró.Como lo arreglamos
Después de cargar la configuración de Hadoop, pero justo antes de hacer algo
FileSystem
relacionado, llamamos a esto:Actualización: la solución correcta
Me ha llamado la atención
krookedking
que hay una forma basada en la configuración de hacer que elmaven-assembly
uso sea una versión combinada de todas lasFileSystem
declaraciones de servicios, consulte su respuesta a continuación.fuente
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 a maven y el problema se resolvió.Para aquellos que usan el complemento de sombra, siguiendo el consejo de david_p, puede fusionar los servicios en el frasco sombreado agregando ServicesResourceTransformer a la configuración del complemento:
Esto fusionará todos los servicios org.apache.hadoop.fs.FileSystem en un archivo
fuente
Para el registro, esto todavía está sucediendo en hadoop 2.4.0. Muy frustrante...
Pude seguir las instrucciones en este enlace: http://grokbase.com/t/cloudera/scm-users/1288xszz7r/no-filesystem-for-scheme-hdfs
Agregué lo siguiente a mi core-site.xml y funcionó:
fuente
gracias david_p, scala
o
fuente
Me tomó años entenderlo con Spark 2.0.2, pero aquí está mi granito de arena:
Y las partes relevantes de mi
build.sbt
:¡Espero que esto pueda ayudar!
fuente
Para maven, simplemente agregue la dependencia de maven para hadoop-hdfs (consulte el enlace a continuación) para resolver el problema.
http://mvnrepository.com/artifact/org.apache.hadoop/hadoop-hdfs/2.7.1
fuente
Suponiendo que está utilizando la distribución mvn y cloudera de hadoop. Estoy usando cdh4.6 y agregar estas dependencias funcionó para mí. Creo que debería verificar las versiones de las dependencias de hadoop y mvn.
no olvide agregar el repositorio mvn de cloudera.
fuente
Utilizo el ensamblaje sbt para empaquetar mi proyecto. También me encuentro con este problema. Mi solución está aquí. Paso 1: agregue META-INF mergestrategy en su build.sbt
Paso 2: agregue hadoop-hdfs lib a build.sbt
Paso 3: sbt clean; montaje sbt
Espero que la información anterior pueda ayudarte.
fuente
case PathList("META-INF", "services", "org.apache.hadoop.fs.FileSystem") => MergeStrategy.filterDistinctLines
Esto mantendrá todos los sistemas de archivos registradosSupongo que construye una muestra usando maven.
Verifique el contenido del JAR que está intentando ejecutar. Especialmente
META-INFO/services
directorio, archivoorg.apache.hadoop.fs.FileSystem
. Debería haber una lista de clases de implementación de filsystem. La línea de verificaciónorg.apache.hadoop.hdfs.DistributedFileSystem
está presente en la lista para HDFS yorg.apache.hadoop.fs.LocalFileSystem
para el esquema de archivo local.Si este es el caso, debe anular el recurso referido durante la compilación.
Otra posibilidad es que simplemente no la tenga
hadoop-hdfs.jar
en su classpath, pero esto tiene una probabilidad baja. Por lo general, si tiene lahadoop-client
dependencia correcta, no es una opción.fuente
Otra posible causa (aunque la pregunta de OP en sí misma no sufre de esto) es si crea una instancia de configuración que no carga los valores predeterminados:
Si no carga los valores predeterminados, no obtendrá la configuración predeterminada para cosas como las
FileSystem
implementaciones que conducen a errores idénticos como este al intentar acceder a HDFS. Cambiar al constructor sin parámetros de pasartrue
a cargar valores predeterminados puede resolver esto.Además, si está agregando ubicaciones de configuración personalizadas (por ejemplo, en el sistema de archivos) al
Configuration
objeto, tenga cuidado con la sobrecargaaddResource()
que usa. Por ejemplo, si usaaddResource(String)
Hadoop asume que la cadena es un recurso de ruta de clase, si necesita especificar un archivo local, intente lo siguiente:fuente
Me tomó algún tiempo encontrar la solución a partir de las respuestas dadas, debido a mi falta de experiencia. Esto es lo que se me ocurrió, si alguien más necesita ayuda desde el principio:
Estoy usando Spark 2.1
Y tengo esta parte en mi
build.sbt
fuente
set fs.defaultFS funciona para mí! Hadoop-2.8.1
fuente
Para SBT, use debajo de mergeStrategy en build.sbt
fuente
Utilice este complemento
fuente
Si está utilizando sbt :
fuente
Me enfrenté al mismo problema. Encontré dos soluciones: (1) Editar el archivo jar manualmente:
Abra el archivo jar con WinRar (o herramientas similares). Vaya a Meta-info> servicios y edite "org.apache.hadoop.fs.FileSystem" agregando:
(2) Cambiar el orden de mis dependencias de la siguiente manera
fuente
Esto no está relacionado con Flink, pero también encontré este problema en Flink.
Para las personas que usan Flink, deben descargar Hadoop incluido y ponerlo en su interior
/opt/flink/lib
.fuente
También me encontré con un problema similar. Se agregaron core-site.xml y hdfs-site.xml como recursos de conf (objeto)
También conflictos de versiones editadas en pom.xml. (por ejemplo, si la versión configurada de hadoop es 2.8.1, pero en el archivo pom.xml, las dependencias tienen la versión 2.7.1, luego cámbiela a 2.8.1) Ejecute la instalación de Maven nuevamente.
Este error me solucionó.
fuente