|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
我希望在python爬虫项目中使用Cassandra数据库,当我使用如下代码时,生成的log文件显示连接被主机拒绝,但同时又能成功将数据库中的表名读取出来
from cassandra.cluster import Cluster
class CassandraDatabase():
def __init__(self, keyspace, table, host=['localhost'], port=9042):
self.keyspace = keyspace
self.host = host
self.table = table
self.port = port
self.connect()
def __del__(self,):
self.cluster.shutdown()
def connect(self,):
self.cluster = Cluster(contact_points=self.host, port=self.port, protocol_version=4)
self.session = self.cluster.connect()
keyspace_name = 'mykeyspacetest'
# 获取集群的元数据
metadata = self.session.cluster.metadata
# 通过keyspace名称获取具体的keyspace元数据
keyspace_metadata = metadata.keyspaces[keyspace_name]
# 获取该keyspace中的所有表名
table_names = keyspace_metadata.tables.keys()
# 打印表名
print("Keyspace '{}' 中的表名:".format(keyspace_name))
for table_name in table_names:
print(table_name)
self.create_keyspace()
self.session.set_keyspace(self.keyspace)
def close(self,):
self.cluster.shutdown()
log文件中的报错信息如下:
2024-10-17 20:25:57 [cassandra.cluster] WARNING: Cluster.__init__ called with contact_points specified, but no load_balancing_policy. In the next major version, this will raise an error; please specify a load-balancing policy. (contact_points = ['localhost'], lbp = None)2024-10-17 20:25:59 [cassandra.cluster] WARNING: [control connection] Error connecting to ::1:9042:Traceback (most recent call last): File "D:\Anaconda\envs\datataiwanpy38\lib\site-packages\cassandra\cluster.py", line 3577, in _reconnect_internal return self._try_connect(host) File "D:\Anaconda\envs\datataiwanpy38\lib\site-packages\cassandra\cluster.py", line 3599, in _try_connect connection = self._cluster.connection_factory(host.endpoint, is_control_connection=True) File "D:\Anaconda\envs\datataiwanpy38\lib\site-packages\cassandra\cluster.py", line 1670, in connection_factory return self.connection_class.factory(endpoint, self.connect_timeout, *args, **kwargs) File "D:\Anaconda\envs\datataiwanpy38\lib\site-packages\cassandra\connection.py", line 846, in factory conn = cls(endpoint, *args, **kwargs) File "D:\Anaconda\envs\datataiwanpy38\lib\site-packages\cassandra\io\asyncorereactor.py", line 353, in __init__ self._connect_socket() File "D:\Anaconda\envs\datataiwanpy38\lib\site-packages\cassandra\connection.py", line 951, in _connect_socket raise socket.error(sockerr.errno, "Tried connecting to %s. Last error: %s" %ConnectionRefusedError: [Errno 10061] Tried connecting to [('::1', 9042, 0, 0)]. Last error: 由于目标计算机积极拒绝,无法连接。
同时,Cassandra数据库端的日志输出有:
INFO [nioEventLoopGroup-2-6] 2024-10-17 20:49:14,872 Message.java:687 - Unexpected exception during request; channel = [id: 0x063be996, L:/127.0.0.1:9042 - R:/127.0.0.1:24261]java.io.IOException: 远程主机强迫关闭了一个现有的连接。
我已经尝试使用:
1. 修改连接方法中的协议版本,改为protocol_version=4
2. 修改localhost为127.0.0.1,怀疑是回访地址为::1的问题
根据你提供的信息和你的尝试,你已做了一些努力来解决问题。以下是一些可能的原因与解决方案:
1. **确保参数正确**:
- 确保初始化`CassandraDatabase`时传入了有效的`host`。如果没有,Python中默认的值将为`None`,这会导致连接被拒绝。
- 确保编程时将`host`设置为有效的Cassandra节点地址,如`127.0.0.1`而不是`localhost`。
2. **检查Cassandra的网络配置**:
- 确保Cassandra配置文件`cassandra.yaml`中的`rpc_address`正确设置为`0.0.0.0`或`127.0.0.1`,允许本地连接。
- 确保`listen_address`正确配置。
3. **防火墙或安全组设置**:
- 确保没有防火墙或安全组阻止Cassandra的9042端口。
- 本地防火墙设置可以通过命令行工具如`ufw`(在Unix系统中)或Windows防火墙设置界面进行调整。
4. **Cassandra运行状况**:
- 确保Cassandra服务正在运行且没有错误。
- 使用`nodetool status`命令检查集群状态。
5. **日志输出和调试**:
- 查看更多Cassandra日志以查明是否还有其他错误信息。
- 确认Python客户端包(如`cassandra-driver`)的版本兼容于当前的Cassandra版本。
6. **检查Python代码**:
- 你的代码示例中`keyspace_metadata.tables.keys()`可能会抛出错误,因为应使用`keyspace_metadata[keyspace_name].tables.keys()`来获取指定keyspace中的表名。
- 确保在实际使用代码时替换了任何占位符(如`self.host`, `self.keyspace`等)为实际值。
尝试解决这些问题,如果连接问题仍然发生,建议在不同的环境中验证,包括数据库配置和代码逻辑。这样可以更好地隔离问题所在。
以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
|
|