【发布时间】:2016-03-05 06:05:16
【问题描述】:
我有一个 Spark 进程,它从 S3 获取两个输入文件。在工作结束时,我只想使用saveAsTextFile 方法将结果写回 S3。但是,我收到了Access Denied 错误。
我的政策规则是完全开放的,以确保我没有任何权限错误:
{
"Version": "2012-10-17",
"Id": "Policy1457106962648",
"Statement": [
{
"Sid": "Stmt1457106959104",
"Effect": "Allow",
"Principal": "*",
"Action": "s3:*",
"Resource": "arn:aws:s3:::<bucket-name>/*"
}
]
}
我在SparkContext 上设置了我的凭据,如下所示:
SparkConf conf = new SparkConf()
.setAppName("GraphAnalyser")
.setMaster("local[*]")
.set("spark.driver.memory", "2G");
.set("spark.hadoop.fs.s3.awsAccessKeyId", [access-key])
.set("spark.hadoop.fs.s3n.awsAccessKeyId", [access-key])
.set("spark.hadoop.fs.s3.awsSecretAccessKey", [secret-key])
.set("spark.hadoop.fs.s3n.awsSecretAccessKey", [secret-key]);
我使用带有 s3n 协议的传递文件 URL:
final String SC_NODES_FILE = "s3n://" + BUCKET_NAME + "/" + NODES_FILE;
final String SC_EDGES_FILE = "s3n://" + BUCKET_NAME + "/" + EDGES_FILE;
final String SC_OUTPUT_FILE = "s3n://" + BUCKET_NAME + "/output";
请注意,我在访问输入文件时没有问题。似乎 Spark 为输出文件发送了一个HEAD 请求,以确保它在尝试保存最终结果之前不存在。因为,s3 返回Access Denied 而不是Not Found。这可能是 Spark 抛出异常并退出的原因。
org.apache.hadoop.fs.s3.S3Exception: org.jets3t.service.S3ServiceException: S3 HEAD request failed for '/output.csv' - ResponseCode=403, ResponseMessage=Forbidden
火花 1.6.0 aws-java-sdk (1.10.58) spark-core_2.10 (1.6.0)
感谢您的帮助。非常感谢。
【问题讨论】:
-
尝试检查区域设置! AWS 的 API 非常痛苦,并且不断变化,而且它的错误消息描述性不强。