首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何将python连接到使用docker运行的cassandra

如何将python连接到使用docker运行的cassandra
EN

Stack Overflow用户
提问于 2021-07-18 15:06:55
回答 1查看 225关注 0票数 2

我想获取在线数据并保存到cassandra密钥空间。我读了这个指南,https://phoenixnap.com/kb/install-cassandra-on-windows,来运行cassandra。这看起来很简单,但我得到了与jdk相关的错误。所以,我尝试了不同的方法。我尝试过docker-toolbox (windows8.1)。我在docker-toolbox shell中通过以下步骤运行cassndra:

代码语言:javascript
复制
$ docker run --name some-cassandra2 --network some-network -d cassandra:latest

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

代码语言:javascript
复制
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代码保存到cities和users表中。我得到的是在线数据。我尝试使用以下代码进行连接:

代码语言:javascript
复制
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)

但我看到了错误:

代码语言:javascript
复制
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")}) 

我试了几种方法。例如,我尝试使用其他ip,比如127.0.0.1:9042,或者在运行cassandra来连接容器端口和设备端口时添加了-p7000:7000。但是我不能。请给我指引。有什么问题吗?

EN

回答 1

Stack Overflow用户

发布于 2021-07-19 04:09:16

我建议从运行在同一网络上的容器中运行Python代码,这样您就可以直接在Python中使用容器名称而不是IP地址。我能够运行你的代码,没有任何问题,执行以下操作。

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

代码语言:javascript
复制
docker run -it --rm --network some-network python:3.8-slim bash

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

代码语言:javascript
复制
pip install cassandra-driver

users表中填入一些虚拟数据,然后打开一个Python终端。

代码语言:javascript
复制
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地址的这一行:

代码语言:javascript
复制
cluster = Cluster(['some-cassandra2'], port=9042)
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/68426835

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档