Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/amazon-s3/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Apache spark fs.s3配置,带有两个s3帐户和EMR_Apache Spark_Amazon S3_Pyspark_Amazon Emr - Fatal编程技术网

Apache spark fs.s3配置,带有两个s3帐户和EMR

Apache spark fs.s3配置,带有两个s3帐户和EMR,apache-spark,amazon-s3,pyspark,amazon-emr,Apache Spark,Amazon S3,Pyspark,Amazon Emr,我有使用lambda和EMR的管道,我从一个s3帐户A读取csv,并将拼花写入帐户B中的另一个s3。 我在帐户B中创建了EMR,并且可以访问帐户B中的s3。 我无法在EMR_EC2_DefaultRole中添加帐户A s3 bucket访问权限(因为此帐户是企业范围的数据存储),因此我使用accessKey、secret key访问帐户A s3 bucket。这是通过congnito令牌完成的 方法1 我正在使用fs.s3协议从帐户A读取s3中的csv,并在帐户B上写入s3。 我有pyspark

我有使用lambda和EMR的管道,我从一个s3帐户A读取csv,并将拼花写入帐户B中的另一个s3。 我在帐户B中创建了EMR,并且可以访问帐户B中的s3。 我无法在EMR_EC2_DefaultRole中添加帐户A s3 bucket访问权限(因为此帐户是企业范围的数据存储),因此我使用accessKey、secret key访问帐户A s3 bucket。这是通过congnito令牌完成的

方法1

我正在使用fs.s3协议从帐户A读取s3中的csv,并在帐户B上写入s3。 我有pyspark代码,它读取s3(A)并写入拼花地板s3(B)。我每次提交100个作业。这个pyspark代码在EMR中运行

使用以下设置进行读取

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)

spark_df_csv = spark_session.read.option("Header", "True").csv("s3://somepath")
写作:

我正在使用s3a协议
s3a://some\u bucket/

它是有效的,但有时我会看到

  • _s3存储桶中存在临时文件夹,但并非所有csv都转换为拼花地板
  • 当我启用EMR并发到256(EMR-5.28)并提交100个作业时,我得到了临时重命名错误
  • 问题:

  • 此方法创建临时文件夹,有时不删除。我可以在s3 bucket中看到_临时文件夹
  • 当我启用EMR并发(EMR最新版本5.28)时,它允许并行运行步骤,我得到一些文件的rename\u临时错误
  • 方法2:

    我觉得s3a不适合并行工作。 所以我想使用fs.s3进行读写,因为它有更好的文件

    所以我这样做了,最初我将hadoop配置如上所述设置为帐户A,然后取消设置配置,这样它就可以访问默认帐户B。 这样

    hadoop_config = sc._jsc.hadoopConfiguration()
    hadoop_config.unset("fs.s3.awsAccessKeyId")
    hadoop_config.unset("fs.s3.awsSecretAccessKey")
    hadoop_config.unset("fs.s3.awsSessionToken")
    
    
    spark_df_csv.repartition(1).write.partitionBy(['org_id', 'institution_id']). \
        mode('append').parquet(write_path)
    
    问题

    这是可行的,但问题是如果我触发lambda,它反过来提交100个文件的作业(在循环中),大约10多个文件会导致在将文件写入s3 bucket时拒绝访问

    java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)\n。。。1更多\n使用者:com.amazon.ws.emr.hadoop.fs.shade.com.amazonaws.services.s3.model.amazons3异常:拒绝访问(服务:

    这可能是因为此unset有时不工作或 因为并行运行Spark上下文/会话集unset发生在并行中?我的意思是一个作业的Spark上下文正在破坏hadoop配置,而另一个正在进行设置,这可能会导致此问题,尽管不确定Spark上下文如何并行工作

    不是每个作业都有单独的Spark上下文和会话。
    请针对我的情况提出备选方案。

    您能否更具体地说明您收到的错误/异常?它是在从A读取还是向B写入时发生的?@CharlieFlowers在第二种方法中,我得到了10个文件的AWS 400访问被拒绝错误,其余100个文件工作正常。@CharlieFlowers更新了问题