带有presto的GCP dataproc - 有没有办法使用pyhive通过python远程运行查询?

Posted

技术标签:

【中文标题】带有presto的GCP dataproc - 有没有办法使用pyhive通过python远程运行查询?【英文标题】:GCP dataproc with presto - is there a way to run queries remotely via python using pyhive? 【发布时间】:2021-11-05 00:49:43 【问题描述】:

我正在尝试在我在 dataproc 上运行的 presto 集群上运行查询 - 通过本地机器上的 python(使用 pyhive 中的 presto)。但我似乎无法弄清楚主机 URL。 GCP dataproc 甚至允许远程访问 presto 集群吗?

我尝试在 Presto 的 Web UI 上使用 URL,但这也不起作用。 我还查看了有关使用 Python 的云客户端库的文档。也没有帮助。 https://cloud.google.com/dataproc/docs/tutorials/python-library-example

from pyhive import presto

query = '''select * FROM system.runtime.nodes'''

presto_conn = presto.Connection(host=host, port=8060, username =user)
presto_cursor = presto_conn.cursor()
presto_cursor.execute(query)

错误

ConnectionError: HTTPConnectionPool(host='https', port=80): Max retries exceeded with url: url
(Caused by NewConnectionError('<urllib3.connection.HTTPConnection object at 0x7fb41c0c25d0>: Failed to establish a new connection: [Errno 8] nodename nor servname provided, or not known'))

更新 我能够在 GCP 计算上手动创建 VM,配置 trino 并设置防火墙规则和负载均衡器,以便能够访问集群。

必须检查 dataproc 是否允许类似的配置。

【问题讨论】:

您使用什么主机名连接到 presto 集群? 我在 Presto Web UI 上尝试了 url。文档:cloud.google.com/dataproc/docs/concepts/accessing/… 组件网关通过 Knox 执行 url 重写,还有反向代理,所以我怀疑它是否能达到您的目的。 Dataproc 集群只不过是托管的 GCE 实例,因此所有与 GCE 相关的防火墙规则等仍然适用,所以您在 GCP 计算 (GCE) 上使用独立 trino VM 所做的事情,您应该这样做Dataproc 集群也是如此。没有通过 Dataproc 进行防火墙管理。 【参考方案1】:

Google 防火墙似乎正在阻止来自外界的连接。

如何解决

快速而肮脏的解决方案

只允许访问从您的 IP 到 dataproc 集群的端口 8060。

如果您使用公共 IP 地址,这可能无法扩展,但可以让您进行开发。

向整个互联网公开“大数据”服务是一个糟糕的想法。您可能会被黑客入侵,Google 将关闭该服务。

使用 SSH 隧道

创建一个小实例(一个来自免费层),将 SSH 端口暴露给 inernet,并使用端口转发。

您的 URL 不会是 https://dataproc-cluster:8060...,而是 https://localhost:forwarded_port

这很容易做到,您可以在不需要时关闭堡垒虚拟机。

【讨论】:

以上是关于带有presto的GCP dataproc - 有没有办法使用pyhive通过python远程运行查询?的主要内容,如果未能解决你的问题,请参考以下文章

在不使用 Dataproc 的情况下将 GCP 与 PySpark 连接

Google Dataproc Presto:如何使用 Python 运行查询

GCP Dataproc 在 Alpha 版中提供了 Druid。如何加载段?

YARN 上 GCP Dataproc 上的自动缩放指标

GCP Dataproc 自定义图像 Python 环境

GCP Dataproc 节点中没有资源来启动新的 SparkSession