如何将 Python 连接到与 Docker 一起运行的 Cassandra

how to connect python to cassandra that run with docker

提问人:Ali Hosein pour 提问时间:7/18/2021 更新时间:7/19/2021 访问量:1939

问:

我想获取在线数据并保存到 cassandra 密钥空间。https://phoenixnap.com/kb/install-cassandra-on-windows,我阅读了本指南来运行 cassandra。这似乎很容易,但我收到与jdk相关的错误。所以,我尝试了不同的方式。我尝试使用docker-toolbox(windows 8.1)。我在docker-toolbox shell中通过以下步骤运行cassndra:

$ docker run --name some-cassandra2 --network some-network -d cassandra:latest

$ docker run -it --network some-network --rm cassandra cqlsh some-cassandra2

enter image description here

cqlsh>create keyspace CityInfo with replication = {'class' : 'SimpleStrategy', 'replication_factor':2};

cqlsh>use CityInfo;

cqlsh> CREATE TABLE cities (id int,name text,country text,PRIMARY KEY(id));

cqlsh> CREATE TABLE users (username text,name text,age int,PRIMARY KEY(username));

现在,我想获取在线数据并使用 python 代码保存到城市和用户表。我获得在线数据。我尝试连接以下代码:

from cassandra.cluster import Cluster
cluster = Cluster(['172.18.0.2'],port=9042)
session = cluster.connect('cityinfo',wait_for_all_pools=False)
session.execute('USE cityinfo')
rows = session.execute('SELECT * FROM users')
for row in rows:
        print(row.age,row.name,row.username)

但是我看到错误:

File "cassandra\cluster.py", line 3533, in cassandra.cluster.ControlConnection._reconnect_internal

NoHostAvailable: ('Unable to connect to any servers', {'172.18.0.2:9042': OSError(None, "Tried connecting to [('172.18.0.2', 9042)]. Last error: timed out")}) 

我尝试了几种方法。例如,我尝试使用其他 sush 作为 127.0.0.1:9042,或者在运行 cassandra 将容器端口连接到设备端口时添加了 -p7000:7000。但我不能。 请指导我。问题是什么?ip

python cassandra docker-toolbox

评论

0赞 Hisham 7/18/2021
尝试使用容器名称而不是 ip
0赞 Ali Hosein pour 7/18/2021
在 python 代码中?我试过了。不起作用。
0赞 David Maze 7/18/2021
客户端代码在哪里运行?容器专用 IP 地址在几乎所有环境中都无法访问。从另一个容器,它需要在同一个 Docker 网络上,并且问题中的调用是正确的。在 Docker 外部,在 Docker Toolbox 上,需要 VM 的 IP 地址。cqlsh
0赞 Ali Hosein pour 7/18/2021
我整天都在工作。首先,我想在 docker 上运行 cassandra 并在 spyder 中运行 python 代码。但正如你提到的,这是不可能的。然后,我阅读了不同的来源并对其进行了测试。其中之一已在本 towardsdatascience.com/ 中进行了解释......。在此地址中,python 代码在 docker shell 上运行。如前所述,我用两种方法一步一步地尝试了。首先,我将 python 代码作为容器运行。它发布了相同的错误。其次,我直接运行了python代码。它无法导入 cassandra-driver。有什么解决办法吗?

答:

3赞 P. Cabaleiro 7/19/2021 #1

我建议从运行在同一网络上的容器运行 Python 代码,因此您可以直接在 Python 中使用容器名称而不是 IP 地址。我能够毫无问题地运行您的代码,执行以下操作。

我创建了一个运行 Python 的 docker 容器,也运行在 .some-network

docker run -it --rm --network some-network python:3.8-slim bash

继续在容器内安装 cassandra-driver。

pip install cassandra-driver

在表中填写了一些虚拟数据,然后继续打开 Python 终端。users

from cassandra.cluster import Cluster
cluster = Cluster(['some-cassandra2'], port=9042)
session = cluster.connect('cityinfo',wait_for_all_pools=False)
session.execute('USE cityinfo')
rows = session.execute('SELECT * FROM users')
for row in rows:
    print(row.age,row.name,row.username)

请注意,与您的代码的唯一区别是我使用容器名称而不是 IP 地址的这一行:

cluster = Cluster(['some-cassandra2'], port=9042)