通过spark加载现有的s3文件在scala中给出403,但在python中没有

Posted

技术标签:

【中文标题】通过spark加载现有的s3文件在scala中给出403,但在python中没有【英文标题】:loading existent s3 file through spark gives 403 in scala, but not in python 【发布时间】:2017-01-13 00:08:16 【问题描述】:

大家好

在python中,这执行没问题:

sc._jsc.hadoopConfiguration().set("fs.s3a.access.key", "...") sc._jsc.hadoopConfiguration().set("fs.s3a.secret.key", "...") sc.textFile("s3a://path").count()

一些大数字

在 scala 中,我得到一个 403:

sc.hadoopConfiguration.set("fs.s3a.access.key", "...") sc.hadoopConfiguration.set("fs.s3a.secret.key", "...") sc.textFile("s3a://path").count()

StackTrace:com.amazonaws.services.s3.model.AmazonS3Exception:Forbidden(服务:Amazon S3;状态代码:403;错误代码:403 Forbidden;请求 ID:...)

为什么?

这都是 spark 2.0。

谢谢

【问题讨论】:

【参考方案1】:
    尝试在创建 SC 之前设置属性,例如 set sparkConf "spark.hadoop.fs.s3a..." = value Spark 尝试巧妙地在提交之前将 AWS_ env vars 中的 spark 提交和复制到 s3a 和 s3n 属性中,即使属性已设置。这可以标记您的设置。查看它们,验证它们的正确性,也许取消设置(或尝试设置它们)。 并且 S3a 会经过以下身份验证序列:尝试 hadoop 道具;在目标进程中尝试环境变量;尝试 EC2 IAM 角色(精确检查和排序取决于 Hadoop JAR)。可能是远端的某些东西在这里引起了乐趣。 还有另一个非常不安全的紧急选项,将 username:pass 放入 url,例如 s3a://AAID43ss:1356@bucket/path。如果秘密中有 /,这在 Hadoop 更新这是在多年警告用户停止它之后从 Hadoop 3.2 中删除的。

尝试调试身份验证问题是一种 PITA,因为代码故意避免使用有用的调试语句:我们不敢记录属性。

您可能会在 Hadoop 文档的 Troubleshooting S3A 部分找到有用的信息。请记住,这涵盖了 Hadoop 的更高版本;里面提到的一些东西是无效的。

享受

Steve L(目前正在研究 S3A 代码)

【讨论】:

【参考方案2】:

这意味着在这种情况下,Python 和 Scala 是“不兼容的”并且 Scala 无法访问亚马逊。可能密钥不同,并且您在 Scala 代码上存在拼写错误,或者由于 amazonaws 发生变化,Scala 不再适用于 amazonaws。

【讨论】:

这些键绝对是相同的。我通过就地修改python得到了scala代码。 kv 对确实出现在 hadoopConfiguration.

以上是关于通过spark加载现有的s3文件在scala中给出403,但在python中没有的主要内容,如果未能解决你的问题,请参考以下文章

如何在 spark scala 中重命名 S3 文件而不是 HDFS

并行加载 S3 文件 Spark

通过在spark中使用scala加载csv文件来创建数据帧

我在 s3 中有 .dat 文件。我需要通过 spark 读取文件并做一些过滤器并再次加载到 S3

加载 BytesWritable 时出现 Spark Scala 错误,LOC 标头无效(签名错误)

通过 Apache-Spark 从 AWS S3 加载数据