AWS EMR :为 S3 存储桶访问设置 Hadoop凭证提供程序



我在AWS上设置了一个Spark EMR集群(Hadoop 2.8.5,Spark 2.4.4(。我有一个 s3 存储桶网址,它是访问凭证。设置集群并附加笔记本后,我可以使用spark.read.parquet("s3n://...")使用以下方式设置 Hadoop配置后从存储桶读取数据:

sc._jsc.hadoopConfiguration().set('fs.s3n.awsAccessKeyId', '...')
sc._jsc.hadoopConfiguration().set('fs.s3n.awsSecretAccessKey', '...')

但是,我在许多文档中读到不建议这样做,因为它将密钥存储在日志中。
所以我正在尝试在 HDFS 文件系统中创建一个 Hadoop 凭证文件,然后在"核心站点"中添加一个 EMR 配置以提供凭证文件路径。以下是我遵循的步骤:
1. 创建了 EMR 集群
2.通过 Putty.exe 使用 SSH,我创建了 hadoop 凭据文件:

$ hadoop credential create fs.s3a.access.key -provider jceks://hdfs/<path_to_hdfs_file> -value <aws_access_id>
$ hadoop credential create fs.s3a.secret.key -provider jceks://hdfs/<path_to_hdfs_file> -value <aws_secret_key>

3. 我在"核心站点"分类下从管理控制台向实例配置文件添加了配置,并提供了路径"jceks://hdfs/path_to_hdfs_file"以spark.hadoop.security.credential.provider.path并将配置应用于主站和从站。

问题:
但是,我无法使用spark.read.parquet()从 EMR 笔记本访问存储桶,它会引发拒绝访问异常。我做错了还是我在这里缺少一些中间步骤。我不想对 EMR 笔记本中的密钥进行硬编码。任何帮助将不胜感激。一周以来,我一直被这个问题困住了。
附言存储桶和集群位于不同的区域。但是,我也尝试了相同的过程,即在与存储桶相同的位置创建集群。问题仍然存在。

  • 在 EMR 中访问 S3 数据应使用其连接器和s3://URL; 任何其他架构引用它们不支持的代码。
  • 您可以访问部署虚拟机/容器时使用的 IAM 角色。想要访问特定存储桶,请选择正确的角色

这是没有意义的,但 s3n 连接器(过时、不受支持(不支持 JCEK 文件

最新更新