Quiero especificar AWS_SECRET_ACCESS_KEY y AWS_ACCESS_KEY_ID en tiempo de ejecución.
Ya intenté usar
hadoop -Dfs.s3a.access.key=${AWS_ACESS_KEY_ID} -Dfs.s3a.secret.key=${AWS_SECRET_ACCESS_KEY} fs -ls s3a://my_bucket/y
export HADOOP_CLIENT_OPTS="-Dfs.s3a.access.key=${AWS_ACCESS_KEY_ID} -Dfs.s3a.secret.key=${AWS_SECRET_ACCESS_KEY}"y
export HADOOP_OPTS="-Dfs.s3a.access.key=${AWS_ACCESS_KEY_ID} -Dfs.s3a.secret.key=${AWS_SECRET_ACCESS_KEY}"En los últimos dos ejemplos, traté de ejecutar con:
hadoop fs -ls s3a://my-bucket/En todos los casos obtuve:
-ls: Fatal internal error com.amazonaws.AmazonClientException: Unable to load AWS credentials from any provider in the chain at com.amazonaws.auth.AWSCredentialsProviderChain.getCredentials(AWSCredentialsProviderChain.java:117) at com.amazonaws.services.s3.AmazonS3Client.invoke(AmazonS3Client.java:3521) at com.amazonaws.services.s3.AmazonS3Client.headBucket(AmazonS3Client.java:1031) at com.amazonaws.services.s3.AmazonS3Client.doesBucketExist(AmazonS3Client.java:994) at org.apache.hadoop.fs.s3a.S3AFileSystem.initialize(S3AFileSystem.java:297) at org.apache.hadoop.fs.FileSystem.createFileSystem(FileSystem.java:2669) at org.apache.hadoop.fs.FileSystem.access$200(FileSystem.java:94) at org.apache.hadoop.fs.FileSystem$Cache.getInternal(FileSystem.java:2703) at org.apache.hadoop.fs.FileSystem$Cache.get(FileSystem.java:2685) at org.apache.hadoop.fs.FileSystem.get(FileSystem.java:373) at org.apache.hadoop.fs.Path.getFileSystem(Path.java:295) at org.apache.hadoop.fs.shell.PathData.expandAsGlob(PathData.java:325) at org.apache.hadoop.fs.shell.Command.expandArgument(Command.java:235) at org.apache.hadoop.fs.shell.Command.expandArguments(Command.java:218) at org.apache.hadoop.fs.shell.Command.processRawArguments(Command.java:201) at org.apache.hadoop.fs.shell.Command.run(Command.java:165) at org.apache.hadoop.fs.FsShell.run(FsShell.java:287) at org.apache.hadoop.util.ToolRunner.run(ToolRunner.java:70) at org.apache.hadoop.util.ToolRunner.run(ToolRunner.java:84) at org.apache.hadoop.fs.FsShell.main(FsShell.java:340)¿Qué estoy haciendo mal?
Esta es una forma correcta de pasar las credenciales en tiempo de ejecución,
hadoop fs -Dfs.s3a.access.key=${AWS_ACCESS_KEY_ID} -Dfs.s3a.secret.key=${AWS_SECRET_ACCESS_KEY} -ls s3a://my_bucket/Su sintaxis necesita una pequeña corrección. Asegúrese de que no se pasen cadenas vacías como valores a estas propiedades. Haría que estas propiedades de tiempo de ejecución no fueran válidas y continuaría buscando las credenciales según la cadena de autenticación.
El cliente S3A sigue la siguiente cadena de autenticación:
- Si se proporcionaron detalles de inicio de sesión en el URI del sistema de archivos, se imprime una advertencia y luego se extraen el nombre de usuario y la contraseña para la clave y el secreto de AWS, respectivamente.
- Se
fs.s3a.access.keyyfs.s3a.secret.keyen la configuración XML de Hadoop.- Luego se buscan las variables de entorno de AWS.
- Se intenta consultar el servicio de metadatos de la instancia Amazon EC2 para recuperar las credenciales publicadas en las máquinas virtuales EC2.
Los otros métodos posibles para pasar las credenciales en tiempo de ejecución ( tenga en cuenta que no es seguro ni se recomienda proporcionarlas durante el tiempo de ejecución ),
1) Incrustarlos en la URI de S3
hdfs dfs -ls s3a://AWS_ACCESS_KEY_ID:AWS_SECRET_ACCESS_KEY@my-bucket/ Si la clave secreta contiene algún símbolo + o / , escápelos con %2B y %2F respectivamente.
Nunca comparta la URL, los registros generados al usarla ni use un mecanismo de autenticación en línea de este tipo en producción.
2) export variables de entorno para la sesión
export AWS_ACCESS_KEY_ID=<YOUR_AWS_ACCESS_KEY_ID> export AWS_SECRET_ACCESS_KEY=<YOUR_AWS_SECRET_ACCESS_KEY> hdfs dfs -ls s3a://my-bucket/Creo que parte del problema es que, de manera confusa, a diferencia de las opciones JVM -D , el comando Hadoop -D espera un espacio entre -D y la clave, por ejemplo:
hadoop fs -ls -D fs.s3a.access.key=AAIIED s3a://landsat-pds/ Sin embargo, aún evitaría hacer eso en la línea de comando, ya que cualquiera que pueda ejecutar un comando ps puede ver tus secretos.
Por lo general, los colocamos en core-site.xml cuando se ejecutan fuera de EC2; en EC2 se maneja mágicamente