我正在尝试Cassandra.
在客户端(使用Hector),我查找了几个这样的键:
ColumnFamilyResult<String, String> result = template.queryColumns(Arrays.asList("key1","key2","key3"));
Run Code Online (Sandbox Code Playgroud)
大部分时间似乎都有效.但有时我在客户端上遇到超时异常:
Caused by: me.prettyprint.hector.api.exceptions.HTimedOutException: TimedOutException()
at me.prettyprint.cassandra.service.ExceptionsTranslatorImpl.translate(ExceptionsTranslatorImpl.java:35)
at me.prettyprint.cassandra.service.template.ThriftColumnFamilyTemplate$1.execute(ThriftColumnFamilyTemplate.java:100)
at me.prettyprint.cassandra.service.template.ThriftColumnFamilyTemplate$1.execute(ThriftColumnFamilyTemplate.java:88)
at me.prettyprint.cassandra.service.Operation.executeAndSetResult(Operation.java:103)
at me.prettyprint.cassandra.connection.HConnectionManager.operateWithFailover(HConnectionManager.java:258)
at me.prettyprint.cassandra.model.ExecutingKeyspace.doExecuteOperation(ExecutingKeyspace.java:97)
at me.prettyprint.cassandra.service.template.ThriftColumnFamilyTemplate.sliceInternal(ThriftColumnFamilyTemplate.java:88)
at me.prettyprint.cassandra.service.template.ThriftColumnFamilyTemplate.doExecuteSlice(ThriftColumnFamilyTemplate.java:46)
at me.prettyprint.cassandra.service.template.ColumnFamilyTemplate.queryColumns(ColumnFamilyTemplate.java:113)
at info.gamlor.experiments.Cassandra.readObjectByKey(ComplexCassandra.java:255)
Caused by: TimedOutException()
at org.apache.cassandra.thrift.Cassandra$get_slice_result.read(Cassandra.java:7772)
at org.apache.cassandra.thrift.Cassandra$Client.recv_get_slice(Cassandra.java:570)
at org.apache.cassandra.thrift.Cassandra$Client.get_slice(Cassandra.java:542)
at me.prettyprint.cassandra.service.template.ThriftColumnFamilyTemplate$1.execute(ThriftColumnFamilyTemplate.java:95)
Run Code Online (Sandbox Code Playgroud)
在服务器上,此异常显示:
ERROR 11:33:55,312 Exception in thread Thread[ReadStage:91,5,main]
java.lang.AssertionError: DecoratedKey(4948402862350542345439897754126541659, 6932) != DecoratedKey(132475956107784875457507977471906551877, 726f6f74) in C:\tem
p\cassandra\lib\cassandra\data\CassandraPolepos\ComplexObjects\CassandraPolepos-ComplexObjects-hd-2-Data.db
at org.apache.cassandra.db.columniterator.SSTableSliceIterator.<init>(SSTableSliceIterator.java:58)
at org.apache.cassandra.db.filter.SliceQueryFilter.getSSTableColumnIterator(SliceQueryFilter.java:66)
at org.apache.cassandra.db.filter.QueryFilter.getSSTableColumnIterator(QueryFilter.java:78)
at org.apache.cassandra.db.CollationController.collectAllData(CollationController.java:256)
at org.apache.cassandra.db.CollationController.getTopLevelColumns(CollationController.java:63)
at org.apache.cassandra.db.ColumnFamilyStore.getTopLevelColumns(ColumnFamilyStore.java:1331)
at org.apache.cassandra.db.ColumnFamilyStore.getColumnFamily(ColumnFamilyStore.java:1193)
at org.apache.cassandra.db.ColumnFamilyStore.getColumnFamily(ColumnFamilyStore.java:1128)
at org.apache.cassandra.db.Table.getRow(Table.java:378)
at org.apache.cassandra.db.SliceFromReadCommand.getRow(SliceFromReadCommand.java:69)
at …Run Code Online (Sandbox Code Playgroud) 我最近开始使用Cassandra数据库.现在我正在评估Cassandra client我们应该推进哪些方面.
我已经在stackoverflow上看到关于哪个客户端用于Cassandra的各种帖子,但没有一个有非常确定的答案.
我的团队已经让我对此进行一些研究,并pros and cons为Cassandra Client API’sJava中的每一个做出一定的研究.
正如我所提到的,我最近参与其中,Cassandra所以没有那么多想法为什么某些人选择Pelops client以及为什么某些人和Astyanax其他客户一起去.
我知道每个Cassandra客户的简短介绍,我的意思是我能够完成这项工作并开始阅读和写入Cassandra数据库.
以下是我到目前为止的信息.
CASSANDRA APIS
Hector(Production-Ready)
最稳定的Java API,为黄金时段做好准备.
Astyanax(The Up and Comer)
来自Netflix的干净Java API.它没有Hector广泛使用,但它是坚实的.
符合JPA标准的Kundera(NoSQL ORM),当您想通过对象与Cassandra进行交互时,这很方便.
这在一定程度上限制了您将无法拥有动态数量的列/名称等.但它确实允许您移植到ORM,或将存储集中到Cassandra以获得更多传统用途.
Pelops
我只是简单地使用了Pelops.这是一个直接的API,但似乎没有它背后的动力.
PlayORM(没有约束的ORM?)
我刚才听说过这个.看起来它试图通过引入JQL来解决传统的基于JPA的ORM和NoSQL之间的阻抗不匹配问题.看起来很有希望.
节俭(避免我!)
这是"低级"API.
以下是我们决定的优先事项Cassandra Client-
任何人都可以对此提出一些想法吗?此外,每个Cassandra Client客户都可以满足我的要求的任何利弊也将有很大的帮助.
我相信,主要是我将围绕着Astyanax client or New Datastax client that uses Binary protocol我的研究基础到目前为止.但是没有某些信息可以支持我的研究并将其呈现给我的团队.
Astyanax客户端和New Datastax客户端(使用新的二进制协议)之间的任何比较都将有很大帮助.
这对我的研究有很大的帮助,并且会从过去使用不同客户的不同人那里获得很多相关知识.
对于刚开始的任何网站,负载最初是最小的并且最初以缓慢的速度增长.人们通常从他们基于MySQL的站点开始,使用单个服务器(***也是VPS而不是专用服务器)作为应用服务器和数据库服务器运行,并且通常在这种设置下太过分了而且只是因为他们觉得需要他们将数据库与应用服务器分开,为其提供单独的VPS服务器.这是初创公司在规划资源采购时期望的事情.
但到目前为止,我所看到的,与Cassandra有很大的不同.人们通常建议开始使用至少一个3节点集群(在专用服务器上),它有大量的RAM.他们建议开始使用4GB或8GB RAM.因此,与MySQL相比,Cassandra需要更多的硬件资源,因为网站可以提供类似的性能,提供类似的负载/流量和相同数量的数据.我了解Cassandra由于复制而对存储的更高要求,但其他硬件资源呢?
我们不能像基于Cassandra的应用程序一样从MySQL开始.从1或2 VPS开始,并在需要时添加更多?
我不想比较苹果和橘子.我只是想知道当我开始使用基于VPS的单个节点的基于cassandra的单个节点基于VPS的MySQL安装时,我可能处于更危险的情况.这两种情况之间的区别.cassandra服务器比MySQL服务器更容易出现吗?如果我将tomcat与Cassandra一起使用,因为人们在单个服务器上使用LAMP堆栈,那会有什么不好.
对于将数据保存到nosql数据存储的代码,编写单元测试的最佳方法是什么,在我们的例子中是cassandra?
=>我们使用嵌入式服务器方法使用来自git hub的实用程序(https://github.com/hector-client/hector/blob/master/test/src/main/java/me/prettyprint/hector/testutils/EmbeddedServerHelper .java).但是我一直在看这个问题.1)它将数据保存在多个测试用例中,这使得我们很难确保测试类的测试用例中的数据不同.我尝试在每个测试用例之后调用cleanUp @Ahech,但这似乎并没有清理数据.2)当我们添加更多测试时,我们的内存不足,这可能是因为1,但我还不确定.我目前有1G堆大小来运行我的构建.
=>我一直在想的另一种方法是模拟cassandra存储.但这可能会泄漏cassandra模式中的一些问题,因为我们经常发现上述方法可以解决数据存储到cassandra中的问题.
请让我知道你对此的想法,如果有人使用过EmbeddedServerHelper并且熟悉我提到的问题.
只是一个更新.通过在测试嵌入式服务器使用的cassandra.yaml中将in_memory_compaction_limit_in_mb参数更改为32,我能够解决2)运行构建时用尽java堆空间问题.以下链接帮助我http://www.datastax.com/docs/0.7/configuration/storage_configuration#in-memory-compaction-limit-in-mb.它是64并且在压实期间始终失败.
我正在寻找一个代码示例来检索列族的所有行和所有列.就像是:
SELECT * FROM MyTable
Run Code Online (Sandbox Code Playgroud)
我看到这可以使用RangeSlicesQuery完成,但你仍然需要提供一定的范围.我认为你也必须指定列名.有干净安全的方法吗?
使用Hector 1.0和Cassandra 1.0.
我正在使用嵌入式Cassandra.当我关闭并重新启动我的Cassandra服务数据时会丢失.我认为正常的数据没有正确刷入磁盘.所以我尝试使用nodetool手动刷新数据并检查数据是否可用.但是nodetool似乎不适用于嵌入式Cassandra服务.我收到以下错误:
c:\vijay\cassandra\bin>nodetool -host 192.168.2.86 -p 7199 drain
Starting NodeTool
Failed to connect to '192.168.2.86:7199': Connection refused: connect
我尝试设置jmx属性仍然是我收到错误.我在代码中添加了以下行:
System.setProperty("com.sun.management.jmxremote", "true");
System.setProperty("com.sun.management.jmxremote.port", "7197");
System.setProperty("com.sun.management.jmxremote.authenticate", "false");
System.setProperty("com.sun.management.jmxremote.ssl", "false");
System.setProperty("java.rmi.server.hostname", "my ip");
Run Code Online (Sandbox Code Playgroud)
那么,有没有办法在不使用nodetool的情况下手动将数据刷新到Cassandra?
编辑1:
经过几个小时的尝试后,我现在能够运行nodetool(而不是将jmx配置添加到我添加到Eclipse调试配置的代码中,并且它有效).我现在运行drain命令将数据正确刷新到磁盘.所以现在我的问题是:为什么数据没有正确刷新?每当我重新启动Cassandra服务时,最近的更改都消失了.
这是我面临的情景样本.说我有这个列族:
create column family CompositeTypeCF
with comparator = 'CompositeType(IntegerType,UTF8Type)'
and key_validation_class = 'UTF8Type'
and default_validation_class = 'UTF8Type'
Run Code Online (Sandbox Code Playgroud)
下面是一些使用Hector的示例Java代码,了解如何将一些数据插入此列族:
Cluster cluster = HFactory.getOrCreateCluster("Test Cluster", "192.168.1.6:9160");
Keyspace keyspaceOperator = HFactory.createKeyspace("CompositeTesting", cluster);
Composite colKey1 = new Composite();
colKey1.addComponent(1, IntegerSerializer.get());
colKey1.addComponent("test1", StringSerializer.get());
Mutator<String> mutator = HFactory.createMutator(keyspaceOperator, StringSerializer.get());
Mutator<String> addInsertion = mutator.addInsertion("rowkey1", "CompositeTypeCF",
HFactory.createColumn(colKey1, "Some Data", new CompositeSerializer(), StringSerializer.get()));
mutator.execute();
Run Code Online (Sandbox Code Playgroud)
这是有效的,如果我去cassandra-cli做一个列表,我得到这个:
$ list CompositeTypeCF;
Using default limit of 100
-------------------
RowKey: rowkey1
=> (column=1:test1, value=Some Data, timestamp=1326916937547000)
Run Code Online (Sandbox Code Playgroud)
我现在的问题是:如何在Hector中查询这些数据?基本上我需要以几种方式查询它:
我正在研究使用Java和Hector的Apache Cassandra 0.7.6版,我尝试创建一个集群,一个密钥空间并在创建的密钥空间中插入一列.
通过查看示例,我了解到键空间等同于SQL数据库中的数据库,而列族与表相同.知道这一点,我试图创建我的简单示例结构.
Cluster tutorialCluster = HFactory.getOrCreateCluster("TutorialCluster","127.0.0.1:9160");
ConfigurableConsistencyLevel ccl = new ConfigurableConsistencyLevel();
ccl.setDefaultReadConsistencyLevel(HConsistencyLevel.ONE);
Keyspace tutorialKeyspace = HFactory.createKeyspace("Tutorial", tutorialCluster, ccl);
Mutator<String> mutator = HFactory.createMutator(tutorialKeyspace, stringSerializer);
mutator.addInsertion("CA Burlingame", "StateCity", HFactory.createColumn(650L, "37.57x122.34", longSerializer, stringSerializer));
MutationResult mr = mutator.execute();
Run Code Online (Sandbox Code Playgroud)
但是当我尝试在cassandra启动时运行它,但它返回一个异常.
Exception in thread "main" me.prettyprint.hector.api.exceptions.HInvalidRequestException: InvalidRequestException(why:Keyspace Tutorial does not exist)
at me.prettyprint.cassandra.connection.HThriftClient.getCassandra(HThriftClient.java:70)
at me.prettyprint.cassandra.connection.HConnectionManager.operateWithFailover(HConnectionManager.java:226)
Run Code Online (Sandbox Code Playgroud)
但我已经创建了"Tutorial"键空间,并在mutator中使用.
对于我的应用程序的操作监视,我正在寻找类似于常用的"SQL连接验证"查询
选择1;
在Cassandra,使用Hector驱动程序.我尝试过像Cluster.getKnownPoolHosts()和.getConnectionManager().getActivePools()这样的事情.但是,只有当我真正尝试使用查询访问Cassandra时,它们的状态似乎才会不断更新.
我希望我的运行状况检查独立于任何需要存在的键空间或用户CF,因此只运行"虚拟"查询似乎很困难(针对什么?).当然,它不应占用大量内存或产生任何重大负载.
我可以以某种方式强制Hector更新其连接池状态而不运行真正的查询吗?
(顺便说一句:CQL甚至不接受"SELECT 1"作为有效查询.)