我已经在AWS上建立了一个Spark EMR集群(Hadoop 2.8.5,Spark 2.4.4)。我有一个s3存储桶url,它是访问凭据。设置集群并连接笔记本后,使用以下命令设置hadoop配置后,我就能使用spark.read.parquet("s3n://...")
从存储桶中读取数据:
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。我在“核心站点”分类下从管理控制台向实例配置文件添加了配置,并提供了到spark.hadoop.security.credential.provider.path
的路径“ jceks:// hdfs / path_to_hdfs_file”,并将配置应用于主服务器和从服务器。
问题:
但是,我无法使用spark.read.parquet()
从EMR笔记本访问存储桶,它引发了Access Denied异常。我做错了还是这里缺少一些中间步骤?我不想对EMR笔记本中的密钥进行硬编码。任何帮助将不胜感激。一个星期以来,我一直被这个问题困扰。
附言存储桶和群集位于不同的区域。但是,我还通过在与存储桶相同的位置创建集群来尝试相同的过程。问题仍然存在。
答案 0 :(得分:1)
s3://
URL来访问EMR中的S3数据;他们不支持的任何其他模式引用代码。有争议,但是s3n连接器(已过时,不受支持)不支持JCEK文件