【问题标题】:spark saveAsTextFile to s3 failsspark saveAsTextFile 到 s3 失败
【发布时间】: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 非常痛苦,并且不断变化,而且它的错误消息描述性不强。

标签: amazon-s3 apache-spark


【解决方案1】:

回答我自己的问题

事实证明,我需要s3:ListBucket 操作,该操作仅适用于资源是存储桶本身而不是存储桶内的键的情况。

在我的原始策略文件中,我有以下资源:

"Resource": "arn:aws:s3:::<bucket-name>/*"

我必须补充:

"Resource": "arn:aws:s3:::<bucket-name>/*"

这是适合我的最终政策文件:

{
  "Id": "Policy145712123124123",
  "Version": "2012-10-17",
  "Statement": [
    {
      "Sid": "Stmt145712812312323",
      "Action": [
        "s3:DeleteObject",
        "s3:GetObject",
        "s3:ListBucket",
        "s3:PutObject"
      ],
      "Effect": "Allow",
      "Resource": [
        "arn:aws:s3:::<bucket-name>",
        "arn:aws:s3:::<bucket-name>/*"
      ],
      "Principal": {
        "AWS": [
          "arn:aws:iam::<account-id>:user/<user-name>"
        ]
      }
    }
  ]
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-11-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-04-20
    • 1970-01-01
    • 2018-01-20
    相关资源
    最近更新 更多