Какую зависимость я должен добавить, чтобы получить текстовый файл в s3 с scala-spark, используя intelliJ? - PullRequest
0 голосов
/ 18 июня 2019

Я использую IntelliJ ide и язык scala, я хочу получить доступ к текстовому файлу, хранящемуся в AWS S3, используя учетные данные пользователя IAM.Я не загружал Hadoop в своей системе, используя только зависимости.Я сделал это, используя зависимости Aws и Jets3t.Но я хочу сделать это с искрой.

Основные ошибки, которые я получаю:

java.lang.RuntimeException: java.lang.ClassNotFoundException: Class org.apache.hadoop.fs.s3a.S3AFileSystem not found,
java.lang.RuntimeException: java.lang.ClassNotFoundException: Class org.apache.hadoop.fs.s3.S3FileSystem not found 
// and similarly
Class org.apache.hadoop.fs.s3native.NativeS3FileSystem not found.

Пожалуйста, помогите мне, как решить эту проблему.

Я попытался добавить различные зависимости Hadoop, hadoop-awsЗависимости независимо друг от друга, и каждый дал мне разные ошибки.Например, добавление «org.apache.hadoop»% «hadoop-aws»% «3.2.0» говорит:

 Exception in thread "main" java.lang.NoClassDefFoundError: org/apache/hadoop/fs/StreamCapabilities
  at java.lang.ClassLoader.defineClass1(Native Method)

добавление «org.apache.hadoop"% "hadoop-common"% "3.1.1 "говорит:

Exception in thread "main" java.lang.ExceptionInInitializerError
                    at org.apache.spark.SparkContext.withScope(SparkContext.scala:699)
                    at org.apache.spark.SparkContext.textFile(SparkContext.scala:828)
                    at spark_scala_s3$.main(spark_scala_s3.scala:40).
                for the line:
                val df = sc.textFile(s"s3a://my-week6-spark/$path").

добавление" org.apache.hadoop "%" hadoop-aws "%" 2.7.3 "говорит:

  com.amazonaws.services.s3.model.AmazonS3Exception: Status Code: 400, 
 AWS Service: Amazon S3, AWS Request ID: 90C42E72BEEB31FB, AWS Error Code: null, AWS Error Message: Bad Request, S3 Extended Request ID: (someid).
 java.lang.IllegalArgumentException: java.net.URISyntaxException: Relative path in absolute URI: AKIAUAOZGFGM2K5WEHFC:l0IHiYq4ApJEewbjKR00KwKA+Ra)
  and 
  The authorization mechanism you have provided is not supported. Please use AWS4-HMAC-SHA256.

Код:

// Dependencies in sbt:
    version := "0.1"
    scalaVersion := "2.12.8"
    libraryDependencies += "org.apache.spark" %% "spark-sql" % "2.4.3"
     // and others I added to see what works but gave errors as above

Фактический код файла scala

// just 1 import
import org.apache.spark.sql.SparkSession
val s = SparkSession.builder().appName("trial2").master("local").getOrCreate()
val sc = s.sparkContext

var accessKeyId: String = "acc key"
val secretAccessKey: String = "secret acc key"
sc.hadoopConfiguration.set("fs.s3.awsAccessKeyId", accessKeyId)                     
sc.hadoopConfiguration.set("fs.s3n.awsAccessKeyId", accessKeyId)
sc.hadoopConfiguration.set("fs.s3a.access.key", accessKeyId)   
sc.hadoopConfiguration.set("fs.s3.awsSecretAccessKey",
secretAccessKey)
sc.hadoopConfiguration.set("fs.s3n.awsSecretAccessKey", 
secretAccessKey)
sc.hadoopConfiguration.set("fs.s3a.secret.key",secretAccessKey)
sc.hadoopConfiguration.set("fs.s3n.impl", 
"org.apache.hadoop.fs.s3native.NativeS3FileSystem")                          
sc.hadoopConfiguration.set("fs.s3a.impl", 
"org.apache.hadoop.fs.s3a.S3AFileSystem")
sc.hadoopConfiguration.set("fs.s3.impl", 
"org.apache.hadoop.fs.s3.S3FileSystem")
try{
    val df = sc.textFile(s"s3a://my-week6-spark/$path")
    // my-week6-spark is bucket name
    // path consist of file name
    println("DF.show() 1\n",df.collect())            
catch {
      case exception: Exception => println("1 failed as 
",exception)
     }
try{
   val df = sc.textFile(s"s3n://my-week6-spark/$path")
   println("DF.show() 2\n",df.collect())
}catch {
   case exception: Exception => println("2 failed as ", exception)
       }
try{
   val df = sc.textFile(s"s3://my-week6-spark/$path")
   println("DF.show() 3\n",df.collect())
}catch {
   case exception: Exception => println("3 failed as ", exception)
}
}

Я ожидал, что к файлу будет получен доступ, и напечатаем его в соответствии с ним.Но я получаю ошибки.

Exception in thread "main" java.lang.NoClassDefFoundError: org/apache/hadoop/fs/StreamCapabilities
at java.lang.ClassLoader.defineClass1(Native Method)

и, как уже упоминалось выше, для каждой зависимости она показывает различную ошибку.

Я получил одно решение в сети, где говорится, что он устанавливает путь Hadoop: as: Export hadoop_path = некоторый путь.

но так как я не установил Hadoop, я не могу указать путь, где он установлен.

1 Ответ

0 голосов
/ 19 июня 2019

Я решил эту проблему, добавив следующие зависимости от Maven:

Используйте одну и ту же версию зависимостей hadoop-aws, hadoop-common и hadoop-map-redu.

scalaVersion := "2.12.8"

libraryDependencies += "org.apache.spark" %% "spark-sql" % "2.4.3"
libraryDependencies += "org.apache.hadoop" % "hadoop-aws" % "3.1.2"
libraryDependencies += "org.apache.hadoop" % "hadoop-common" % "3.1.2"
libraryDependencies += "org.apache.hadoop" % "hadoop-mapreduce-client-core" % "3.1.2"

dependencyOverrides += "com.fasterxml.jackson.core" % "jackson-core" % "2.8.7"
dependencyOverrides += "com.fasterxml.jackson.core" % "jackson-databind" % "2.8.7"
dependencyOverrides += "com.fasterxml.jackson.module" % "jackson-module-scala_2.12" % "2.8.7"

Поскольку встроенные банки Джексона не поддерживались, мне пришлось переопределить их для новой версии, а не просто добавить их.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...