在hadoop中指定AWS凭证

时间:2017-03-30 21:52:41

标签: amazon-web-services hadoop sqoop

我想在运行时指定AWS_SECRET_ACCESS_KEYAWS_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)

出了什么问题?

2 个答案:

答案 0 :(得分:6)

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

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

您的语法需要一个小修复。确保空字符串不作为值传递给这些属性。它会使这些运行时属性无效,并继续按照身份验证链搜索凭据。

  

S3A客户端遵循以下身份验证链:

     
      
  1. 如果在文件系统URI中提供了登录详细信息,则会发出警告   打印,然后打印为AWS密钥提取的用户名和密码   和秘密。
  2.   
  3. 在{li>中查找fs.s3a.access.keyfs.s3a.secret.key   Hadoop XML配置。
  4.   
  5. 然后查找AWS环境变量。
  6.   
  7. 尝试查询Amazon EC2实例元数据服务   检索发布到EC2 VM的凭据。
  8.   

在运行时传递凭据的其他可能方法(请注意,它既不安全也不建议在运行时提供它们),

1)将它们嵌入S3 URI

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/

答案 1 :(得分:0)

我认为问题的一部分是,令人困惑的是,与JVM -D选择不同,Hadoop -D命令需要-D和密钥之间的空格,例如:

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

我仍然会在命令行上避免这样做,因为任何能够执行ps命令的人都可以看到你的秘密。

一般我们在EC2之外运行时将它们粘贴到core-site.xml;在EC2中,它被神奇地处理了