Я использую IntelliJ ide и язык scala, я хочу получить доступ к текстовому файлу, хранящемуся в AWS S3, используя учетные данные пользователя IAM.Я не загружал 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: as: Export hadoop_path = некоторый путь.
но так как я не установил Hadoop, я не могу указать путь, где он установлен.