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 在AWS EMR上使用spark;您提供的AWS访问密钥Id在我们的记录中不存在。但是boto3称工作很好_Apache Spark_Amazon S3_Amazon Emr - Fatal编程技术网

Apache spark 在AWS EMR上使用spark;您提供的AWS访问密钥Id在我们的记录中不存在。但是boto3称工作很好

Apache spark 在AWS EMR上使用spark;您提供的AWS访问密钥Id在我们的记录中不存在。但是boto3称工作很好,apache-spark,amazon-s3,amazon-emr,Apache Spark,Amazon S3,Amazon Emr,我试图在SPARK on EMR中读取一个文件,该文件是我在另一个系统(Illumina ICA)中提供的临时凭据 当尝试使用spark.read.csv读取文件时,使用S3 URI,会出现以下错误: Py4JJavaError: An error occurred while calling o65.csv. : java.io.IOException: com.amazon.ws.emr.hadoop.fs.shaded.com.amazonaws.services.s3.model.Ama

我试图在SPARK on EMR中读取一个文件,该文件是我在另一个系统(Illumina ICA)中提供的临时凭据

当尝试使用spark.read.csv读取文件时,使用S3 URI,会出现以下错误:

Py4JJavaError: An error occurred while calling o65.csv.
: java.io.IOException: com.amazon.ws.emr.hadoop.fs.shaded.com.amazonaws.services.s3.model.AmazonS3Exception: The AWS Access Key Id you provided does not exist in our records. (Service: Amazon S3; Status Code: 403; Error Code: InvalidAccessKeyId;
但是,当我使用BOTO3调用尝试相同的凭据时,它工作正常,因此凭据(在环境中)工作正常

这是我的测试代码(来自笔记本)

导入pyspark
从pyspark.sql导入SparkSession
spark=SparkSession.builder.getOrCreate()
df=spark.read.csv('s3://stratus-gds-use1/241dd164-decb-48f6-eba1-08d881d902b2/dummy.vcf.gz',sep='\t')
#... Py4JJavaError:调用o65.csv时出错。#java.io.IOException:com.amazon.ws.emr.hadoop.fs.shade.com.amazonaws.services.s3.model.amazons3异常:您提供的AWS访问密钥Id在我们的记录中不存在。(服务:Amazon S3;状态代码:403;错误代码:InvalidAccessKeyId;
access\u key\u id=os.environ['AWS\u access\u key\u id']
secret\u access\u key=os.environ['AWS\u secret\u access\u key']
region=os.environ['AWS\u DEFAULT\u region']
session\u token=os.environ['AWS\u session\u token']
bucket_name='stratus-gds-use1'
密钥前缀='241dd164-decb-48f6-eba1-08d881d902b2/dummy.vcf.gz'
进口boto3
s3\u session=boto3.session.session(aws\u access\u key\u id=access\u key\u id,
aws_secret_access_key=secret_access_key,
aws_会话_令牌=会话_令牌,
地区(名称=地区)
s3\u客户端=s3\u会话.客户端('s3')
%ls-l dummy.vcf.gz
#-=>ls:无法访问dummy.vcf.gz:没有这样的文件或目录
r=s3_client.download_文件(Filename='dummy.vcf.gz',
Bucket=Bucket\u名称,
键=键(前缀)
%ls-l dummy.vcf.gz
#-=>-rw-rw-r--1 hadoop hadoop 2535 Apr 6 18:45 dummy.vcf.gz
你知道为什么AWS EMR上的spark无法使用提供的S3URI访问该文件吗


我已经测试过其他类似的S3URI,它们工作得很好,因此java类工作得很好。

我最终找到了解决方案。我需要在Spark配置中提供临时AWS凭据,并提供特殊类
org.apache.hadoop.fs.s3a.TemporaryAWSCredentialsProvider
以及会话令牌

因此,这是确保spark可以使用临时凭证读取S3存储桶的过程

import pyspark
from pyspark.sql import SparkSession
conf = (
    pyspark.SparkConf()
        .set('spark.hadoop.fs.s3a.aws.credentials.provider','org.apache.hadoop.fs.s3a.TemporaryAWSCredentialsProvider')
        .set('spark.hadoop.fs.s3a.access.key', access_key_id)
        .set('spark.hadoop.fs.s3a.secret.key', secret_access_key)
        .set('spark.hadoop.fs.s3a.session.token', session_token)
)
spark = SparkSession.builder.config(conf=conf).getOrCreate()
df = spark.read.csv(f's3a://{BUCKET}/{KEY_PREFIX}', sep='\t')