Spark写入S3存储桶,提供java.lang.NoClassDefFoundError

时间:2017-11-05 02:06:08

标签: scala apache-spark amazon-s3

我试图将我在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等设置了环境变量。但是没有什么可以让我通过此错误消息。

1 个答案:

答案 0 :(得分:1)

你不能混合hadoop- * JAR,它们都需要完美同步。这意味着:切掉所有的hadoop 2.7神器&amp;替换它们。

FWIW,Hadoop 2.8&amp;之间没有足够的差异。 Hadoop 3.0-beta-1在aws支持方面,除了s3guard DDB目录服务(性能和通过发电机数据库列出),除非你需要这个功能,否则Hadoop 2.8就足够了。