根据我对 Cassandra 的一点了解,似乎数据局部性对于访问节点的客户端应用程序来说基本上是透明的,正如它应该的那样。
但是,如果我明确只想访问我所连接的节点本地的列族的数据,该怎么办?这样的事可能吗?我还没有找到一种从开箱即用的客户端 API 中获取此信息的方法,但似乎我可以通过系统表获取其中一些信息,但我不太清楚如何做到这一点.
这个想法是执行mapreduce,但不使用Hadoop。本地客户端将连接到其本地 cassandra 节点,对本地数据进行聚合,然后将其传回上游。
这样的事情可能吗?从表面上看,这似乎是可能的,因为我已经看到 Hadoop 能够使用 Cassandra 的证据,但这些示例似乎是针对 Hadoop 而不是通用客户端。本地客户端(与 Casandra 对话的部分)将使用 Java。我目前正在使用 Hector,但我不确定它是否会提供任何数据位置信息。
最佳答案
一个recent article Netflix 技术博客上介绍了 Aegisthus,该项目读取跨集群的磁盘上存储的 SSTable,并将它们合并为单个一致的数据 View (在 MapReduce 中)。我可以想象,用于在单个节点上生成数据 View 的机制将是微不足道的。
不幸的是,我认为他们还没有开源这个工具,所以你将无法使用它。此时最多可以看到的是,是的,可以使用非 Cassandra 代码 native 读取 SSTable。
您也许可以使用读取 SSTables 的 Cassandra 源代码来破解一些东西,并将其提供给您希望构建的本地客户端。一个很好的起点是查看 sstable2json
工具中使用的 org.apache.cassandra.tools.SSTableExport
的源代码。
关于java - 如何访问Cassandra节点本地数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9262745/