如何在 Cassandra 节点上实现数据本地化
Posted
技术标签:
【中文标题】如何在 Cassandra 节点上实现数据本地化【英文标题】:Howt to achieve data locality on Cassandra node 【发布时间】:2014-11-12 14:31:09 【问题描述】:我正在寻找一种解决方案,它可以让我将代码与数据放在一起。 作为 Db,我拥有 Cassandra,并且希望能够获取位于特定节点上的数据。
这里的重要性是我尝试通过自己的代码实现它,而不使用框架,如 Hadoop 或 Spark。
如果有人可以解释或提供链接,我很高兴,因为我还没有找到解决方案。 这里的问题是,如何使用 Cassandra 实现这一点。
提前致谢
【问题讨论】:
你为什么要这样做? 我想实时处理大数据,我希望将数据保存在内存中,因为有这样的功能。但是我仍然需要分布式计算,因此,数据局部性,来实现实时目标 是写重还是读重? 阅读量很大(但 Cassandra 是我必须忍受的) 我会说让它成为内存表并设置复制,以便它存在于每个节点上。不要诋毁那些试图帮助你的人最喜欢的工具也可能会有所帮助。 【参考方案1】:警告这很可能不是你应该做的:
最简单的方法是使用字节顺序分区器。这基于主键的实际字节顺序而不是使用散列将数据放置在节点上。此技术仅供专家使用,它消除了 Cassandra 的许多优点,只有真正了解权衡的人才能使用。 ByteOrderedPartitioner 还给应用程序设计人员和 sysops 团队带来了更大的负担,因为系统现在无法以易于理解的方式进行扩展。
使用 Spark 或 Hadoop 是处理这个问题的正确方法:
真正的解决方案是使用 Hadoop 或 Spark。您可以通过尝试直接从磁盘读取 sstables 来获得您正在寻找的数据位置。一个例子:http://www.fullcontact.com/blog/cassandra-sstables-offline/
【讨论】:
感谢 RussS 的回答。我会把第一个变体作为一个选项。谈到第二个,我想要实现的是实时处理大数据。我正在寻找基于 Cassandra 的解决方案,其性能与 IMDG 相当。但是在这里我尝试使用 cassandra 的内存选项(由 DataStax 提供),所以我不需要 IMDG,但仍然需要分布式计算,并且因为数据和代码托管。所以我相信,我不会使用 Spark 的缓存功能,因为 Spark 在这里看起来是一个错误的工具,我可以在其中安装 Akka 集群。 唯一的问题是,当data cassandra在内存中存储数据时,如何获取数据局部性。显然,cassandra 中必须有一个提供该功能的功能。我认为在 cassandra-spark-connector 中如何实现局部性是合理的,但是,社区可能会对此有所帮助...... Spark OSS 连接器在局部性方面做出了最好的尝试,但实际上并不能保证它,因为它最终使用与任何其他客户端相同的 Datastax Java 驱动程序。 Datastax in memory 选项目前也仅限于 jvm heap,因此在 2.1 版本之前它不会允许大量数据。以上是关于如何在 Cassandra 节点上实现数据本地化的主要内容,如果未能解决你的问题,请参考以下文章
如何使用具有不同分片数量的索引在 ElasticSearch 上实现负载的均匀分布?