在Spark 1.6中使用s3a的镶木地板

时间:2018-03-28 02:08:50

标签: apache-spark amazon-s3 parquet

我需要从 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 - 如果我无法解决,请添加我正在使用的解决方法。

我认为我可以选择两种方式,但我也不关心。

  • s3a,凭据在core-site.xml中进行了硬编码,或者使用sqlContext.setConf()进行动态设置... 无法正常工作
  • s3a,网址中的凭据内联... 有效
  • s3通过sqlContext.setConf()设置凭据... 无法正常工作
  • s3,凭据在core-site.xml中进行了硬编码... 正常工作

不幸的是......在线包含凭证是不好的安全措施(并且会产生问题)......但是core-site.xml中的硬编码并不是一个完整的解决方案。我需要能够在4组凭证之间切换。所以我的hack-y解决方案是在core-site.xml中硬编码s3凭证...并使用内联s3a来访问其他AWS环境中的Parquet。

宁愿只使用s3a而不使用内联凭据,但遗憾的是我无法使用它。

1 个答案:

答案 0 :(得分:0)

调试auth问题很难,因为每个人都不遗余力地记录秘密。

我从Troubleshooting S3A文档开始。

在这里,我认为问题是秘密和访问密钥的名称已在s3a中更改为fs.s3a.access.keyfs.s3a.secret.key

设置它们,希望你的问题会消失。

我同意你的目标,即不将内幕密码置于其中;在Hadoop 2.8+中,s3a连接器会警告你不要使用URL中的秘密,因为很难将它们从日志中删除。