通过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 中有 .dat 文件。我需要通过 spark 读取文件并做一些过滤器并再次加载到 S3