【问题标题】:Spark write to S3 bucket giving java.lang.NoClassDefFoundErrorSpark 写入 S3 存储桶,给出 java.lang.NoClassDefFoundError
【发布时间】:2017-11-06 20:15:24
【问题描述】:

我正在尝试将在我的 Mac 上运行的 Spark 2.3.0 与 S3 集成。我可以使用 spark-shell 毫无问题地读/写 S3。但是当我尝试使用我通过 sbt 运行的一个小 Scala 程序来做同样的事情时,我得到了 java.lang.NoClassDefFoundError: org/apache/hadoop/fs/GlobalStorageStatistics$StorageStatisticsProvider。

我已经安装了 hadoop-aws 3.0.0-beta1。 我还在 spark-2.3.0/conf/spark-defaults.conf 中设置了 s3 访问信息:

spark.hadoop.fs.s3a.impl                              org.apache.hadoop.fs.s3a.S3AFileSystem
spark.hadoop.fs.s3a.access.key                        XXXX
spark.hadoop.fs.s3a.secret.key                        YYYY
spark.hadoop.com.amazonaws.services.s3.enableV4       true
spark.hadoop.fs.s3a.endpoint                          s3.us-east-2.amazonaws.com
spark.hadoop.fs.s3a.fast.upload                       true
spark.hadoop.fs.s3a.encryption.enabled                true
spark.hadoop.fs.s3a.server-side-encryption-algorithm  AES256

使用 sbt 0.13 版程序可以正常编译。

name := "S3Test"

scalaVersion := "2.11.8"

libraryDependencies += "org.apache.spark" %% "spark-core" % "2.2.0"
libraryDependencies += "org.apache.spark" %% "spark-sql" % "2.2.0"
libraryDependencies +=  "org.apache.hadoop" % "hadoop-aws" % "3.0.0-beta1"

scala代码是:

import org.apache.spark.SparkConf
import org.apache.spark.sql.SparkSession
import com.amazonaws._
import com.amazonaws.auth ._
import com.amazonaws.services.s3 ._
import com.amazonaws. services.s3.model ._
import java.io._
import org.apache.hadoop.fs.FileSystem
import org.apache.hadoop.fs.s3a.S3AFileSystem
object S3Test {
    def main(args: Array[String]) = {
        val spark = SparkSession.builder().master("local").appName("Spark AWS S3 example").getOrCreate()
        import spark.implicits._
        val df  = spark.read.text("test.txt") 
        df.take(5)
        df.write.save(<s3 bucket>)
    }
}

我已经为 JAVA_HOME、HADOOP_HOME、SPARK_HOME、CLASSPATH、SPARK_DIST_CLASSPATH 等设置了环境变量。但是没有什么能让我跳过这个错误消息。

【问题讨论】:

标签: scala apache-spark amazon-s3


【解决方案1】:

您不能混合使用 hadoop-* JAR,它们都需要完美同步。这意味着:删除所有 hadoop 2.7 工件并替换它们。

FWIW,除了 s3guard DDB 目录服务(性能和通过 dynamo DB 列出)之外,Hadoop 2.8 和 Hadoop 3.0-beta-1 在 aws 支持方面没有足够显着的差异,除非您需要功能,Hadoop 2.8 就足够了。

【讨论】:

  • 谢谢史蒂夫。这肯定有帮助。我摆脱了所有与 aws 相关的 jar,在代码中注释了所有与 aws 相关的导入语句。我下载了 aws-java-sdk-1.11.179.jar 和 hadoop-aws-2.8.1.jar 并将它们放在 CLASSPATH 中。现在 spark-submit 工作正常。更早,它只能从 spark-shell 工作。但是,我的 sbt 运行仍然不起作用。我更改了 build.sbt 以摆脱 hadoop-aws 依赖项,而是将这 2 个 jars 添加为依赖项。现在 sbt run 给出 java.lang.NoClassDefFoundError: com/amazonaws/AmazonClientException。也许 sbt 没有从 spark 中选择 aws 设置。
  • 你需要拉入匹配的 amazon-s3-SDK,我很害怕
猜你喜欢
  • 1970-01-01
  • 2021-11-17
  • 2023-03-14
  • 1970-01-01
  • 1970-01-01
  • 2019-12-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多