Uso de pyspark2 (versión 2.0.0.cloudera1) en Cloudera dentro de AWS
Estoy tratando de escribir un marco de datos de Spark a almacenamiento S3, pero falla debido a la autenticación:
pyspark.sql.utils.IllegalArgumentException: u'AWS Access Key ID y Secret Access Key deben especificarse configurando las propiedades fs.s3n.awsAccessKeyId y fs.s3n.awsSecretAccessKey (respectivamente).'
Mi código pyspark es:
utp.coalesce(1).write.format('com.databricks.spark.csv').save('s3n://my_bucket/tmr_xfers/test_output')Usamos funciones para acceder a S3, es decir, 'aws_iam_role=arn:aws:iam::123456789012:role/RoleName', no ID de clave de acceso individuales.
¿Qué necesito cambiar en mi código Spark para que mi csv se escriba en S3 usando roles en lugar de AccessKeyId y SecretAccessKey individuales?
Tuve el mismo problema y lo solucioné usando s3a:// en su lugar, que aparentemente es mucho más moderno y eficaz en cualquier caso.
El problema está en el código del controlador Hadoop (creo que el hadoop-aws.jar ) que es responsable de acceder al sistema de archivos S3. Aparentemente, el protocolo 'nativo' de s3n utiliza un antiguo controlador jets3t con el que es difícil trabajar y con el que todo el mundo tiene miedo de meterse. La implementación del nuevo protocolo s3a utiliza el SDK de AWS directamente y admite perfiles de instancia, etc.
Eche un vistazo a estos HADOOP-9680 y HADOOP-9384 para ver por qué NO SOLUCIONARON este problema.
Aquí hay una solución en scala spark2, tenga cuidado con el problema de seguridad.
spark.sparkContext.hadoopConfiguration.set("fs.s3n.awsAccessKeyId", "xxxxx") spark.sparkContext.hadoopConfiguration.set("fs.s3n.awsSecretAccessKey", "xxxxxxxx") Df.write. format("com.databricks.spark.csv").option("header", "true"). save("s3n://my_bucket/tmr_xfers/test_output")