我需要从 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错误 ...
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
任何建议表示赞赏。
编辑 - 添加有关其他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)
编辑2 - 如果我无法解决,请添加我正在使用的解决方法。
我认为我可以选择两种方式,但我也不关心。
不幸的是......在线包含凭证是不好的安全措施(并且会产生问题)......但是core-site.xml中的硬编码并不是一个完整的解决方案。我需要能够在4组凭证之间切换。所以我的hack-y解决方案是在core-site.xml中硬编码s3凭证...并使用内联s3a来访问其他AWS环境中的Parquet。
宁愿只使用s3a而不使用内联凭据,但遗憾的是我无法使用它。
答案 0 :(得分:0)
调试auth问题很难,因为每个人都不遗余力地记录秘密。
我从Troubleshooting S3A文档开始。
在这里,我认为问题是秘密和访问密钥的名称已在s3a中更改为fs.s3a.access.key
和fs.s3a.secret.key
设置它们,希望你的问题会消失。
我同意你的目标,即不将内幕密码置于其中;在Hadoop 2.8+中,s3a连接器会警告你不要使用URL中的秘密,因为很难将它们从日志中删除。