【发布时间】:2018-09-06 13:51:33
【问题描述】:
我需要从 Spark 1.6 访问 S3 上的 Parquet 文件。我尝试的方法在底部,我收到“403 Forbidden”错误,这与密钥无效或丢失的错误相同。
从历史上看,我已经使用已弃用的 s3n 和内联键来做到这一点:
s"s3n://${key}:${secretKey}@${s3_bucket}"
出于所有有据可查的原因,s3n 和这种格式存在问题。
当我从 Spark 1.6 访问 JSON 时,这工作...
sc.hadoopConfiguration.set("fs.s3a.endpoint", "s3.amazonaws.com")
sc.hadoopConfiguration.set("fs.s3a.access.key", key)
sc.hadoopConfiguration.set("fs.s3a.secret.key", secretKey)
sc.hadoopConfiguration.set("mapreduce.fileoutputcommitter.algorithm.version", "2")
val fg = "s3a://bucket/folder/dt=" + day
val rdd = sc.textFile(fg)
当我从 Spark 2.x 访问 Parquet 时,这工作...
val spark = {
SparkSession.builder //()
.config("fs.s3a.access.key", key)
.config("fs.s3a.secret.key", secretKey)
.config("mapreduce.fileoutputcommitter.algorithm.version", "2")
.getOrCreate()
}
val fg = "s3a://bucket/folder/dt=" + day
val parqet = spark.read.parquet(fg)
我对 Spark 1.6 的 Parquet 的最佳猜测是这样的,但我得到了 403 Forbidden 错误... p>
sqlContext.setConf("fs.s3a.access.key", key)
sqlContext.setConf("fs.s3a.secret.key", secretKey)
sqlContext.setConf("fs.s3a.endpoint", "s3.amazonaws.com")
val fg = "s3a://bucket/folder/dt=" + day
val parq = sqlContext.read.parquet(fg) // 403 Forbidden here
任何建议表示赞赏。
EDIT - 添加有关其他 s3a 设置的一些详细信息。
// sqlContext.getAllConfs.filter(_._1 contains "s3a").foreach(println)
(fs.s3a.connection.maximum,15)
(fs.s3a.impl,org.apache.hadoop.fs.s3a.S3AFileSystem)
(fs.s3a.fast.buffer.size,1048576)
(fs.s3a.awsSecretAccessKey,DikembeMutombo)
(fs.s3a.connection.timeout,50000)
(fs.s3a.buffer.dir,${hadoop.tmp.dir}/s3a)
(fs.s3a.endpoint,s3.amazonaws.com)
(fs.s3a.paging.maximum,5000)
(fs.s3a.threads.core,15)
(fs.s3a.multipart.purge,false)
(fs.s3a.threads.max,256)
(fs.s3a.multipart.threshold,2147483647)
(fs.s3a.awsAccessKeyId,DikembeMutombo)
(fs.s3a.connection.ssl.enabled,true)
(fs.s3a.connection.establish.timeout,5000)
(fs.s3a.threads.keepalivetime,60)
(fs.s3a.max.total.tasks,1000)
(fs.s3a.fast.upload,false)
(fs.s3a.attempts.maximum,10)
(fs.s3a.multipart.size,104857600)
(fs.s3a.multipart.purge.age,86400)
EDIT 2 - 添加我无法解决时使用的解决方法。
我认为我有两个可以发挥作用的选择,但我都不在乎。
- 具有在 core-site.xml 中硬编码或使用 sqlContext.setConf() 动态设置的凭据的 s3a...不起作用。
- 在 URL 中内嵌凭据的 s3a...有效。
- 通过 sqlContext.setConf() 设置凭据的 s3...不起作用。
- s3 带有硬编码在 core-site.xml 中的凭据...工作。
不幸的是...包含内联凭据是不好的安全做法(并且会产生问题)...但是 core-site.xml 中的硬编码并不是一个完整的解决方案。我需要能够在 4 组凭据之间切换。所以我的 hack-y 解决方案是在 core-site.xml 中硬编码 s3 凭证......并使用 s3a 内联来访问其他 AWS 环境中的 Parquet。
宁愿只使用 s3a 而从不使用内联凭据,但不幸的是我无法让它工作。
【问题讨论】:
标签: apache-spark amazon-s3 parquet