scala - Spark Scala S3 存储:权限被拒绝
问题描述
我在 Internet 上阅读了很多关于如何使用 S3 使用 Spark 的主题,但仍然没有任何工作正常。我已经下载了:Spark 2.3.2 with hadoop 2.7 and above。
我只将一些库从 Hadoop 2.7.7(与 Spark/Hadoop 版本匹配)复制到 Spark jars 文件夹:
- hadoop-aws-2.7.7.jar
- hadoop-auth-2.7.7.jar
- aws-java-sdk-1.7.4.jar
我仍然不能使用 S3N 和 S3A 来让 spark 读取我的文件:
对于 S3A,我有这个例外:
sc.hadoopConfiguration.set("fs.s3a.access.key","myaccesskey")
sc.hadoopConfiguration.set("fs.s3a.secret.key","mysecretkey")
val file = sc.textFile("s3a://my.domain:8080/test_bucket/test_file.txt")
com.amazonaws.services.s3.model.AmazonS3Exception: Status Code: 403, AWS Service: Amazon S3, AWS Request ID: AE203E7293ZZA3ED, AWS Error Code: null, AWS Error Message: Forbidden
使用这段Python和更多代码,我可以列出我的存储桶、列出我的文件、下载文件、从我的计算机读取文件并获取文件 url。这段代码给了我以下文件网址:
我应该如何安装/设置/下载以使 spark 能够从我的 S3 服务器读取和写入?
编辑3:
解决方案
首先,您需要下载与您的 spark-hadoop 版本的安装相匹配的 aws-hadoop.jar 和 aws-java-sdk.jar,并将它们添加到jars
spark 文件夹内的文件夹中。
然后,如果您的 S3 服务器不支持动态 DNS,您将需要精确您将使用的服务器并启用路径样式:
sc.hadoopConfiguration.set("fs.s3a.path.style.access","true")
sc.hadoopConfiguration.set("fs.s3a.endpoint","my.domain:8080")
#I had to change signature version because I have an old S3 api implementation:
sc.hadoopConfiguration.set("fs.s3a.signing-algorithm","S3SignerType")
这是我的最终代码:
sc.hadoopConfiguration.set("fs.s3a.impl", "org.apache.hadoop.fs.s3a.S3AFileSystem")
val tmp = sc.textFile("s3a://test_bucket/test_file.txt")
sc.hadoopConfiguration.set("fs.s3a.access.key","mykey")
sc.hadoopConfiguration.set("fs.s3a.secret.key","mysecret")
sc.hadoopConfiguration.set("fs.s3a.endpoint","my.domain:8080")
sc.hadoopConfiguration.set("fs.s3a.connection.ssl.enabled","true")
sc.hadoopConfiguration.set("fs.s3a.path.style.access","true")
sc.hadoopConfiguration.set("fs.s3a.signing-algorithm","S3SignerType")
tmp.count()
我建议将大部分设置放在里面spark-defaults.conf
:
spark.hadoop.fs.s3a.impl org.apache.hadoop.fs.s3a.S3AFileSystem
spark.hadoop.fs.s3a.path.style.access true
spark.hadoop.fs.s3a.endpoint mydomain:8080
spark.hadoop.fs.s3a.connection.ssl.enabled true
spark.hadoop.fs.s3a.signing-algorithm S3SignerType
我遇到的一个问题是设置spark.hadoop.fs.s3a.connection.timeout
为 10,但这个值是在 Hadoop 3 之前以毫秒为单位设置的,它会给你一个很长的超时时间;尝试读取文件后 1.5 分钟会出现错误消息。
PS:
特别感谢Steve Loughran。
非常感谢您的宝贵帮助。
推荐阅读
- html - IHTMLDocument2_write 导致 Internet Explorer 安全弹出 - Powershell
- hydra-core - 是否可以在配置文件中指定相对于配置文件位置的路径?
- python-3.x - pyautogui 在 ubuntu 18.04 中不起作用。热键在编辑器外部不起作用,而在编辑器内部起作用
- wordpress - 在 woo BACS 付款设置中添加字段,该字段将始终为“订单号”并通过电子邮件发送给客户
- java - 如何在第二个 if 块中使用 date1 的更新值。显示错误“date1 无法解析”
- javascript - 在 MTurk HIT 中设置 cookie
- angular - 如何以角度将src插入iframe?
- python - 截取 python tkinter 窗口的屏幕截图(不是整个计算机屏幕)
- python - 我不能以这种方式对 pandas 中的行进行子集:df[0](或任何整数)
- oop - 清理较小的物体