【问题标题】:Cross region S3 access from AWS EMR Spark从 AWS EMR Spark 跨区域 S3 访问
【发布时间】:2016-10-31 23:11:41
【问题描述】:

我的 EMR 位于 us-west-1,但我的 S3 存储桶位于 us-east-1,我遇到了错误。

我尝试过s3://{bucketname}.s3.amazon.com,但这会创建一个带有s3.amazon.com 的新存储桶。

s3桶如何跨地域访问?

com.amazon.ws.emr.hadoop.fs.shaded.com.amazonaws.services.s3.model.AmazonS3Exception: Moved Permanently (Service: Amazon S3; Status Code: 301; Error Code: 301 Moved Permanently; Request ID: FB1139D9BD8F409B), S3 Extended Request ID: pWK3X9BBRp8BLlXEHOx008RCdlZC64YFTounDYGtnwsAneR0IDP1Z/gmDudRoqWhDArfYLNRxk4=
    at com.amazon.ws.emr.hadoop.fs.shaded.com.amazonaws.http.AmazonHttpClient.handleErrorResponse(AmazonHttpClient.java:1389)
    at com.amazon.ws.emr.hadoop.fs.shaded.com.amazonaws.http.AmazonHttpClient.executeOneRequest(AmazonHttpClient.java:902)
    at com.amazon.ws.emr.hadoop.fs.shaded.com.amazonaws.http.AmazonHttpClient.executeHelper(AmazonHttpClient.java:607)
    at com.amazon.ws.emr.hadoop.fs.shaded.com.amazonaws.http.AmazonHttpClient.doExecute(AmazonHttpClient.java:376)
    at com.amazon.ws.emr.hadoop.fs.shaded.com.amazonaws.http.AmazonHttpClient.executeWithTimer(AmazonHttpClient.java:338)
    at com.amazon.ws.emr.hadoop.fs.shaded.com.amazonaws.http.AmazonHttpClient.execute(AmazonHttpClient.java:287)
    at com.amazon.ws.emr.hadoop.fs.shaded.com.amazonaws.services.s3.AmazonS3Client.invoke(AmazonS3Client.java:3826)
    at com.amazon.ws.emr.hadoop.fs.shaded.com.amazonaws.services.s3.AmazonS3Client.getObjectMetadata(AmazonS3Client.java:1015)
    at com.amazon.ws.emr.hadoop.fs.shaded.com.amazonaws.services.s3.AmazonS3Client.getObjectMetadata(AmazonS3Client.java:991)
    at com.amazon.ws.emr.hadoop.fs.s3n.Jets3tNativeFileSystemStore.retrieveMetadata(Jets3tNativeFileSystemStore.java:212)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:498)
    at org.apache.hadoop.io.retry.RetryInvocationHandler.invokeMethod(RetryInvocationHandler.java:191)
    at org.apache.hadoop.io.retry.RetryInvocationHandler.invoke(RetryInvocationHandler.java:102)
    at com.sun.proxy.$Proxy38.retrieveMetadata(Unknown Source)
    at com.amazon.ws.emr.hadoop.fs.s3n.S3NativeFileSystem.getFileStatus(S3NativeFileSystem.java:780)
    at org.apache.hadoop.fs.FileSystem.exists(FileSystem.java:1428)
    at com.amazon.ws.emr.hadoop.fs.EmrFileSystem.exists(EmrFileSystem.java:313)
    at org.apache.spark.sql.execution.datasources.InsertIntoHadoopFsRelationCommand.run(InsertIntoHadoopFsRelationCommand.scala:85)
    at org.apache.spark.sql.execution.command.ExecutedCommandExec.sideEffectResult$lzycompute(commands.scala:60)
    at org.apache.spark.sql.execution.command.ExecutedCommandExec.sideEffectResult(commands.scala:58)
    at org.apache.spark.sql.execution.command.ExecutedCommandExec.doExecute(commands.scala:74)
    at org.apache.spark.sql.execution.SparkPlan$$anonfun$execute$1.apply(SparkPlan.scala:115)
    at org.apache.spark.sql.execution.SparkPlan$$anonfun$execute$1.apply(SparkPlan.scala:115)
    at org.apache.spark.sql.execution.SparkPlan$$anonfun$executeQuery$1.apply(SparkPlan.scala:136)
    at org.apache.spark.rdd.RDDOperationScope$.withScope(RDDOperationScope.scala:151)
    at org.apache.spark.sql.execution.SparkPlan.executeQuery(SparkPlan.scala:133)
    at org.apache.spark.sql.execution.SparkPlan.execute(SparkPlan.scala:114)
    at org.apache.spark.sql.execution.QueryExecution.toRdd$lzycompute(QueryExecution.scala:86)
    at org.apache.spark.sql.execution.QueryExecution.toRdd(QueryExecution.scala:86)
    at org.apache.spark.sql.execution.datasources.DataSource.write(DataSource.scala:487)
    at org.apache.spark.sql.DataFrameWriter.save(DataFrameWriter.scala:211)
    at org.apache.spark.sql.DataFrameWriter.save(DataFrameWriter.scala:194)
    at org.apache.spark.sql.DataFrameWriter.text(DataFrameWriter.scala:520)

【问题讨论】:

  • 这曾经是受支持的,但最近在 EMR 中发生了某种变化。它似乎不再允许访问不同区域中的 S3 存储桶。它似乎也影响了历史 AMI,因此它是 EMR 本身的变化,而不是与 emr-5.0 相关。
  • 是的,我们使用 EMR 4.6 进行跨区域 s3 访问,使用 EMR 5.0 升级 spark 2.0 时遇到了这个问题。我希望有一种明确的方法可以让我通过使用class InstanceProfileCredentialsProvider 或其他方式来设置不同的区域......
  • @JohnRotenstein 这是有问题的。我“还”没有遇到过这样的问题,但是在这种情况下我们该怎么办?请不要告诉我,我们必须使用 S3 API 将数据从一个区域复制到另一个区域,以便我们可以访问它。更荒谬的是历史上的 AMI 受到它的影响。这是一个巨大的倒退。
  • 当我迁移到 EMR 5.0.0 和 4.7.0 时,我在 hadoop 中遇到了同样的问题。我之前在 3.2.1 使用 ami-version,没有 s3 区域问题。我的猜测是用于 hdfs 的底层 s3 本机文件系统选择在 s3 区域之间分发 hadoop 作业信息,而不考虑通过环境设置的 S3 区域。

标签: apache-spark amazon-s3 emr


【解决方案1】:

此解决方案适用于 emr-5.0.0/emr-5.0.3:

将以下属性添加到core-site configuration

"fs.s3n.endpoint":"s3.amazonaws.com"

【讨论】:

【解决方案2】:

是否联系了 AWS 支持团队,TLDR 表示他们已经意识到这个问题,他们目前正在努力解决这个问题,并希望在下一个 EMR 版本中解决这个问题,但我没有 eta。

对于“s3a”,您可以在运行时使用自定义s3 end points within spark,但这不适用于“s3”或“s3n”。

此外,您可以将 EMR 配置为在创建时指向另一个 s3 区域,但是一旦您以这种方式进行配置,您就会陷入该区域。

根据支持团队的说法,此 EMRFS 的区域绑定从 EMR 4.7.2 开始应用。

【讨论】:

    【解决方案3】:

    正如 cmets 中的@codingtwinky 所建议的,EMR 4.6.0 在 emr.hadoop.fs 层中没有这个问题。我的 hadoop 作业现在在 EMR 4.6.0 中工作,但在 5.0.0 或 4.7.0 中不工作。

    【讨论】:

      猜你喜欢
      • 2019-08-07
      • 1970-01-01
      • 1970-01-01
      • 2018-10-21
      • 2021-08-28
      • 1970-01-01
      • 1970-01-01
      • 2020-04-23
      • 2019-06-10
      相关资源
      最近更新 更多