【问题标题】:Parquet using s3a in Spark 1.6在 Spark 1.6 中使用 s3a 的 Parquet
【发布时间】: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.6Parquet 的最佳猜测是这样的,但我得到了 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


    【解决方案1】:

    调试身份验证问题很困难,因为每个人都竭尽全力不记录秘密。

    我将从 Troubleshooting S3A 文档开始。

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

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

    我同意您不将机密内联的目标;在 Hadoop 2.8+ 中,s3a 连接器会警告您注意 URL 中的秘密,因为很难将它们排除在日志之外。

    【讨论】:

    • 感谢您的反馈。 hadoop 已经可以很好地进行身份验证了。问题在于 SqlContext(无法验证)与 SparkContext(可以验证)作为入口点,这超出了这个 hadoop 文档的范围。
    猜你喜欢
    • 2016-08-23
    • 2017-02-11
    • 1970-01-01
    • 2020-07-12
    • 2021-12-31
    • 2019-07-09
    • 2016-03-16
    • 2018-04-26
    相关资源
    最近更新 更多