Tratando de leer un archivo que se encuentra en S3 mediante la chispa-shell:

scala> val myRdd = sc.textFile("s3n://myBucket/myFile1.log")
lyrics: org.apache.spark.rdd.RDD[String] = s3n://myBucket/myFile1.log MappedRDD[55] at textFile at <console>:12

scala> myRdd.count
java.io.IOException: No FileSystem for scheme: s3n
    at org.apache.hadoop.fs.FileSystem.getFileSystemClass(FileSystem.java:2607)
    at org.apache.hadoop.fs.FileSystem.createFileSystem(FileSystem.java:2614)
    at org.apache.hadoop.fs.FileSystem.access$200(FileSystem.java:91)
    ... etc ...

La IOException: No sistema de archivos para el esquema: s3n error con:

  • Chispa 1.31 o de 1,40 en dev máquina (no Hadoop libs)
  • Ejecución de la Hortonworks Sandbox HDP v2.2.4 (Hadoop 2.60), que integra Chispa 1.2.1 fuera de la caja
  • Utilizando s3://o s3n://esquema de

¿Cuál es la causa de este error? Falta de dependencia, la Falta de configuración, o mal uso de sc.textFile()?

O puede ser que esto es debido a un bug que afecta a la Chispa de construir específicos para Hadoop 2.60 como este post parece sugerir. Voy a tratar de Chispa para Hadoop 2.40 para ver si esto resuelve el problema.

OriginalEl autor Polymerase | 2015-06-15

12 Comentarios

  1. 40

    Confirmado que esto está relacionado con la Chispa construir en contra de Hadoop 2.60. Acabo de instalar La chispa de la versión 1.4.0 «Pre-fabricadas para Hadoop 2.4 y posteriores» (en lugar de Hadoop 2.6). Y el código ahora funciona OK.

    sc.textFile("s3n://bucketname/Filename") ahora se plantea otro error:

    java.lang.IllegalArgumentException: AWS Access Key ID and Secret Access Key must be specified as the username or password (respectively) of a s3n URL, or by setting the fs.s3n.awsAccessKeyId or fs.s3n.awsSecretAccessKey properties (respectively).
    

    El código siguiente utiliza el S3 formato de URL para mostrar que la Chispa puede leer S3 archivo. Usando dev máquina (no Hadoop libs).

    scala> val lyrics = sc.textFile("s3n://MyAccessKeyID:[email protected]/SafeAndSound_Lyrics.txt")
    lyrics: org.apache.spark.rdd.RDD[String] = MapPartitionsRDD[3] at textFile at <console>:21
    
    scala> lyrics.count
    res1: Long = 9
    

    Incluso Mejor: el código anterior con credenciales de AWS en línea en la S3N URI se romperá si la AWS Clave Secreta tiene un avance de «/». La configuración de Credenciales de AWS en SparkContext va a solucionarlo. Código funciona si el S3 archivo es público o privado.

    sc.hadoopConfiguration.set("fs.s3n.awsAccessKeyId", "BLABLA")
    sc.hadoopConfiguration.set("fs.s3n.awsSecretAccessKey", "....") //can contain "/"
    val myRDD = sc.textFile("s3n://myBucket/MyFilePattern")
    myRDD.count
    
    Chispa 1.6.0 con Hadoop 2.4 trabajó para mí. Chispa 1.6.0 con Hadoop 2.6 no.
    Para otros con el mismo problema, consulte issues.apache.org/jira/browse/SPARK-7442 y los enlaces en la sección de comentarios.
    Véase mi respuesta a continuación de la razón de por qué no funcionó con Hadoop de la versión 2.6.
    Añadiendo lo siguiente a mi SparkContext resuelto mi problema code sc.hadoopConfiguration.set(«fs.s3.impl», «org.apache.hadoop.fs.s3native.NativeS3FileSystem») sc.hadoopConfiguration.set(«fs.s3n.impl», «org.apache.hadoop.fs.s3native.NativeS3FileSystem»)code
    Nota: usted no debería comprobar en el código con su clave secreta y clave de acceso a su repositorio de código. La forma Ideal es dejar que el entorno de clúster de asumir su IAMRole que tiene acceso a S3. He quitado el acceso y claves secretas código de mi programa, pero se olvidó de quitar siguiente fragmento de código cuando se ejecuta en Amazon EMR sc.hadoopConfiguration.set(«fs.s3n.impl», «org.apache.hadoop.fs.s3native.NativeS3FileSystem»), y el programa comenzó a fallar de nuevo con el error anterior.

    OriginalEl autor Polymerase

  2. 30

    A pesar de que esta pregunta ya ha aceptado la respuesta, creo que los detalles exactos de por qué está sucediendo esto todavía están desaparecidos. Así que creo que puede ser un lugar para una respuesta más.

    Si usted agregue la hadoop-aws de dependencia, el código debería funcionar.

    A partir de Hadoop 2.6.0, s3 FS conector ha sido trasladado a una biblioteca independiente llamado hadoop-aws.
    También hay una Jira por que:
    Mover s3 relacionados con el FS conector código para hadoop-aws.

    Esto significa que cualquier versión de spark, que se ha construido en contra de Hadoop 2.6.0 o más reciente tendrá que utilizar otra dependencia externa para ser capaz de conectar con el S3 Sistema de Archivos.

    Aquí está una sbt ejemplo que he probado y funcionan como se espera el uso de Apache Spark 1.6.2 construido en contra de Hadoop 2.6.0:

    libraryDependencies += «org.apache.hadoop» % «hadoop-aws» % «2.6.0»

    En mi caso, me he encontrado con algunos problemas de dependencias, por lo que lo resuelto por la adición de exclusión:

    libraryDependencies += «org.apache.hadoop» % «hadoop-aws» % «2.6.0» excluir(«tomcat», «jasper-compilador») excludeAll ExclusionRule(organización = «javax.servlet»)

    En otra nota relacionada, todavía tengo que probar, pero que se recomienda el uso de «s3» y no «s3n» sistema de ficheros a partir de Hadoop 2.6.0.

    La tercera generación, s3a: sistema de archivos. Diseñado para ser un interruptor de reemplazo para el s3n:, este sistema de ficheros de unión soporta archivos de mayor tamaño y promete un mayor rendimiento.

    OriginalEl autor Sergey Bahchissaraitsev

  3. 14

    Puede agregar la opción –paquetes de parámetro con el adecuado jar:
    para su presentación:

    bin/spark-submit --packages com.amazonaws:aws-java-sdk-pom:1.10.34,org.apache.hadoop:hadoop-aws:2.6.0 code.py
    
    parecía prometedor, pero me da error de descarga para file:/home/jcomeau/.m2/repository/asm/asm/3.2/asm-3.2.jar cuando hago esto con: spark-submit --packages com.amazonaws:aws-java-sdk-pom:1.11.83,org.apache.hadoop:hadoop-aws:2.7.3 merge.py. alguna idea?

    OriginalEl autor Andrew K

  4. 9

    Esta es una muestra de la chispa de código que puede leer los archivos presentes en s3

    val hadoopConf = sparkContext.hadoopConfiguration
    hadoopConf.set("fs.s3.impl", "org.apache.hadoop.fs.s3native.NativeS3FileSystem")
    hadoopConf.set("fs.s3.awsAccessKeyId", s3Key)
    hadoopConf.set("fs.s3.awsSecretAccessKey", s3Secret)
    var jobInput = sparkContext.textFile("s3://" + s3_location)
    

    OriginalEl autor Kaab Awan

  5. 5

    Topó con el mismo problema en la Chispa de la 2.0.2. Resuelto por la alimentación de los tarros. He aquí lo que me encontré:

    $ spark-shell --jars aws-java-sdk-1.7.4.jar,hadoop-aws-2.7.3.jar,jackson-annotations-2.7.0.jar,jackson-core-2.7.0.jar,jackson-databind-2.7.0.jar,joda-time-2.9.6.jar
    
    scala> val hadoopConf = sc.hadoopConfiguration
    scala> hadoopConf.set("fs.s3.impl","org.apache.hadoop.fs.s3native.NativeS3FileSystem")
    scala> hadoopConf.set("fs.s3.awsAccessKeyId",awsAccessKeyId)
    scala> hadoopConf.set("fs.s3.awsSecretAccessKey", awsSecretAccessKey)
    scala> val sqlContext = new org.apache.spark.sql.SQLContext(sc)
    scala> sqlContext.read.parquet("s3://your-s3-bucket/")
    

    obviamente, usted necesita tener los frascos en la ruta en donde se está ejecutando chispa-shell de

    Me encontré con este problema también con Chispa 2.1.0 y se han incorporado las últimas aws requisitos (chispa.los frascos.paquetes de org.apache.hadoop:hadoop-aws:2.7.3) «chispa-defaults.conf», hizo el truco.

    OriginalEl autor user592894

  6. 4

    Tuve que copiar los archivos jar de un hadoop descargar en el $SPARK_HOME/jars directorio. El uso de la --jars bandera o el --packages bandera por chispa presentar no funciona.

    Detalles:

    • Chispa 2.3.0
    • Hadoop descargado fue 2.7.6
    • Dos archivos jar copiado eran de (hadoop dir)/share/hadoop/tools/lib/
      • aws-java-sdk-1.7.4.jar
      • hadoop-aws-2.7.6.jar

    OriginalEl autor James D

  7. 2

    Por Chispa 1.4.x «Pre-fabricadas para Hadoop 2.6 y posteriores»:

    He copiado necesario S3, S3native paquetes de hadoop-aws-2.6.0.jar a
    spark-assembly-1.4.1-hadoop2.6.0.jar.

    Después de que se me reinicia la chispa de clúster y funciona.
    No se olvide de comprobar propietario y el modo de la asamblea de la jarra.

    OriginalEl autor Uster

  8. 2

    Hay una Chispa de JIRA, CHISPA-7481, abierto a partir de hoy, octubre 20, 2016, para añadir una chispa en la nube módulo que incluye dependencias transitivas en todo s3a y azure fue adquirida: necesidad, junto con las pruebas.

    Y un Chispa PR para que coincida. Esto es cómo puedo obtener s3a apoyo en mi chispa se basa

    Si lo haces a mano, usted debe obtener hadoop-aws TARRO de la versión exacta el resto de su hadoop FRASCOS tienen, y una versión de la AWS Frascos de 100% en sincronía con lo que Hadoop aws fue compilado en contra. Para Hadoop 2.7.{1, 2, 3, …}

    hadoop-aws-2.7.x.jar 
    aws-java-sdk-1.7.4.jar
    joda-time-2.9.3.jar
    + jackson-*-2.6.5.jar
    

    Palo todos estos en SPARK_HOME/jars. Ejecutar chispa con sus credenciales establecido en Env variables o en spark-default.conf

    la prueba más simple se puede hacer un recuento de líneas de un Archivo CSV

    val landsatCSV = "s3a://landsat-pds/scene_list.gz"
    val lines = sc.textFile(landsatCSV)
    val lineCount = lines.count()
    

    Obtener un número: todo está bien. Obtener una traza de la pila. Las malas noticias.

    OriginalEl autor Steve Loughran

  9. 1

    Usted probablemente tendrá que usar s3a:/esquema en lugar de s3:/o s3n:/
    Sin embargo, no funciona fuera de la caja (para mí) para que la chispa de la shell. Yo veo las siguientes stacktrace:

    java.lang.RuntimeException: java.lang.ClassNotFoundException: Class org.apache.hadoop.fs.s3a.S3AFileSystem not found
            at org.apache.hadoop.conf.Configuration.getClass(Configuration.java:2074)
            at org.apache.hadoop.fs.FileSystem.getFileSystemClass(FileSystem.java:2578)
            at org.apache.hadoop.fs.FileSystem.createFileSystem(FileSystem.java:2591)
            at org.apache.hadoop.fs.FileSystem.access$200(FileSystem.java:91)
            at org.apache.hadoop.fs.FileSystem$Cache.getInternal(FileSystem.java:2630)
            at org.apache.hadoop.fs.FileSystem$Cache.get(FileSystem.java:2612)
            at org.apache.hadoop.fs.FileSystem.get(FileSystem.java:370)
            at org.apache.hadoop.fs.Path.getFileSystem(Path.java:296)
            at org.apache.hadoop.mapred.FileInputFormat.singleThreadedListStatus(FileInputFormat.java:256)
            at org.apache.hadoop.mapred.FileInputFormat.listStatus(FileInputFormat.java:228)
            at org.apache.hadoop.mapred.FileInputFormat.getSplits(FileInputFormat.java:313)
            at org.apache.spark.rdd.HadoopRDD.getPartitions(HadoopRDD.scala:207)
            at org.apache.spark.rdd.RDD$$anonfun$partitions$2.apply(RDD.scala:219)
            at org.apache.spark.rdd.RDD$$anonfun$partitions$2.apply(RDD.scala:217)
            at scala.Option.getOrElse(Option.scala:120)
            at org.apache.spark.rdd.RDD.partitions(RDD.scala:217)
            at org.apache.spark.rdd.MapPartitionsRDD.getPartitions(MapPartitionsRDD.scala:32)
            at org.apache.spark.rdd.RDD$$anonfun$partitions$2.apply(RDD.scala:219)
            at org.apache.spark.rdd.RDD$$anonfun$partitions$2.apply(RDD.scala:217)
            at scala.Option.getOrElse(Option.scala:120)
            at org.apache.spark.rdd.RDD.partitions(RDD.scala:217)
            at org.apache.spark.SparkContext.runJob(SparkContext.scala:1781)
            at org.apache.spark.rdd.RDD.count(RDD.scala:1099)
            at $iwC$$iwC$$iwC$$iwC$$iwC$$iwC$$iwC$$iwC.<init>(<console>:24)
            at $iwC$$iwC$$iwC$$iwC$$iwC$$iwC$$iwC.<init>(<console>:29)
            at $iwC$$iwC$$iwC$$iwC$$iwC$$iwC.<init>(<console>:31)
            at $iwC$$iwC$$iwC$$iwC$$iwC.<init>(<console>:33)
            at $iwC$$iwC$$iwC$$iwC.<init>(<console>:35)
            at $iwC$$iwC$$iwC.<init>(<console>:37)
            at $iwC$$iwC.<init>(<console>:39)
            at $iwC.<init>(<console>:41)
            at <init>(<console>:43)
            at .<init>(<console>:47)
            at .<clinit>(<console>)
            at .<init>(<console>:7)
            at .<clinit>(<console>)
            at $print(<console>)
            at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
            at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
            at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
            at java.lang.reflect.Method.invoke(Method.java:497)
            at org.apache.spark.repl.SparkIMain$ReadEvalPrint.call(SparkIMain.scala:1065)
            at org.apache.spark.repl.SparkIMain$Request.loadAndRun(SparkIMain.scala:1338)
            at org.apache.spark.repl.SparkIMain.loadAndRunReq$1(SparkIMain.scala:840)
            at org.apache.spark.repl.SparkIMain.interpret(SparkIMain.scala:871)
            at org.apache.spark.repl.SparkIMain.interpret(SparkIMain.scala:819)
            at org.apache.spark.repl.SparkILoop.reallyInterpret$1(SparkILoop.scala:857)
            at org.apache.spark.repl.SparkILoop.interpretStartingWith(SparkILoop.scala:902)
            at org.apache.spark.repl.SparkILoop.command(SparkILoop.scala:814)
            at org.apache.spark.repl.SparkILoop.processLine$1(SparkILoop.scala:657)
            at org.apache.spark.repl.SparkILoop.innerLoop$1(SparkILoop.scala:665)
            at org.apache.spark.repl.SparkILoop.org$apache$spark$repl$SparkILoop$$loop(SparkILoop.scala:670)
            at org.apache.spark.repl.SparkILoop$$anonfun$org$apache$spark$repl$SparkILoop$$process$1.apply$mcZ$sp(SparkILoop.scala:997)
            at org.apache.spark.repl.SparkILoop$$anonfun$org$apache$spark$repl$SparkILoop$$process$1.apply(SparkILoop.scala:945)
            at org.apache.spark.repl.SparkILoop$$anonfun$org$apache$spark$repl$SparkILoop$$process$1.apply(SparkILoop.scala:945)
            at scala.tools.nsc.util.ScalaClassLoader$.savingContextLoader(ScalaClassLoader.scala:135)
            at org.apache.spark.repl.SparkILoop.org$apache$spark$repl$SparkILoop$$process(SparkILoop.scala:945)
            at org.apache.spark.repl.SparkILoop.process(SparkILoop.scala:1059)
            at org.apache.spark.repl.Main$.main(Main.scala:31)
            at org.apache.spark.repl.Main.main(Main.scala)
            at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
            at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
            at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
            at java.lang.reflect.Method.invoke(Method.java:497)
            at org.apache.spark.deploy.SparkSubmit$.org$apache$spark$deploy$SparkSubmit$$runMain(SparkSubmit.scala:665)
            at org.apache.spark.deploy.SparkSubmit$.doRunMain$1(SparkSubmit.scala:170)
            at org.apache.spark.deploy.SparkSubmit$.submit(SparkSubmit.scala:193)
            at org.apache.spark.deploy.SparkSubmit$.main(SparkSubmit.scala:112)
            at org.apache.spark.deploy.SparkSubmit.main(SparkSubmit.scala)
    Caused by: java.lang.ClassNotFoundException: Class org.apache.hadoop.fs.s3a.S3AFileSystem not found
            at org.apache.hadoop.conf.Configuration.getClassByName(Configuration.java:1980)
            at org.apache.hadoop.conf.Configuration.getClass(Configuration.java:2072)
            ... 68 more
    

    Lo creo – tendrá que agregar manualmente el hadoop-aws dependencia manualmente http://search.maven.org/#artifactdetails/org.apache.hadoop/hadoop-aws/2.7.1/jar Pero no tengo idea de cómo agregarlo a spark-shell correctamente.

    Agregar la ruta de acceso de la jarra para spark-shell con el --jars de parámetros, separados por comas. Usted también querrá agregar el aws-java-sdk-*-jar.

    OriginalEl autor pkozlov

  10. 1

    Me estaba enfrentando el mismo problema. Funcionó bien, después de establecer el valor de fs.s3n.impl y la adición de hadoop-aws dependencia.

    sc.hadoopConfiguration.set("fs.s3n.awsAccessKeyId", awsAccessKeyId)
    sc.hadoopConfiguration.set("fs.s3n.awsSecretAccessKey", awsSecretAccessKey)
    sc.hadoopConfiguration.set("fs.s3n.impl", "org.apache.hadoop.fs.s3native.NativeS3FileSystem")
    
    en python: AttributeError: ‘SparkContext’ el objeto no tiene ningún atributo ‘hadoopConfiguration’
    En Python, hadoopConfiguration se puede acceder a través de la implementación de java: sc._jsc.hadoopConfiguration

    OriginalEl autor PDerp15

  11. -1

    Uso s3a en lugar de s3n. Tuve problema similar en una tarea de Hadoop. Después de cambiar de s3n a s3a funcionó.

    por ejemplo,

    s3a://myBucket/con miarch1.registro de

    OriginalEl autor Gaj

Dejar respuesta

Please enter your comment!
Please enter your name here