当我 "select * from ColumnFamily" 在给定的 Cassandra 集群中时会发生什么
What happens when I "select * from ColumnFamily" in a given Cassandra Cluster
有人可以解释并提供解释
行为的文档吗
select * from <keyspace.table>
假设我有 5 个节点集群,当发出此类查询时,Cassandra DataStax Driver 的行为如何?
(Fetchsize 设置为 500)
这是提取数据的正确方法吗?它会导致任何性能问题吗?
不,这确实是一种非常糟糕的数据提取方式。当 Cassandra 至少通过分区键(标识保存实际数据的服务器)获取数据时,它会大放异彩。当您执行 select * from table
时,请求被发送到协调节点,这将需要从所有服务器中提取所有数据并通过该协调节点发送,使其过载,如果您有足够的数据,很可能会导致超时在集群中。
如果您真的需要从集群中完全获取数据,最好使用类似 Spark Cassandra Connector that read data by token ranges, fetching the data directly from nodes that are holding the data, and doing this in parallel. You can of course implement the token range scan in Java driver, something like this 的方法,但与使用 Spark 相比,这需要您做更多的工作。
有人可以解释并提供解释
行为的文档吗select * from <keyspace.table>
假设我有 5 个节点集群,当发出此类查询时,Cassandra DataStax Driver 的行为如何? (Fetchsize 设置为 500)
这是提取数据的正确方法吗?它会导致任何性能问题吗?
不,这确实是一种非常糟糕的数据提取方式。当 Cassandra 至少通过分区键(标识保存实际数据的服务器)获取数据时,它会大放异彩。当您执行 select * from table
时,请求被发送到协调节点,这将需要从所有服务器中提取所有数据并通过该协调节点发送,使其过载,如果您有足够的数据,很可能会导致超时在集群中。
如果您真的需要从集群中完全获取数据,最好使用类似 Spark Cassandra Connector that read data by token ranges, fetching the data directly from nodes that are holding the data, and doing this in parallel. You can of course implement the token range scan in Java driver, something like this 的方法,但与使用 Spark 相比,这需要您做更多的工作。