使用cql超过thrift的优点

Dan*_*mey 15 thrift cql cassandra

使用cql而不是thrift有什么明显的优势,还是仅仅是开发人员过于习惯SQL的情况?我想从thrift查询切换到cql,唯一的问题是我不确定这样做的缺点.这些是什么?

the*_*aul 21

Lyuben的答案很好,但我相信他可能会在几点上被误导.首先,您应该知道Thrift API不会获得新功能; 它是为了向后兼容,而不是推荐用于新项目.已有一些功能无法通过Thrift界面使用.

另一个因素是来自Acunu的引用基准具有误导性; 它们不会使用预准备语句来衡量CQL的性能.例如,请参阅https://issues.apache.org/jira/browse/CASSANDRA-3634上的图表(可能与Acunu帖子所基于的数据集相同,因为Eric Evans同时编写了这两个数据集).去年,CQL解析和执行速度也有了一些改进.您不太可能观察到CQL 3和Thrift之间的任何实际速度差异.

最后,我认为我甚至不同意Thrift更灵活.CQL 3数据模型允许使用Thrift为几乎所有非反模式使用的相同数据结构; 它只是让你以更有条理的方式思考模型.例如,Lyuben提到了具有不同列数的行.CQL 3表仍然可以利用该功能:"存储引擎行"(这是Cassandra的低级存储,Thrift直接使用的)和"CQL行"(您通过Thrift接口看到的)之间存在差异.CQL只执行将宽存储引擎行可视化为结构化表所需的额外工作.

在一个快速的答案中解释起来有点困难,但是看一下这个帖子有点温和的解释.


Lyu*_*rov 17

查询
在CQL中,您可以查询cassandra并在几行中获取数据(使用JDBC驱动程序):

String query = "SELECT * FROM message;";
PreparedStatement statement = con.prepareStatement(query);
Run Code Online (Sandbox Code Playgroud)

在基于thrift的API中,它有点复杂(例如Astyanax):

OperationResult<ColumnList<String>> result = 
     keyspace.prepareQuery(mail/*specify columnfamily structure*/)
             .getKey("lyuben@1363115059").execute();
ColumnList<String> columns = result.getResult();
Run Code Online (Sandbox Code Playgroud)

性能
基于Acunu执行的基准测试,Thrift(RPC)在查询性能方面稍微领先于CQL,但您需要处于这样一种情况,即高吞吐量是获得显着优势的关键.


一些优秀的文章要查找:

编辑

上述基准已经过时,保罗为准备好的声明提供了更新的基准.

  • CQL仍允许您在底层数据结构中拥有变量列,它只是通过模式公开它们.就像让你有能力拥有地图,集合和列表一样.引擎盖下的所有内容都是作为变量列名实现的.CQL3尝试将人们使用变量列的内容用于导出那些更高级别的概念.以下文章介绍了其中的一些内容:http://www.datastax.com/dev/blog/thrift-to-cql3 (4认同)
  • 我和Zanson在一起 - "CQL不[支持无模式模型]" - 是直言不讳的.由于Thrift和CQL使用相同的术语"列"来表示两种不同的东西,因此产生了混淆.这样,Thrift意味着一个原始存储引擎单元,它可以是一个或多个CQL列.CQL为您提供了与Cassandra的稀疏存储引擎相同的功能,但是它以一种消除了大量涉及的样板(例如:集合)的方式暴露了它,并为我们提供了更加清洁的基础,以便在未来进一步改进.资料来源:我是两篇链接博客文章的作者. (4认同)
  • @jbellis因此,我是否正确地认为,如果我们有一个cql3表并且希望添加不存在的新列,我们需要首先修改表的架构以允许这样做?(这就是我不太灵活的意思,您需要先回过头来修改表的架构,然后再添加新的列,而且我知道这样做可以提高数据一致性) (2认同)