[计算机]cassandra的初步使用及一些简单的操作.doc

上传人:sccc 文档编号:4561002 上传时间:2023-04-27 格式:DOC 页数:34 大小:210.50KB
返回 下载 相关 举报
[计算机]cassandra的初步使用及一些简单的操作.doc_第1页
第1页 / 共34页
[计算机]cassandra的初步使用及一些简单的操作.doc_第2页
第2页 / 共34页
[计算机]cassandra的初步使用及一些简单的操作.doc_第3页
第3页 / 共34页
[计算机]cassandra的初步使用及一些简单的操作.doc_第4页
第4页 / 共34页
[计算机]cassandra的初步使用及一些简单的操作.doc_第5页
第5页 / 共34页
点击查看更多>>
资源描述

《[计算机]cassandra的初步使用及一些简单的操作.doc》由会员分享,可在线阅读,更多相关《[计算机]cassandra的初步使用及一些简单的操作.doc(34页珍藏版)》请在三一办公上搜索。

1、Apache CassandraApache Cassandra是一套开源分布式数据库管理系统。它最初由Facebook开发,用于储存特别大的数据。 主要特性: 分布式 于column的结构化 高伸展性 Cassandra是一个混合型的非关系的数据库,类似于Google的BigTable。Cassandra的主要特点就是它不是一个数据库,而是由一堆数据库节点共同构成的一个分布式网络服务,对Cassandra 的一个写操作,会被复制到其它节点上去,对Cassandra的读操作,也会被路由到某个节点上面去读取。对于一个Cassandra群集来说,扩展性能是比较简单的事情,只管在群集里面添加节点就可

2、以了。 Cassandra的主要功能比 Dynamo(分布式的Key-Value存 储系统)更丰富,但支持度却不如文档存储MongoDB(介于关系数据库和非关系数据库之间的开源产品,是非关系数据库当中功能最丰富,最像关系数据库的。支持的数据结构非常松散,是类似json的bjson格式,因此可以存储比较复杂的数据类型。) Cassandra最初由Facebook开发,后转变成了开源项目。它是一个网络社交云计算方面理想的数据库。以Amazon专有的完全分布式的Dynamo为基础,结合了Google BigTable基于列族(Column Family)的数据模型。P2P去中心化的存储。很多方面都可

3、以称之为Dynamo 2.0。 和其它数据库比较,Cassandra有三个突出特点: 模式灵活 :使用Cassandra,像文档存储,你不必提前解决记录中的字段。你可以在系统运行时随意的添加或移除字段。这是一个惊人的效率提升,特别是在大型部署上。 真正的可扩展性 :Cassandra是纯粹意义上的水平扩展。为给集群添加更多容量,可以指向另一台计算机。你不必重启任何进程,改变应用查询,或手动迁移任何数据。 多数据中心识别 :你可以调整你的节点布局来避免某一个数据中心起火,一个备用的数据中心将至少有每条记录的完全复制。 一些使Cassandra提高竞争力的其它功能: 范围查询 :如果你不喜欢全部的

4、键值查询,则可以设置键的范围来查询。 列表数据结构 :在混合模式可以将超级列添加到5维。对于每个用户的索引,这是非常方便的。 分布式写操作 :有可以在任何地方任何时间集中读或写任何数据。并且不会有任何单点失败。Cassandra分布式节点服务器的简单部署文章分类:数据库 Cassandra作为目前很热门的一个NOSQL型数据库,引起了很多的关注。对NOSQL感兴趣的我,也来作了一次简单的测试。 废话不多说,下面就来介绍下Cassandra多节点的部署。 部署要求: 1. JDK1.6 2. OS:linux,我在windows上实验过,不知道为啥一直没通(7000端口上只有windows的发包

5、,双方不互相通信) 3. cassandra 0.6 OK,基本的东西都有了,进入到cassandra的目录,首先需要修改一些相关的文件路径: 1. log4j.properties 文件输出路径修改 2. storage-conf.xml CommitLogDirectory和DataFileDirectory路径修改 接着进行分布式节点的配置,还是修改torage-conf.xml : 1. Test Cluster 这个要求所有节点的名字都相同,如果不相同,则报类似 AName != BName 的错误 2. 配置ColumnFamily 的一些属性,其中name是所要使用的Column

6、Family 名称,可以多个,客户端做CRUD操作时需要指定。注意所有的节点配置都需要一样(我就曾因配置不一致出过ClassCastException的异常) 3. 2 配置数据需要复制的数量,复制的策略分RackUnawareStrategy和RackAwareStrategy两种方式(策略没细看不再描述) 4. 10.10.13.220 10.10.13.181 10.10.13.232 这个是所有分布式服务器节点的IP地址,如上面配置了3个IP即3个Cassandra节点 5. 10.10.13.220 10.10.13.220 本节点监听客户端数据和与其他服务器节点通信的IP地址,只能

7、为本机IP,且不能为127.0.0.1或localhost,否则与其他服务器不能建立正确交互 此处的IP地址也可以不填,即值为空,则所有的节点配置都一样,更方便部署。 搞定storage-conf.xml !下面的工作就是将所有的Cassandra服务器节点依次启动,通过日志就可以看到相关的节点连接上了,日志为: Log4j代码 1. INFO13:04:52,098Node/10.10.13.232isnowpartoftheclusterINFO 13:04:52,098 Node /10.10.13.232 is now part of the cluster到这里,Cassandra分

8、布式节点服务器的搭建就完成了。使用官网提供的客户端代码进行测试,发现数据已经提交到服务器并且在多个节点间进行复制了 在这里抱怨一下:之前由于没有足够的服务器,使用windowsXP+solaris双节点进行测试,发现怎么也建立不起来。后来加入linux后,solaris+linux的方式却能正常走通,配置也都是一样的。 有空研究下为何在我的windows上不支持。 参考地址: http:/cassandra.apache.org/ 如何安装和配置Cassandra 文章分类:数据库 Cassandra属于最近比较流行的一款NoSQL数据库,http:/nosql-database.org/中给

9、NoSQL的定义如下:下一代的数据库产品应该具备这几点:非关系型的,分布式的,开源的,可以线性扩展的。这类数据库最初的目的在于提供现代网站可扩展的数据库解决方案。这个运动开始于2009年初,目前正在迅速的发展。这种类型的数据库具有:自由的schema,数据多处备份,简单的编程API,数据的最终一致性保证等等。所以我们将这种类型的数据库称为NoSQL(不仅仅是SQL,全称为“not only sql”)。下面我们一起来看看如果分别在Windows和Linux环境下安装和部署Cassandra。在Windows上单机运行Cassandra大多数人使用的OS都是Windows,所以如果只是想简单地测

10、试一下Cassandra,我们可以直接在安装好JDK1.6的Windows系统上安装Cassandra,并进行简单的测试。1 下载Cassandra去http:/cassandra.apache.org/下载即可。目前最新的beta版本是0.6.0 b3,但是我们安装使用的最新的Release版本0.5.1。2 安装Cassandra将下载的压缩包解压,假设解压的位置是D:apache-cassandra-0.5.1。1 修改conf目录下的log4j.properties文件:log4j.appender.R.File=D:apache-cassandra-0.5.1logs2 修改conf

11、目录下的storage-conf.xml文件:D:apache-cassandra-0.5.1commitlog D:apache-cassandra-0.5.1data D:apache-cassandra-0.5.1callouts D:apache-cassandra-0.5.1staging3 设置系统的环境变量:CASSANDRA_HOME=D:apache-cassandra-0.5.13 启动Cassandra运行bin目录下的cassandra.bat。如果看到:INFO - Starting up server gossip,那么恭喜你,Cassandra已经在你的本机启动起

12、来了。4 使用命令行进行简单的测试运行bin目录下的cassandra-cli.bat。输入:connect localhost 9160,连接成功后可以看到下面的提示。cassandra connect localhost 9160 line 1:18 missing SLASH at 9160 Connected to localhost/9160然后,我们可以参考README.txt文件中提供的范例进行测试:cassandra set Keyspace1.Standard1jsmithfirst = John Value inserted. cassandra set Keyspace1

13、.Standard1jsmithlast = Smith Value inserted. cassandra set Keyspace1.Standard1jsmithage = 42 Value inserted. cassandra get Keyspace1.Standard1jsmith (column=age, value=42; timestamp=1249930062801) (column=first, value=John; timestamp=1249930053103) (column=last, value=Smith; timestamp=1249930058345)

14、 Returned 3 rows. cassandra你也可以根据这篇文章谈谈Cassandra的客户端中的内容测试一下如何使用Java编写简单的程序和Cassandra交互。在Linux上运行Cassandra集群如果需要真正在生产环境中使用Cassandra,我们需要搭建一个Cassandra集群,这样才能真正发挥出它作为NoSQL数据所应该具备的特性。在Linux部署Cassandra的步骤基本与Windows上部署的类似,我们需要在每一台机器上安装JDK1.6,然后下载Cassandra,并修改log4j.properties和storage-conf.xml的配置文件和设置环境变量。

15、不同的是,我们需要在storage-conf.xml文件中配置集群的信息:1 配置集群1 配置集群节点信息 hadoop2 hadoop3 hadoop4 hadoop5 hadoop6 hadoop7 hadoop8 hadoop9 hadoop10 2 配置集群节点之间交互的监听地址直接留空即可:3 配置Thrift Server监听的地址直接留空即可:4 配置集群的名称每一个集群的名称都应该是不用的5 开启节点自动加入集群的功能true6 配置数据的备份数37 调节Memory和Disk的性能需要根据实际的情况来配置,可以参考Wiki。2 运行Cassandra在每一台节点上,运行bin

16、/cassandra。如果看到:INFO - Starting up server gossip,说明启动成功。3 查看集群运行情况当所有的节点都运行起来以后,我们可以通过JMX查看运行状况:总结在Windows环境和Linux环境下部署Cassandra基本都是类似的。只不过在Linux环境下bin目录中的脚本都能在Linux环境下运行,而Windows环境下只有2个脚本可以运行。谈谈Cassandra的客户端 最近试用了一段时间Cassandra,将Oracle中的数据导入进来,遇到了问题然后解决问题,收获挺大。在这个过程中,除了设计一个合理的数据模型,再就是使用Cassandra API

17、进行交互了。Cassandra在设计的时候,就是支持Thrift的,这意味着我们可以使用多种语言开发。对于Cassandra的开发本身而言,这是使用Thrift的好处:支持多语言。坏处也是显而易见的:Thrift API功能过于简单,不具备在生产环境使用的条件。在Cassandra Wiki页面上,也有基于Thrift API开发的更加高级的API,各个语言都有,具体信息可以参考:http:/wiki.apache.org/cassandra/ClientExamples。这次只谈谈下面两类Java的客户端:1 Thrift Java API2 hectorThrift Java API这个是

18、Cassandra自带的最简单的一类API,这个文件在apache-cassandra-0.5.1.jar中包含了。可以直接使用。我们也可以自己安装一个Thrift,然后通过cassandra.thrift文件自动生成。如果你要使用Cassandra,那么我们必须要了解Thrift API,毕竟所有的其他更加高级的API都是基于这个来包装的。提供的功能插入数据插入数据需要指定keyspace,ColumnFamily, Column,Key,Value,timestamp和数据同步级别。(如何需要了Cassandra的解数据模型,可以参考大话Cassandra数据模型)/* * Insert

19、a Column consisting of (column_path.column, value, timestamp) at the given column_path.column_family and optional * column_path.super_column. Note that column_path.column is here required, since a SuperColumn cannot directly contain binary * values - it can only contain sub-Columns. * * param keyspa

20、ce * param key * param column_path * param value * param timestamp * param consistency_level */public void insert(String keyspace, String key, ColumnPath column_path, byte value, long timestamp, int consistency_level) throws InvalidRequestException, UnavailableException, TimedOutException, TExceptio

21、n;/* * Insert Columns or SuperColumns across different Column Families for the same row key. batch_mutation is a * mapstring, list - a map which pairs column family names with the relevant ColumnOrSuperColumn * objects to insert. * * param keyspace * param key * param cfmap * param consistency_level

22、 */public void batch_insert(String keyspace, String key, MapString,List cfmap, int consistency_level) throws InvalidRequestException, UnavailableException, TimedOutException, TException;读取数据获取一个查询条件精确的值。/* * Get the Column or SuperColumn at the given column_path. If no value is present, NotFoundExce

23、ption is thrown. (This is * the only method that can throw an exception under non-failure conditions.) * * param keyspace * param key * param column_path * param consistency_level */public ColumnOrSuperColumn get(String keyspace, String key, ColumnPath column_path, int consistency_level) throws Inva

24、lidRequestException, NotFoundException, UnavailableException, TimedOutException, TException;/* * Perform a get for column_path in parallel on the given list keys. The return value maps keys to the * ColumnOrSuperColumn found. If no value corresponding to a key is present, the key will still be in th

25、e map, but both * the column and super_column references of the ColumnOrSuperColumn object it maps to will be null. * * param keyspace * param keys * param column_path * param consistency_level */public Map multiget(String keyspace, List keys, ColumnPath column_path, int consistency_level) throws In

26、validRequestException, UnavailableException, TimedOutException, TException;获取某一个keyspace,Key,ColumnFamily,SuperColumn(如果有的话需要指定)下面的相关数据:只查询Column的name符合条件的相关数据(SlicePredicate)。/* * Get the group of columns contained by column_parent (either a ColumnFamily name or a ColumnFamily/SuperColumn name * pa

27、ir) specified by the given SlicePredicate. If no matching values are found, an empty list is returned. * * param keyspace * param key * param column_parent * param predicate * param consistency_level */public List get_slice(String keyspace, String key, ColumnParent column_parent, SlicePredicate pred

28、icate, int consistency_level) throws InvalidRequestException, UnavailableException, TimedOutException, TException;/* * Performs a get_slice for column_parent and predicate for the given keys in parallel. * * param keyspace * param keys * param column_parent * param predicate * param consistency_leve

29、l */public MapString,List multiget_slice(String keyspace, List keys, ColumnParent column_parent, SlicePredicate predicate, int consistency_level) throws InvalidRequestException, UnavailableException, TimedOutException, TException;查询Key的取值范围(使用这个功能需要使用order-preserving partitioner)。/* * deprecated; us

30、e get_range_slice instead * * param keyspace * param column_family * param start * param finish * param count * param consistency_level */public List get_key_range(String keyspace, String column_family, String start, String finish, int count, int consistency_level) throws InvalidRequestException, Un

31、availableException, TimedOutException, TException;/* * returns a subset of columns for a range of keys. * * param keyspace * param column_parent * param predicate * param start_key * param finish_key * param row_count * param consistency_level */public List get_range_slice(String keyspace, ColumnPar

32、ent column_parent, SlicePredicate predicate, String start_key, String finish_key, int row_count, int consistency_level) throws InvalidRequestException, UnavailableException, TimedOutException, TException;查询系统的信息。/* * get property whose value is of type string. * * param property */public String get_

33、string_property(String property) throws TException;/* * get property whose value is list of strings. * * param property */public List get_string_list_property(String property) throws TException;/* * describe specified keyspace * * param keyspace */public MapString,Map describe_keyspace(String keyspa

34、ce) throws NotFoundException, TException;通过这些操作,我们可以了解到系统的信息。其中一个比较有意思的查询信息是:token map,通过这个我们可以知道哪些Cassandra Service是可以提供服务的。删除数据/* * Remove data from the row specified by key at the granularity specified by column_path, and the given timestamp. Note * that all the values in column_path besides colu

35、mn_path.column_family are truly optional: you can remove the entire * row by just specifying the ColumnFamily, or you can remove a SuperColumn or a single Column by specifying those levels too. * * param keyspace * param key * param column_path * param timestamp * param consistency_level */public vo

36、id remove(String keyspace, String key, ColumnPath column_path, long timestamp, int consistency_level) throws InvalidRequestException, UnavailableException, TimedOutException, TException;这里需要注意的是,由于一致性的问题。这里的删除操作不会立即删除所有机器上的该数据,但是最终会一致。程序范例import java.util.List;import java.io.UnsupportedEncodingExcep

37、tion;import org.apache.thrift.transport.TTransport;import org.apache.thrift.transport.TSocket;import org.apache.thrift.protocol.TProtocol;import org.apache.thrift.protocol.TBinaryProtocol;import org.apache.thrift.TException;import org.apache.cassandra.service.*;public class CClient public static voi

38、d main(String args) throws TException, InvalidRequestException, UnavailableException, UnsupportedEncodingException, NotFoundException TTransport tr = new TSocket(localhost, 9160); TProtocol proto = new TBinaryProtocol(tr); Cassandra.Client client = new Cassandra.Client(proto); tr.open(); String key_

39、user_id = 逖靖寒的世界; / insert data long timestamp = System.currentTimeMillis(); client.insert(Keyspace1, key_user_id, new ColumnPath(Standard1, null, 网址.getBytes(UTF-8), .getBytes(UTF-8), timestamp, ConsistencyLevel.ONE); client.insert(Keyspace1, key_user_id, new ColumnPath(Standard1, null, 作者.getBytes

40、(UTF-8), 逖靖寒.getBytes(UTF-8), timestamp, ConsistencyLevel.ONE); / read single column ColumnPath path = new ColumnPath(Standard1, null, name.getBytes(UTF-8); System.out.println(client.get(Keyspace1, key_user_id, path, ConsistencyLevel.ONE); / read entire row SlicePredicate predicate = new SlicePredic

41、ate(null, new SliceRange(new byte0, new byte0, false, 10); ColumnParent parent = new ColumnParent(Standard1, null); List results = client.get_slice(Keyspace1, key_user_id, parent, predicate, ConsistencyLevel.ONE); for (ColumnOrSuperColumn result : results) Column column = result.column; System.out.println(new String(column.name, UTF-8) + - + new String(column.value, UTF-8); tr.close(); 优点与缺点优点:简单高效缺点:功能简单,无法提供连接池,错误处理等功能,不适合直接在生产环境使用。HectorHector是基于Thrift Java

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 教育教学 > 成人教育


备案号:宁ICP备20000045号-2

经营许可证:宁B2-20210002

宁公网安备 64010402000987号