Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/apache-spark/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Spark Scala S3存储:权限被拒绝_Scala_Apache Spark_Hadoop_Amazon S3 - Fatal编程技术网

Spark Scala S3存储:权限被拒绝

Spark Scala S3存储:权限被拒绝,scala,apache-spark,hadoop,amazon-s3,Scala,Apache Spark,Hadoop,Amazon S3,我在网上读了很多关于如何使用S3获得工作火花的话题,但仍然没有任何东西可以正常工作。 我已下载: 我只将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 我仍然无法使用nor S3N或S3A让spark读取我的文件: 对于S3A,我有一个例外: sc.hadoopConfiguration.set("fs

我在网上读了很多关于如何使用S3获得工作火花的话题,但仍然没有任何东西可以正常工作。 我已下载:

我只将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
我仍然无法使用nor 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
使用这个和一些其他代码,我可以列出我的存储桶、列出我的文件、下载文件、从我的计算机读取文件并获取文件url。 此代码为我提供了以下文件url:

我应该如何安装/设置/下载以使spark能够从S3服务器读写

编辑3:

使用这里的。

似乎问题在于签名,不确定它的含义。

首先,您需要下载与spark hadoop版本安装相匹配的aws-hadoop.jar和aws-java-sdk.jar,并将它们添加到spark文件夹中的
jars
文件夹中。
然后,如果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分钟将出现错误消息

附言:
特别感谢。

非常感谢您的宝贵帮助。

首先,您需要下载与spark hadoop版本安装相匹配的aws-hadoop.jar和aws-java-sdk.jar,并将它们添加到spark文件夹中的
jars
文件夹中。
然后,如果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分钟将出现错误消息

附言:
特别感谢。

非常感谢您提供的宝贵帮助。

如果您的权限被拒绝,那么您的类路径是正确的,请查看可能的副本。。。是AWS(或minio)拒绝了你的钥匙。。。您可以忽略有关Spark Support的minio github问题。忘记S3n吧,它不再被维护,而且性能不佳。关注s3a并处理类路径。要调试下载完整的hadoop发行版,请将s3a密钥密钥放入核心站点,然后在中运行诊断入口点;这是自我诊断代码,我指给每个人看,这是一种表示“你的类路径仍然被破坏”的方式;这是hadoop aws JAR中的一个文件。对于Hadoo3+,您可以编辑
~/.hadooprc
将其拉入“hadoop\u add\u to\u classpath\u tools hadoop-aws”查看可能的副本如果您的权限被拒绝,那么您的类路径是正确的。。。是AWS(或minio)拒绝了你的钥匙。。。您可以忽略有关Spark Support的minio github问题。忘记S3n吧,它不再被维护,而且性能不佳。关注s3a并处理类路径。要调试下载完整的hadoop发行版,请将s3a密钥密钥放入核心站点,然后在中运行诊断入口点;这是自我诊断代码,我指给每个人看,这是一种表示“你的类路径仍然被破坏”的方式;这是hadoop aws JAR中的一个文件。对于Hadoo3+,您可以编辑
~/.hadooprc
将其拉入“hadoop\u add\u to\u classpath\u tools hadoop-aws”伟大的编写程序。您不需要设置spark.hadoop.fs.s3a.impl顺便说一句,它是从hadoop common中/core-default.xml中的选项自动计算出来的。如果连接超时值已更改,这不是有意的…@kiwy更正我,但我认为aws-java-sdk.jar的版本为1.11.x,hadoop的版本为2.7.3。所以我不确定你所说的与spark hadoop安装的hadoop相匹配的版本是什么意思。我发现aws-java-sdk.jar v1.11.656的下载量最大。@AniruddhaTekade我的意思是,一旦找到hadoop版本,您应该检查spark和hadoop的安装情况,避免出错的最简单方法是下载相应的hadoop发行版并获得命名的jar,然后将它们放入spark/jars foldergreat writeup中。您不需要设置spark.hadoop.fs.s3a.impl顺便说一句,它是从hadoop common中/core-default.xml中的选项自动计算出来的。如果连接超时值已更改,这不是有意的…@kiwy更正我,但我认为aws-java-sdk.jar的版本为1.11.x,hadoop的版本为2.7.3。所以我不确定你所说的与spark hadoop安装的hadoop相匹配的版本是什么意思。我发现aws-java-sdk.jar v1.11.656的下载量最大。@AniruddhaTekade我的意思是,你应该检查你安装的spark和hadoop,一旦找到你的hadoop版本,避免出错的最简单的方法就是下载相应的hadoop版本,获得命名的jar并将它们放在spark/jars文件夹中