amazon-web-services - AWS EMR:为 S3 Bucket 访问设置 hadoop 凭证提供程序
问题描述
我在 AWS(Hadoop 2.8.5、Spark 2.4.4)上建立了一个 Spark EMR 集群。我有一个 s3 存储桶 url,它是访问凭据。设置集群并附加笔记本后,我可以使用以下方法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. 我从管理控制台的“core-site”分类下向实例配置文件添加了一个配置,并提供了路径“jceks://hdfs/path_to_hdfs_file”spark.hadoop.security.credential.provider.path
并将配置应用于主从。
问题:
但是,我无法使用 EMR 笔记本访问存储桶spark.read.parquet()
,它会引发 Access Denied 异常。我是做错了还是我在这里遗漏了一些中间步骤。我不想在我的 EMR 笔记本中对密钥进行硬编码。任何帮助将不胜感激。一个星期以来,我一直被这个问题困扰。
PS bucket和cluster在不同的区域。但是,我也通过在与存储桶相同的位置创建集群来尝试相同的过程。问题仍然存在。
解决方案
- 访问 EMR 中的 S3 数据应使用其连接器和
s3://
URL;他们不支持的任何其他架构引用代码。 - 您可以获得部署 VM/容器的 IAM 角色的访问权限。想要访问特定的存储桶,选择正确的角色
没有实际意义,但 s3n 连接器(已过时,不受支持)不支持 JCEKs 文件
推荐阅读
- npm - 如何在未安装 cdk 时使用上下文参数执行 cdk 命令,即使用 npm run cdk?
- java - 将 Java HashMap 转换为海龟三元组
- python - mpdl3 和 lmfit 安装在终端中的 conda 成功,但在 spyder 中导入时未找到
- javascript - Number() 如果为 null 或为空,则默认为 0
- php - “分组” PHP 类的正确方法
- html - 将 div 放在两个 div 之间的边界之上
- java - PSQLException:错误:“id”列中的空值在 SQL 插入期间违反了非空约束
- mysql - 使用 SQL 从 WordPress 帖子中删除 HTML 失败且没有错误
- blogger - 如何将两个小部件内容包装到 Blogger 中的单个 DIV 元素中?
- java - 为什么内部具有类对象数组的构造函数具有空值