我正在尝试在AWS EC2实例上设置Presto,以便我可以对存储在S3中的文件运行查询。我知道你可以/应该使用EMR,但我仅限于EC2。我为我的Metastore创建了一个Derby DB,在存储桶上设置了HDFS,并且能够使用Hive在S3中查询数据文件。在Hive CLI中,我可以运行SELECT * FROM testpresto;
(testpresto是我的表名),它正确显示了我的S3 txt文件的所有内容。我将Presto连接到Hive Metastore,因此我的表通过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 Access密钥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-key
和hive.s3.aws-secret-key
直接添加密钥应该使Presto能够从S3读取。我也尝试使用hive.s3.use-instance-credentials=true
(使用和不设置密钥配置)来使用IAM角色,但这一切都会产生同样的错误。我还缺少其他一些设置吗?我不明白为什么Hive能够查询但是Presto不能查询。
答案 0 :(得分:0)
启动EC2实例时,您有机会为其分配IAM角色。必须在启动时分配IAM角色。启动实例后,您无法为其分配角色或更改其角色。
我认为你应该创建一个具有s3存储桶所需访问权限的IAM角色,然后启动一个新的EC2实例并为其分配该角色。创建此实例后,立即SSH并运行aws s3 ls
以查看实例可以访问的存储区。如果您正确配置了角色,它应该能够列出您的桶。从那里Presto应该工作。
答案 1 :(得分:0)
如果您正在使用EMR,则使用的是Amazon S3客户端,而不是ASF代码。这意味着S3a中的代码(例如,凭证提供商链)不会存在。忽略http://hadoop.apache.org下对HADOOP- * JIRA或docs的任何引用。遗憾
答案 2 :(得分:0)
我使用s3a://
模式使用S3和Hive Metastore测试Presto以访问S3。由于你有Hive与S3交谈,其余的应该很简单:
hive.s3.use-instance-credentials
连接器的hive
配置属性defaults to true
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
)