使用动态Hadoop conf在同一火花会话中访问两个s3帐户,拒绝访问(403)

问题描述 投票:0回答:1

这是我提出的关于question的后续问题,这个问题更具体地说明了如何通过动态更改hadoop配置使用相同的spark会话访问两个s3帐户。

我有两个s3帐户,即A和B,并且我正在帐户B中运行EMR管道,该管道将从帐户A读取csv,然后在帐户B的s3存储桶中写入镶木地板文件。我无法在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 Access拒绝错误。其余工作能够在帐户B的s3存储桶中创建镶木地板文件。经过分析,我发现写入镶木地板文件时失败。

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

有了这些信息,我得出结论,hadoop取消设置对某些工作没有按预期工作。理想情况下,一旦我取消设置访问密钥和凭据,在写拼写时它应该回退到帐户B。

py4j.GatewayConnection.run(GatewayConnection.java:238)\ n在java.lang.Thread.run(Thread.java:748)\ n原因:org.apache.spark.SparkException:由于阶段失败,作业中止了:阶段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.shaded.com.amazonaws.services.s3.model.AmazonS3Exception:拒绝访问(服务:Amazon S3;状态代码:403;错误代码:拒绝访问;要求编号:

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

apache-spark pyspark amazon-emr hadoop2
1个回答
0
投票

unset很奇怪,如果触发了默认属性的重新加载,则覆盖未设置的部分。这是一个PITA。如果您可以强制加载HDFS和yarn配置(新的HdfsConfiguration();新的YarnConfiguration()),则这将触发更多的加载,尽管Hive也可能玩此游戏

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

© www.soinside.com 2019 - 2024. All rights reserved.