我已经建立了一个小型的EMR集群,并安装了Hive / Presto,我想在S3上查询文件并将其导入RDS上的Postgres。
要在S3上运行查询并将结果保存在postgres中的表中,我已完成以下操作:
从AWS控制台启动了3节点EMR集群。
手动SSH进入Master节点,在Hive中创建一个EXTERNAL表,查看一个S3存储桶。
手动SSH到3个节点中的每个节点上,并添加一个新的目录文件:
/etc/presto/conf.dist/catalog/postgres.properties
具有以下内容
connector.name=postgresql
connection-url=jdbc:postgresql://ip-to-postgres:5432/database
connection-user=<user>
connection-password=<pass>
并编辑了这个文件
/etc/presto/conf.dist/config.properties
加
datasources=postgresql,hive
通过在所有3个节点上手动运行以下命令来重新启动presto
sudo restart presto-server
此设置似乎运行良好。
在我的应用程序中,动态创建了多个数据库。似乎需要对每个数据库进行那些配置/目录更改,并且需要重新启动服务器以查看新的配置更改。
我的应用程序是否有适当的方法(使用boto或其他方法)通过以下方式更新配置
在每个新数据库的所有节点/etc/presto/conf.dist/catalog/中添加一个新的目录文件
在/etc/presto/conf.dist/config.properties中的所有节点中添加新条目
平稳地重新启动整个群集中的presto(理想情况是当它变为空闲时,但这不是主要问题。
最佳答案
我相信您可以运行一个简单的bash脚本来实现所需的功能。除了使用--configurations
参数创建新集群(您在其中提供所需的配置)外,没有其他方法。您可以从主节点运行以下脚本。
#!/bin/sh
# "cluster_nodes.txt" with private IP address of each node.
aws emr list-instances --cluster-id <cluster-id> --instance-states RUNNING | grep PrivateIpAddress | sed 's/"PrivateIpAddress"://' | sed 's/\"//g' | awk '{gsub(/^[ \t]+|[ \t]+$/,""); print;}' > cluster_nodes.txt
# For each IP connect with ssh and configure.
while IFS='' read -r line || [[ -n "$line" ]]; do
echo "Connecting $line"
scp -i <PEM file> postgres.properties hadoop@$line:/tmp;
ssh -i <PEM file> hadoop@$line "sudo mv /tmp/postgres.properties /etc/presto/conf/catalog;sudo chown presto:presto /etc/presto/conf/catalog/postgres.properties;sudo chmod 644 /etc/presto/conf/catalog/postgres.properties; sudo restart presto-server";
done < cluster_nodes.txt
关于amazon-web-services - 如何在Amazon EMR上的Presto中添加连接器,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/36068935/