如何解决cassandra.cluster.NoHostAvailable:查询大量数据时,“无法完成针对任何主机的操作”
我使用以下代码从cassandra查询数据:
from cassandra import ConsistencyLevel
from cassandra.cluster import Cluster
from cassandra.auth import PlainTextAuthProvider
from cassandra.query import SimpleStatement
import pandas as pd
cluster = Cluster(contact_points=['192.168.2.4'],port=9042)
session = cluster.connect()
def testContectRemoteDatabase():
contact_points = ['192.168.2.4']
auth_provider = PlainTextAuthProvider(username='XXX',password='XX')
cluster = Cluster(contact_points=contact_points,auth_provider=auth_provider)
session = cluster.connect()
cql_str = 'select * from DB1.mytable ;'
simple_statement = SimpleStatement(cql_str,consistency_level=ConsistencyLevel.ONE,fetch_size=2000000)
execute_result = session.execute(simple_statement,timeout=None)
result = execute_result._current_rows
cluster.shutdown()
df = pd.DataFrame(result)
df.to_csv('./my_test.csv',index=False,mode='w',header=True)
if __name__ == '__main__':
testContectRemoteDatabase()
设置fetch_size=1000000
时没有错误,但是设置fetch_size=2000000
时,此错误消息是:
Traceback (most recent call last):
File "test.py",line 24,in <module>
testContectRemoteDatabase()
File "test.py",line 17,in testContectRemoteDatabase
execute_result = session.execute(simple_statement,timeout=None)
File "cassandra\cluster.py",line 2618,in cassandra.cluster.Session.execute
File "cassandra\cluster.py",line 4877,in cassandra.cluster.ResponseFuture.result
cassandra.cluster.NoHostAvailable: ('Unable to complete the operation against any hosts',{<Host: 192.168.2.4:9042 datacenter1>: ConnectionShutdown('errors=Connection heartbeat timeout after 30 seconds,last_host=192.168.2.4:9042')})
如何解决?
解决方法
您要进行全表扫描的无界//
study(title="Average True Range Overlay",shorttitle="ATRO",overlay=true)
atrlen = input(14,minval=1)
emalen = input(2,minval=1)
watrband = input(1,minval=0)
//
// Always use the Daily data in this overlay regardless of the current time scale
cl=ema(close,emalen)
atrbh = cl + watrband*atr(atrlen)
atrbl = cl - watrband*atr(atrlen)
atrbhD = security(tickerid,'D',atrbh)
atrblD = security(tickerid,atrbl)
plot(atrbhD,color=blue,linewidth=2,offset=1)
plot(atrblD,offset=1)
//
无效。 Cassandra专为OLTP工作负载而设计。
您的查询非常昂贵,并给单个协调器带来了压力,它需要从集群中的所有节点检索所有分区。 可能适用于分区数量少的单节点群集。但是到这一点,您已经可以确定您的代码无法扩展。
当环上分布有数十个节点和数百万个分区时,单个协调器节点将无法应对,并且副本将无法在超时范围内进行响应。
我建议您使用Spark进行分析查询。 Cassandra的Spark连接器可优化分析查询,并能够更好地处理它们。它也可以缩放。干杯!
,从Erick的描述来看,从Cassandra的角度来看,您的代码不是很理想,而且当数据多于可用内存时,代码将无法工作。
如果您只需要将数据库中的数据导出为CSV或其他格式,请不要重新发明轮子,而应使用DSBulk。就像这样简单:
dsbulk unload -k keyspace -t table -u user -p password -url filename
有关示例,请参见以下博客文章:
- https://www.datastax.com/blog/2019/03/datastax-bulk-loader-introduction-and-loading
- https://www.datastax.com/blog/2019/04/datastax-bulk-loader-more-loading
- https://www.datastax.com/blog/2019/04/datastax-bulk-loader-common-settings
- https://www.datastax.com/blog/2019/06/datastax-bulk-loader-unloading
- https://www.datastax.com/blog/2019/07/datastax-bulk-loader-counting
- https://www.datastax.com/blog/2019/12/datastax-bulk-loader-examples-loading-other-locations
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。