2017-11-05 9 views
0

私は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>) 
    } 
} 

は、私はこのエラーメッセージを過ぎて取得することができます。

+1

可能な複製:https://stackoverflow.com/questions/45756554/how-to-use-s3-with-apache-spark-2-2-in-the-spark-shell –

答えて

1

hadoop- * JARを混在させることはできません。完全に同期する必要があります。つまり、すべてのhadoop 2.7アーティファクトを切り取ります。&を置き換えます。

FWIWは、s3guard DDBディレクトリサービス(パフォーマンス&ダイナモDB経由リスト)以外のAWSサポートの面で3.0ベータ1のHadoop & 2.8のHadoopとの間に有意な十分な違いは、しない限り、あなたが必要とすること、ありませんその機能は、Hadoop 2.8で十分でしょう。

+0

Thanks Steve。これは間違いなく助けになりました。私はすべてのaws関連のjarを取り除き、コード内のaws関連のimport文をすべてコメントしました。 aws-java-sdk-1.11.179.jarとhadoop-aws-2.8.1.jarをダウンロードし、CLASSPATHに入れました。今、spark-submitはうまく動作します。 Earier、それはスパークシェルだけで動作しました。しかし、私のsbtの実行はまだ動作しません。私はbuild.sbtを変更してhadoop-awsの依存関係を取り除き、代わりにこれら2つのjarを依存関係として追加しました。今、sbt runはjava.lang.NoClassDefFoundErrorを提供しています:com/amazonaws/AmazonClientException。おそらくsbtは火花からawsの設定を選んでいません。 –

+0

あなたは、一致するamazon-s3-SDKをプルする必要があるでしょう、私は怖いです –

関連する問題