如何在 Amazon EMR 上将连接器添加到 presto

Posted

技术标签:

【中文标题】如何在 Amazon EMR 上将连接器添加到 presto【英文标题】:How to add connectors to presto on Amazon EMR 【发布时间】:2016-03-17 18:33:30 【问题描述】:

我已经设置了一个安装了 Hive/Presto 的小型 EMR 集群,我想在 S3 上查询文件并将它们导入到 RDS 上的 Postgres。

要在 S3 上运行查询并将结果保存在 postgres 的表中,我做了以下操作:

    从 AWS 控制台启动了一个 3 节点 EMR 集群。 手动 SSH 到主节点以在 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(最好是在它空闲时,但这不是主要问题。

【问题讨论】:

如果我的回答对你有用,请将其标记为“正确答案” i.stack.imgur.com/QpogP.png 【参考方案1】:

我相信你可以运行一个简单的 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

【讨论】:

【参考方案2】:

在配置集群期间: 您可以在提供时提供配置详细信息。

请参阅Presto Connector Configuration,了解如何在提供集群期间自动添加此项。

【讨论】:

【参考方案3】:

您可以通过管理控制台提供如下配置:

或者您可以使用awscli 来传递这些配置,如下所示:

#!/bin/bash

JSON=`cat <<JSON
[
   "Classification": "presto-connector-postgresql",
    "Properties": 
      "connection-url": "jdbc:postgresql://ip-to-postgres:5432/database",
      "connection-user": "<user>",
      "connection-password": "<password>"
    ,
    "Configurations": []
  
]
JSON`

aws emr create-cluster --configurations "$JSON" # ... reset of params

【讨论】:

以上是关于如何在 Amazon EMR 上将连接器添加到 presto的主要内容,如果未能解决你的问题,请参考以下文章

如何将文件上传到 Amazon EMR?

如何将文件从 S3 复制到 Amazon EMR HDFS?

如何在 Amazon EMR 上引导安装 Python 模块?

Amazon EMR:将 EBS 卷附加到实例时如何确保使用该卷

Amazon EMR 管理我的 spark 集群

如何将 pyspark 中的数据保存在 Amazon EMR 的 1 个文件中