【问题标题】:Presto fails to recognize AWS credentials (both IAM and keys)?Presto 无法识别 AWS 凭证(IAM 和密钥)?
【发布时间】:2017-05-24 01:38:30
【问题描述】:

我正在尝试在 AWS EC2 实例上设置 Presto,以便我可以对存储在 S3 中的文件运行查询。我知道您可以/应该使用 EMR,但我仅限于 EC2。我已经为我的元存储创建了一个 Derby DB,在存储桶上设置了 HDFS,并且能够使用 Hive 在 S3 中查询数据文件。在 Hive CLI 中,我可以运行 SELECT * FROM testpresto;(testpresto 是我的表名),它会正确显示我的 S3 txt 文件的所有内容。我将 Presto 连接到 Hive 元存储,因此我的表通过 SHOW TABLES;DESCRIBE testpresto; 显示在 presto CLI 中。

但是,当我运行 SELECT * FROM testpresto; 时,查询超时并出现以下错误。

查询 20170109_165917_00007_7pyam 失败:无法执行 HTTP 请求:连接到 ${MY_BUCKET}.s3-us-west-1.amazonaws.com:443 [${MY_BUCKET}.s3-us-west-1.amazonaws.com/54.231.237.24] 失败: 连接超时

当我尝试通过 Presto CLI 实例化新架构时,我收到了一个更具描述性的错误。

查询 20170109_175329_00016_7pyam 失败: java.lang.IllegalArgumentException:AWS 访问密钥 ID 和秘密 必须将访问密钥指定为用户名或密码 (分别)s3 URL,或通过设置 fs.s3.awsAccessKeyId 或 fs.s3.awsSecretAccessKey 属性(分别)。

不幸的是,我所做的任何事情都无法解决此错误。从我在网上阅读的内容来看,似乎是通过

向我的 Presto 配置 (catalog/hive.properties) 添加资源引用
hive.config.resources=/usr/local/hadoop/etc/hadoop/core-site.xml,/usr/local/hadoop/etc/hadoop/hdfs-site.xml

或通过hive.s3.aws-access-keyhive.s3.aws-secret-key 直接添加密钥应该使Presto 能够从S3 读取。我还尝试使用hive.s3.use-instance-credentials=true(设置和不设置密钥配置)来使用 IAM 角色,但都会产生同样的错误。我还缺少其他一些设置吗?我不明白为什么 Hive 能够查询,但 Presto 不能。

【问题讨论】:

    标签: amazon-web-services amazon-ec2 hive presto


    【解决方案1】:

    我使用s3a:// 架构测试了 Presto 与 S3 和 Hive Metastore 以访问 S3。既然您已经让 Hive 与 S3 通信,那么其余的应该很容易:

    • 您可以分配允许您的 EC2 实例与 S3 通信的 IAM 角色。在 Presto 0.157 中,这是开箱即用的,因为 hive 连接器 defaults to truehive.s3.use-instance-credentials 配置属性
    • 或者,您可以在 hive 连接器的配置文件中设置以下内容(通常为catalog/hive.properties):
      • hive.s3.use-instance-credentials = false
      • hive.s3.aws-access-key = ...
      • hive.s3.aws-secret-key = ...

    由于我了解您测试了这些选项,但它们对您不起作用,您仍然可以尝试:

    • 重试
    • 尝试使用 s3a 架构(如果您还没有)
    • 如果您远远落后于最新版本,请升级,或者尝试对我有用的完全相同的版本 (0.157.1-t.1)
    • 确保没有网络级配置阻止来自 Presto 机器的 S3 访问
    • 确保 IAM 角色确实授予您 S3 访问权限(或使用显式密钥作为临时解决方法)

    【讨论】:

      【解决方案2】:

      启动 EC2 实例时,您有机会为其分配 IAM 角色。 IAM 角色必须在启动时分配。启动实例后,您无法为其分配角色或更改其角色。

      我认为您应该创建一个对 s3 存储桶具有所需访问权限的 IAM 角色,然后启动一个新的 EC2 实例并为其分配该角色。创建此实例后,立即通过 SSH 登录并运行 aws s3 ls 以查看该实例也可以访问哪些存储桶。如果您正确配置了角色,它应该能够列出您的存储桶。从那里开始 Presto 应该可以工作。

      【讨论】:

      • 这个实例确实有一个 IAM 角色,可以让它访问存储桶,我确实在启动期间分配了它。我可以在这个 EC2 上运行 aws s3 ls s3://${MY_BUCKET} 并正确显示存储桶内容。
      • 我认为 Presto 将检查 AWS 凭证,如果未配置它们,它将回退到使用 AWS 元数据服务来使用 IAM 角色。也许这个要点很有帮助 - github.com/prestodb/presto/pull/1938
      • 是的,我以前看过那个链接。但是,这些更改都没有实现,最终链接 PR 链会在有人为 Hadoop 创建CustomCredentialsProvider 时结束?我真的不知道如何将它整合到 Presto 中。
      • 如果您确实通过 hive.s3.aws-access-keyhive.s3.aws-secret-key Presto 直接使用 AWS 凭证添加密钥,您可以使用 CloudTrail 或 IAM 控制台查看这些凭证是否被使用并发送到 AWS对 S3 进行身份验证?希望这将帮助您进一步隔离故障
      • 当我之前尝试使用密钥时,我将它们添加到目录配置中的 hive.properties 文件中。这次我尝试将它们添加为会话参数并收到以下错误。 Exception in thread "main" io.airlift.airline.ParseOptionConversionException: session: can not convert "hive.s3.aws-access-key=${MY_KEY}" to a ClientSessionProperty 会不会是 Presto 在我将它放入属性文件时悄悄地出现了同样的错误?
      【解决方案3】:

      如果您使用 EMR,则您使用的是 Amazon S3 客户端,而不是 ASF 代码。这意味着 S3a 中的代码(例如,证书提供者链)不会存在。忽略对 HADOOP-* JIRA 或 http://hadoop.apache.org 下的文档的任何引用。对不起

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2022-01-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-01-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多