私はMacで動作するSpark 2.3.0をS3と統合しようとしています。私はspark-shellを使って問題なくS3に読み書きできます。しかし、私がsbtを使って実行する小さなScalaプログラムを使って同じことをしようとすると、 java.lang.NoClassDefFoundError:org/apache/hadoop/fs/GlobalStorageStatistics $ StorageStatisticsProviderが得られます。SparkでS3バケットに書き込み、java.lang.NoClassDefFoundErrorを返します。
hadoop-aws 3.0.0-beta1をインストールしました。 私も火花-2.3.0/confに/スパーク-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のコードは次のとおりです。私は何もなく、などJAVA_HOME、HADOOP_HOME、SPARK_HOME、CLASSPATH、SPARK_DIST_CLASSPATH、環境変数を設定している
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>)
}
}
は、私はこのエラーメッセージを過ぎて取得することができます。
可能な複製:https://stackoverflow.com/questions/45756554/how-to-use-s3-with-apache-spark-2-2-in-the-spark-shell –