这是我提出的关于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)来克服这种情况?
unset很奇怪,如果触发了默认属性的重新加载,则覆盖未设置的部分。这是一个PITA。如果您可以强制加载HDFS和yarn配置(新的HdfsConfiguration();新的YarnConfiguration()),则这将触发更多的加载,尽管Hive也可能玩此游戏
如果您在CP上具有S3A连接器,则可以逐个桶设置登录详细信息-请参阅文档中的“每个存储桶配置”