Cassandra客户端Java API的使用方法

48

我最近开始使用Cassandra数据库。现在我正在评估我们应该采用哪个Cassandra客户端。

我看过一些关于Cassandra应该使用哪个客户端的帖子,但没有一个很明确的答案。

我的团队要求我对此进行一些研究,并为每个Java中的Cassandra Client API列出一些优缺点。

正如我所说,我最近涉足Cassandra,所以不太清楚为什么某些人选择Pelops客户端,为什么某些人选择Astyanax和其他一些客户端。

我对每个Cassandra客户端都有一些简要了解,这意味着我能够使其工作并开始读写Cassandra数据库。

以下是我目前拥有的信息。

CASSANDRA APIS

  • Hector (已准备好生产环境)
    Java APIs中最稳定、可用的API。

  • Astyanax(新秀)
    Netflix提供的干净的Java API。它的使用范围不如Hector广泛,但它很可靠。

  • Kundera (NoSQL ORM)
    符合JPA标准,当您想通过对象与Cassandra交互时很方便。
    这在某种程度上限制了您,因为您将无法拥有动态数量的列/名称等。但它确实允许您将ORM迁移到Cassandra上,或者为更传统的用途将存储集中到Cassandra上。

  • Pelops
    我只是简单地使用过Pelops。它是一个直接的API,但似乎没有强大的支持。

  • PlayORM (无约束的ORM?)
    我刚听说这个。看起来它正在尝试解决阻抗匹配问题,并提供了更灵活的数据访问模型。

通过引入JQL来解决传统基于JPA的ORM和NoSQL之间的不匹配问题,看起来很有前途。Thrift(避免使用!)是“低级”API。

以下是我们在决定Cassandra客户端时的优先考虑因素:
首要考虑因素是:低延迟开销、异步API以及生产环境中的可靠性/稳定性。(例如,在包装客户端的DAL中可以获得更加用户友好的API)。连接池和分区感知等一些其他有用的功能。能够检测到任何新添加的节点。还需要良好的支持(如下所指出的)。
谁能提供一些关于这个问题的想法?还有每个Cassandra客户端的优缺点,哪个客户端也可以满足我的要求,这也将是一个很大的帮助。
我相信,基本上我会围绕Astyanax客户端或使用二进制协议的New Datastax客户端展开研究。但是目前没有确定的信息来支持我的研究,并向我的团队展示它。
对Astyanax客户端和使用新二进制协议的New Datastax客户端之间的任何比较都将是极大的帮助。
这将对我的研究非常有帮助,并将从过去使用不同客户端的不同人士那里获得很多知识。

3
你可以将cassandra-jdbc添加到列表中 https://code.google.com/a/apache-extras.org/p/cassandra-jdbc/。 - phatfingers
好观点phatfingers。又学到了一些新东西。很酷。 - arsenal
我曾经选择过Astyanax,可以肯定地说它易于使用且非常稳定。几个要点:datastax驱动目前为beta版本Astyanax支持原生协议 - Ivan Velykorodnyy
5个回答

18
Thrift正逐渐成为遗留API:
首先,您应该知道Thrift API不会获得新功能;它只是为了向后兼容,并且不建议用于新项目。 - the paul 因此,我建议避免使用基于Thrift的API(Thrift仅用于向后兼容)。
话虽如此,如果您确实需要使用基于Thrift的API,则可以选择Astyanax。与其他Thrift API相比,Astyanax非常易于使用,但我个人的经验是Datastax的驱动程序更容易使用。
所以,您应该查看Datastax的 API(和GitHub存储库)吗?我不确定是否有可下载的API编译版本,但您可以很容易地使用Maven构建它。此外,如果您查看GitHub存储库的提交日志,它会经常更新。
该驱动程序仅与CQL3兼容,并且是异步的,但请注意,Cassandra 1.2是最早支持的版本。
性能 Astyanax基于thrift协议,而Datastax的驱动程序则采用二进制协议。这里是我能找到的最新基准测试 thrift和CQL之间的对比(请注意这些数据肯定已经过时)。但公平地说,在这些基准测试中显示的性能上的小差距很少会有影响。
异步支持 Datastax的异步支持绝对是优于Astyanax(Netflix 尝试实现它,但决定放弃)。 文档
我无法反驳Netflix的维基。文档非常好,而且更新频率很高。他们的维基包括代码示例,如果需要查看代码工作方式,可以在源代码中找到测试。然而,我很难找到Datastax驱动程序的任何文档,但是在GitHub存储库中提供了测试,这是一个起点。
此外,请看一下这个答案(不是我的)它探讨了Thrift和CQL的一些优缺点。

是的。那很有用,但正如你所提到的,如果它不会获得新功能,那么甚至评估它也没有意义。但知道它也支持异步是一件好事。 - arsenal
@TechGeeky 数据驱动程序将会获得新功能,但是Thrift不会获得新功能。 - Lyuben Todorov

8
我建议使用Datastax Java驱动程序来访问Cassandra数据库。http://www.datastax.com 如果需要类似JPA的支持,请尝试使用我的映射工具。http://valchkou.com/cassandra-driver-mapping.html 基于注解的驱动,无需手动编写映射文件、脚本和配置文件。无需DDL脚本。实体定义会自动和数据库架构同步。
以下是用法示例:
   Entity entity = new Entity();
   mappingSession.save(entity);
   entity = mappingSession.get(Entity.class, id);
   mappingSession.delete(entity); 

可以在Maven中央库中找到

   <dependency>
      <groupId>com.valchkou.datastax</groupId>
      <artifactId>cassandra-driver-mapping</artifactId>          
    </dependency>

3
我还要补充一下良好的支持,我们经常在堆栈溢出上发布关于playORM的回答;). 它即将开始支持mongodb(工作快完成了),所以任何客户端都可以在mongodb或cassandra上运行。它有自己的查询语言,因此这个端口可以正常工作。当确实需要速度时,您始终可以访问原始的astyanax接口。
此外,你之前提到的异步......thrift不支持异步,因为客户端生成的thrift代码也没做。既然情况变了,我不知道有哪个客户端添加了异步处理。
我知道hbase有一个异步客户端。总之,我只是想加上我的两分钱,如果能帮上一点忙就好了。
编辑:最近我看过cassandra-thrift生成的源代码,它不是一个非常适合异步开发的API,需要使用send和recv()方法,但你不知道何时调用recv方法。Cassandra用户列表上的Aaron Morton在他的博客中介绍了如何真正实现它,但那并不干净……需要从深处抓取thrift的选择器并进行一些操作,以便你知道何时调用recv方法...相当恶心的事情。
后话, 迪恩

我尝试了Kundera。在决定走哪条路之前,我希望也能尝试一下playORM。请分享您最近使用playORM的经验。它是否支持较新的play框架版本(v2.3)? - Karthik Sankar

2

我直接使用过Hector、Astyanax和Thrift。我还使用过Python客户端PyCassa。

我认为重要且有差异的功能包括:

  • API易用性
  • 复合列支持
  • 连接池
  • 延迟
  • 文档

主要问题之一是正确获取类型。您希望能够传递longs、Strings、byte[]等等。Hector和Astyanax都通过使用序列化器对象来解决此问题。在Astyanax中,您在更高层次上指定它们,因此您需要更少地指定它们。在Hector中,语法通常非常笨拙,并且很难适应如果您更改模式。

由于Python具有动态类型,因此在PyCassa中处理这个问题要容易得多。由于这对您来说不是一个选项,因此我不会多说,但我发现它最容易使用(远远超过其他选项),但也相当慢。

Hector中的复合列支持非常令人困惑。Astyanax有注释可以大大简化此过程。

据我所知,Hector和Astyanax的连接池相同。两者都将避免失效的主机并发现添加到环中的新主机。这两个功能对于可靠性和可维护性至关重要。Pelops似乎具有这些功能,但我从未尝试过。

Astyanax和Hector之间的一个关键区别是延迟优化。Astyanax具有将读取和写入请求路由到副本节点的能力,可能避免额外的网络跳跃。这可以将延迟降低几毫秒。

最后一次查看时,Astyanax文档很差,但现在似乎有了很大改善。

我今天唯一能看到的Hector优势是它被广泛使用,因此可能更少出错。但是Astyanax具有更好的功能集。


1
我有一个与Valchkou类似的推荐。DataStax Java CQL驱动程序非常好。我尝试过Astyanax、Kundera和Buffalosw的Playorm。Astyanax很低级且有些复杂。Kundara和Playorm是通用的NoSQL数据库ORM,设置和入门都很复杂。

Datastax API与JDBC驱动程序非常相似,您必须在DAO中嵌入CQL语句,并编写多行代码来加载和保存实体。为了解决这个问题,我编写了一个名为cassandra-jom的Java对象映射器,它是围绕DataStax CQL驱动程序构建的。Cassandra-jom注释与JPA/Hibernate注释非常相似,甚至可以从对象模型创建/更新列族架构。它易于使用和可靠,并在我的其他实时Web应用程序中使用。请在其GitHub页面上查看。

https://github.com/w3cloud/cassandra-jom


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接