Para acceder a mi depósito S3, he exportado mis credenciales
export AWS_SECRET_ACCESS_KEY= export AWS_ACCESSS_ACCESS_KEY=Puedo verificar que todo funciona haciendo
aws s3 ls mybucketTambién puedo verificar con boto3 que funciona en python
resource = boto3.resource("s3", region_name="us-east-1") resource.Object("mybucket", "text/text.py") \ .put(Body=open("text.py", "rb"),ContentType="text/x-py")Esto funciona y puedo ver el archivo en el cubo.
Sin embargo, cuando hago esto con chispa:
spark_context = SparkContext() sql_context = SQLContext(spark_context) spark_context.textFile("s3://mybucket/my/path/*)obtengo un buen
> Caused by: org.jets3t.service.S3ServiceException: Service Error > Message. -- ResponseCode: 403, ResponseStatus: Forbidden, XML Error > Message: <?xml version="1.0" > encoding="UTF-8"?><Error><Code>InvalidAccessKeyId</Code><Message>The > AWS Access Key Id you provided does not exist in our > records.</Message><AWSAccessKeyId>[MY_ACCESS_KEY]</AWSAccessKeyId><RequestId>XXXXX</RequestId><HostId>xxxxxxx</HostId></Error>así es como envío el trabajo localmente
spark-submit --packages com.amazonaws:aws-java-sdk-pom:1.11.98,org.apache.hadoop:hadoop-aws:2.7.3 test.py
¿Por qué funciona con la línea de comando + boto3 pero Spark se bloquea?
EDITAR:
Mismo problema usando s3a:// con
hadoopConf = spark_context._jsc.hadoopConfiguration() hadoopConf.set("fs.s3a.access.key", "xxxx") hadoopConf.set("fs.s3a.secret.key", "xxxxxxx") hadoopConf.set("fs.s3a.impl", "org.apache.hadoop.fs.s3a.S3AFileSystem")y el mismo problema con aws-sdk 1.7.4 y hadoop 2.7.2
Spark copiará automáticamente sus credenciales de AWS en los secretos s3n y s3a. Las versiones de Apache Spark no tocan las URL s3://, ya que en Apache Hadoop, el esquema s3:// está asociado con el cliente s3 original, ahora obsoleto, que es incompatible con todo lo demás.
En Amazon EMR, s3:// está vinculado a amazon EMR S3; Las máquinas virtuales EC2 proporcionarán los secretos para los ejecutores automáticamente. Así que no creo que moleste con el mecanismo de propagación de env var. También puede ser que no pueda anular los datos de EC2/IAM por la forma en que configura la cadena de autenticación.
Si está tratando de comunicarse con S3 y no se está ejecutando en una VM de EMR , presumiblemente está usando Apache Spark con los JAR de Apache Hadoop, no las versiones de EMR. En ese mundo, use URL con s3a:// para obtener la biblioteca de cliente S3 más reciente
Si eso no funciona, consulte la sección de solución de problemas de los documentos de Apache . Hay una sección sobre "403" que incluye pasos recomendados para solucionar problemas. Puede deberse a problemas de versión de classpath/JVM, así como a problemas de credenciales, incluso a un desfase horario entre el cliente y AWS.