Apache spark 使用动态hadoop conf在同一spark会话中访问两个s3帐户,访问被拒绝(403)

Apache spark 使用动态hadoop conf在同一spark会话中访问两个s3帐户,访问被拒绝(403),apache-spark,pyspark,amazon-emr,hadoop2,Apache Spark,Pyspark,Amazon Emr,Hadoop2,这是我所问的问题的后续问题,这是关于如何通过动态更改hadoop配置来使用相同的spark会话访问两个s3帐户的更具体的问题 我有两个s3帐户,即A和B,我在帐户B中运行EMR管道,该管道将从帐户B中s3桶中的帐户A写入拼花文件中读取csv。 我无法在EMR中添加帐户A的角色/存储桶策略。 所以我使用凭证访问帐户A并读取csv文件。这是我使用hadoop配置实现的 sc = SparkContext(appName="parquet_ingestion").getOrCreate()

这是我所问的问题的后续问题,这是关于如何通过动态更改hadoop配置来使用相同的spark会话访问两个s3帐户的更具体的问题

我有两个s3帐户,即A和B,我在帐户B中运行EMR管道,该管道将从帐户B中s3桶中的帐户A写入拼花文件中读取csv。 我无法在EMR中添加帐户A的角色/存储桶策略。 所以我使用凭证访问帐户A并读取csv文件。这是我使用hadoop配置实现的

    sc = SparkContext(appName="parquet_ingestion").getOrCreate()
    hadoop_config = sc._jsc.hadoopConfiguration()
    hadoop_config.set("fs.s3.awsAccessKeyId", dl_access_key)
    hadoop_config.set("fs.s3.awsSecretAccessKey", dl_secret_key)
    hadoop_config.set("fs.s3.awsSessionToken", dl_session_key)
    hadoop_config.set("fs.s3.path.style.access", "true");
    hadoop_config.set("mapreduce.fileoutputcommitter.algorithm.version", "2")
并使用下面的配置动态更改hadoop配置写入帐户B的s3

hadoop_config = sc._jsc.hadoopConfiguration()
hadoop_config.unset("fs.s3.awsAccessKeyId")
hadoop_config.unset("fs.s3.awsSecretAccessKey")
hadoop_config.unset("fs.s3.awsSessionToken")
对于有限数量的文件,这很好,但当我一次运行50个作业时,对于一些4/5作业,它会得到403个拒绝访问错误。作业的其余部分能够在帐户B的s3桶中创建拼花文件。 经过分析,我发现它在编写拼花地板文件时失败了

我向AWS支持团队询问了此拒绝访问错误,他们说在写入期间尝试对帐户A执行ListBukSet操作时失败。因此作业正在尝试使用默认EMR角色访问帐户A,因为凭据未设置且失败

根据这些信息,我得出结论,hadoop unset在某些工作中并没有像预期的那样工作。理想情况下,在我取消设置访问密钥和凭证后,它应该在编写拼花时回退到帐户B

py4j.GatewayConnection.run(GatewayConnection.java:238)\n在 java.lang.Thread.run(Thread.java:748)\n使用者: org.apache.spark.sparkeexception:由于阶段失败,作业中止: 阶段1.0中的任务0失败4次,最近一次失败:丢失任务0.3 在第1.0阶段(TID 4,ip-172-31-31-212.ap-south-1.compute.internal, 执行器23):java.io.IOException: com.amazon.ws.emr.hadoop.fs.shade.com.amazonaws.services.s3.model.amazons3异常: 拒绝访问(服务:Amazon S3;状态代码:403;错误代码: 拒绝访问;请求ID:


问题:如何通过一些配置将其设置为默认帐户(B)来克服这种情况?

取消设置很奇怪,因为如果触发了默认属性的重新加载,则取消设置会被覆盖。这是一个PITA。如果您可以强制加载HDFS和纱线配置(新HdfsConfiguration();新YarnConfiguration())那么这将触发更多的负载,尽管Hive可能也会玩这个游戏

如果您的CP上有S3A连接器,您可以逐个桶设置登录详细信息-请参阅文档中的“每个桶配置”