【问题标题】:Which dependency I should add to get txt file in s3 with scala-spark using intelliJ?我应该添加哪个依赖项以使用 intelliJ 使用 scala-spark 在 s3 中获取 txt 文件?
【发布时间】:2019-10-31 19:12:40
【问题描述】:

我正在使用 IntelliJ ide 和语言 scala,我想使用 IAM 用户凭证访问存储在 AWS S3 中的文本文件。我没有仅使用依赖项在我的系统上下载 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 路径: 作为: 导出 hadoop_path = 一些路径。

但由于我没有安装 Hadoop,我无法提供安装它的任何路径。

【问题讨论】:

    标签: scala apache-spark hadoop


    【解决方案1】:

    我通过添加来自 Maven 的以下依赖项解决了这个问题:

    使用相同版本的 hadoop-aws、hadoop-common 和 hadoop-map-reduce 依赖项。

    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"
    

    由于不支持内置的杰克逊罐子,我不得不为新版本覆盖它们,而不仅仅是添加它们。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-05-10
      • 2021-12-06
      • 2018-10-30
      • 1970-01-01
      • 2012-07-07
      • 2020-08-12
      • 2020-08-06
      • 1970-01-01
      相关资源
      最近更新 更多