在hadoop中指定aws凭据

but5z9lq  于 2021-05-29  发布在  Hadoop
关注(0)|答案(2)|浏览(373)

我要指定 AWS_SECRET_ACCESS_KEY 以及 AWS_ACCESS_KEY_ID 在运行时。
我已经试过了

hadoop -Dfs.s3a.access.key=${AWS_ACESS_KEY_ID} -Dfs.s3a.secret.key=${AWS_SECRET_ACCESS_KEY} fs -ls s3a://my_bucket/

export HADOOP_CLIENT_OPTS="-Dfs.s3a.access.key=${AWS_ACCESS_KEY_ID} -Dfs.s3a.secret.key=${AWS_SECRET_ACCESS_KEY}"

export HADOOP_OPTS="-Dfs.s3a.access.key=${AWS_ACCESS_KEY_ID} -Dfs.s3a.secret.key=${AWS_SECRET_ACCESS_KEY}"

在最后两个示例中,我尝试使用:

hadoop fs -ls s3a://my-bucket/

在我得到的所有案例中:

-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)

我做错什么了?

rsaldnfx

rsaldnfx1#

这是在运行时传递凭据的正确方法,

hadoop fs -Dfs.s3a.access.key=${AWS_ACCESS_KEY_ID} -Dfs.s3a.secret.key=${AWS_SECRET_ACCESS_KEY} -ls s3a://my_bucket/

你的语法需要一个小的修正。确保不将空字符串作为值传递给这些属性。它将使这些运行时属性无效,并根据身份验证链继续搜索凭据。
s3a客户端遵循以下认证链:
如果文件系统uri中提供了登录详细信息,则会打印一条警告,然后分别提取aws key和secret的用户名和密码。
这个 fs.s3a.access.key 以及 fs.s3a.secret.key 在hadoopxml配置中查找。
然后查找aws环境变量。
尝试查询amazonec2示例元数据服务以检索发布到ec2 vm的凭据。
在运行时传递凭据的其他可能方法(请注意,在运行时提供凭据既不安全也不推荐),
1) 将它们嵌入到s3uri中

hdfs dfs -ls s3a://AWS_ACCESS_KEY_ID:AWS_SECRET_ACCESS_KEY@my-bucket/

如果密钥包含 + 或者 / 符号,用 %2B 以及 %2F 分别。
永远不要共享url、使用它生成的日志,或者在生产中使用这样的内联身份验证机制。
2) export 会话的环境变量

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/
hfyxw5xn

hfyxw5xn2#

我认为部分问题在于,令人困惑的是,与jvm不同 -D 选择,hadoop -D 命令要求-d和键之间有空格,例如:

hadoop fs -ls -D fs.s3a.access.key=AAIIED s3a://landsat-pds/

不过,我还是会避免在命令行上这样做,因为任何人都可以在命令行上这样做 ps 指挥部可以看到你的秘密。
一般来说,我们把它们放进 core-site.xml 在ec2外运行时;在ec2中,它被神奇地处理

相关问题