Apache Cassandra   Apache Cassandra 是一套开源分布式数据库管理系统。它最初由 Facebook 开发,用于储存特别大的数据。主要特性:  ● 分布式  ● 于 column 的结构化  ● 高伸展性   Ca...
Cassandra 分布式节点服务器的简单部署文章分类 :数据库Cassandra 作为目前很热门的一个 NOSQL 型数据库,引起了很多的关注。 NOSQL 感兴趣                                       ...
搞定 storage-conf.xml !下面的工作就是将所有的 Cassandra 服务器节点依次启动,通过日志就可以看到相关的节点连接上了,日志为:Log4j 代码    1. INFO 13:04:52,098 Node /10.10.1...
在 Windows 上单机运行 Cassandra大多数人使用的 OS 都是 Windows,所以如果只是想简单地测试一下Cassandra,我们可以直接在安装好 JDK1.6 的 Windows 系统上安装 Cassandra,并进行简单的测...
3 设置系统的环境变量:CASSANDRA_HOME=D:apache-cassandra-0.5.13 启动 Cassandra运行 bin 目录下的 cassandra.bat。如果看到:INFO - Starting up serverg...
在 Linux 上运行 Cassandra 集群如果需要真正在生产环境中使用 Cassandra,我们需要搭建一个 Cassandra 集群,这样才能真正发挥出它作为 NoSQL 数据所应该具备的特性。在 Linux 部署 Cassandra ...
3 配置 Thrift Server 监听的地址直接留空即可:<ThriftAddress></ThriftAddress>4 配置集群的名称每一个集群的名称都应该是不用的<ClusterName>gpcuster.cnblogs.com</C...
3 查看集群运行情况当所有的节点都运行起来以后,我们可以通过 JMX 查看运行状况:总结在 Windows 环境和 Linux 环境下部署 Cassandra 基本都是类似的。只不过在Linux 环境下 bin 目录中的脚本都能在 Linux ...
Thrift Java API这个是 Cassandra 自带的最简单的一类 API,这个文件在 apache-cassandra-0.5.1.jar 中包含了。可以直接使用。我们也可以自己安装一个 Thrift,然后通过 cassandra....
* @param consistency_level */public void batch_insert(String keyspace, String key,Map<String,List<ColumnOrSuperColumn>> cf...
/** * Get the group of columns contained by column_parent (either a ColumnFamily name ora ColumnFamily/SuperColumn name * ...
public List<String> get_key_range(String keyspace, String column_family, String start,String finish, int count, int consis...
通过这些操作,我们可以了解到系统的信息。其中一个比较有意思的查询信息是:token map,通过这个我们可以知道哪些 Cassandra Service 是可以提供服务的。删除数据/** * Remove data from the row s...
throws TException, InvalidRequestException, UnavailableException,UnsupportedEncodingException, NotFoundException   {      ...
}}优点与缺点优点:简单高效缺点:功能简单,无法提供连接池,错误处理等功能,不适合直接在生产环境使用。HectorHector 是基于 Thrift Java API 包装的一个 Java 客户端,提供一个更加高级的一个抽象。程序范例packa...
System.out.println("Read from cassandra: " + string(col.getValue()));        } finally {            // return client to po...
Linux 下如何设置环境变量,今天总结了一下,发出来和大家分享一下,希望对大家的学习有所帮助,不多说了,看具体怎么操作了...1、总结背景在 linux 系统下,下载并安装了应用程序,很有可能在键入它的名称时出现“command notfou...
些配置文件包含两组不同的变量:shell 变量和环境变量。前者只是在特定的 shell 中固定(如 bash),后者在不同 shell 中固定。很明显,shell 变量是局部的,而环境变量是全局的。环境变量是通过 Shell 命令来设置的,设置...
my name is Kevin3.修改已存在的环境变量接上个示例$ MYNAME=”change name to jack”$ echo $MYNAMEchange name to jack4.使用 env 命令显示所有的环境变量$ envH...
SSH_CLIENT=192.168.136.151 1740 22QTDIR=/usr/lib/qt-3.1SSH_TTY=/dev/pts/0……5.使用 set 命令显示所有本地定义的 Shell 变量$ setBASH=/bin/bas...
TEMP_KEVIN=kevin #证明环境变量 TEMP_KEVIN 已经存在$ unset TEMP_KEVIN          #删除环境变量 TEMP_KEVIN$ env | grep TEMP_KEVIN      #查看环境变量...
$ TEMP_KEVIN ="tom"      #修改变量值为 tom 会提示此变量只读不能被修改-bash: TEMP_KEVIN: readonly variable8.通过修改环境变量定义文件来修改环境变量。需要注意的是,一般情况下,仅...
环境变量更改后,在用户下次登陆时生效。如果想立刻生效,则可执行下面的语句:$source .bash_profile需要注意的是,最好不要把当前路径”./”放到 PATH 里,这样可能会受到意想不到的攻击。完成后,可以通过$ echo $PAT...
用 VI 在文件/etc/profile 文件中增加变量,该变量将会对 Linux 下所有用户有效,并且是“永久的”。例如:编辑/etc/profile 文件,添加 CLASSPATH 变量# vi /etc/profileexport CLA...
export CLASSPATH=./JAVA_HOME/lib;$JAVA_HOME/jre/lib注:修改文件后要想马上生效还要运行$ source /home/guok/.bash_profile 不然只能在下次重进此用户时生效。3.  ...
资源http://cassandra.apache.org/http://wiki.apache.org/cassandra/FrontPage部署http://kauu.net/2010/02/27/cassandra%E5%88%9D%E4...
Super columnsSuper columns are a great way to store one-to-many indexes to other records: makethe sub column names Time...
动态创建 Column Falimy,在不重启服务器下http://github.com/NZKoz/cassandra_object启动单个节点的 Cluster安装 JDK 6 tar -zxvf cassandra-$VERSION.tg...
Returned 3 rows. cassandra>Java 客户端原始 Thrifthttp://apache.freelamp.com/incubator/thrift/0.2.0-incubating/thrift-0.2.0-i...
Git 客户端http://msysgit.googlecode.com/files/msysGit-fullinstall-1.7.0.2-preview20100309.exeD:7gPersonalResourcesArchitectur...
OCM 的使用定义数据结构:D:7gPersonalResourcesArchitectureCassandraClientOCMCompilerOCMSpecSample.txt通过 com.kissintellignetsyst...
BMT/blob/master/src/java/org/digg/CassandraBulkLoader.javahttp://blog.csdn.net/wdwbw/archive/2010/03/10/5366739.aspxhttp:/...
1: {     // 这是一个 SuperColumn  2:       name: "逖靖寒的世界",  3:       // 包含一系列的 Columns  4:       value: {  5:            stree...
Super 类型的 ColumnFamily 包含了一系列的 SuperColumn,但是并不能像 SuperColumn 那样包含一系列 Standard ColumnFamily。这是一个简单的例子:1: AddressBook = { /...
接下来,我们执行查询操作:cassandra> get Keyspace1.Standard1[jsmith] (column=age, value=42; timestamp=1249930062801) (column=first, val...
{name: 3, value: "101010101010"},{name: 123, value: "hello there"},{name: 976, value: "kjjkbcjkcbbd"},{name: 832416, value...
}}然后我们定义 CompareSubcolumnsWith 和 CompareWith 的排序类型都是 UTF8Type,那么排序后的结果为:{    // this ones first b/c when treated as UTF8 s...
Upcoming SlideShare
Loading in …5
×

Cassandra的初步使用及一些简单的操作

6,605 views
6,393 views

Published on

china

Published in: Technology
0 Comments
1 Like
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total views
6,605
On SlideShare
0
From Embeds
0
Number of Embeds
2
Actions
Shares
0
Downloads
118
Comments
0
Likes
1
Embeds 0
No embeds

No notes for slide

Cassandra的初步使用及一些简单的操作

  1. 1. Apache Cassandra   Apache Cassandra 是一套开源分布式数据库管理系统。它最初由 Facebook 开发,用于储存特别大的数据。主要特性:  ● 分布式  ● 于 column 的结构化 ● 高伸展性   Cassandra 是一个混合型的非关系的数据库,类似于 Google 的BigTable 。Cassandra 的主要特点就是它不是一个数据库,而是由一堆数据库节点共同构成的一个分布式网络服务,对 Cassandra 的一个写操作,会被复制到其它节点上去,对 Cassandra 的读操作,也会被路由到某个节点上面去读取。对于一个 Cassandra 群集来说,扩展性能是比较简单的事情,只管在群集里面添加节点就可以了。   Cassandra 的主要功能比 Dynamo (分布式的 Key-Value 存 储系统)更丰富,但支持度却不如文档存储 MongoDB (介于关系数据库和非关系数据库之间的开源产品,是非关系数据库当中功能最丰富,最像关系数据库的。支持的数据结构非常松散,是类似 json 的 bjson 格式,因此可以存储比较复杂的数据类型。) Cassandra 最初由 Facebook 开发,后转变成了开源项目。它是一个网络社交云计算方面理想的数据库。以 Amazon 专有的完全分布式的 Dynamo 为基础,结合了Google BigTable 基于列族( Column Family )的数据模型。P2P 去中心化的存储。很多方面都可以称之为 Dynamo 2.0 。  和其它数据库比较, Cassandra 有三个突出特点:  ■ 模式灵活 :使用 Cassandra ,像文档存储,你不必提前解决记录中的字段。你可以在系统运行时随意的添加或移除字段。这是一个惊人的效率提升,特别是在大型部署上。  ■ 真正的可扩展性 : Cassandra 是纯粹意义上的水平扩展。为给集群添加更多容量,可以指向另一台计算机。你不必重启任何进程,改变应用查询,或手动迁移任何数据。  ■ 多数据中心识别 :你可以调整你的节点布局来避免某一个数据中心起火,一个备用的数据中心将至少有每条记录的完全复制。  一些使 Cassandra 提高竞争力的其它功能:  ■ 范围查询 :如果你不喜欢全部的键值查询,则可以设置键的范围来查询。  ■ 列表数据结构 :在混合模式可以将超级列添加到 5 维。 对于每个用户的索引,这是非常方便的。  ■ 分布式写操作 :有可以在任何地方任何时间集中读或写任何数据。 并且不会有任何单点失败。
  2. 2. Cassandra 分布式节点服务器的简单部署文章分类 :数据库Cassandra 作为目前很热门的一个 NOSQL 型数据库,引起了很多的关注。 NOSQL 感兴趣 对的 我 , 也 来 作 了 一 次 简 单 的 测 试 。废 话 不 多 说 , 下 面 就 来 介 绍 下 Cassandra 多 节 点 的 部 署 。部 署 要 求 :1. JDK1.62. OS : linux ,我在 windows 上实验过,不知道为啥一直没通( 7000 端口上只有 windows的 发 包 , 双 方 不 互 相 通 信 )3. cassandra 0.6OK,基本的东西都有了,进入到 cassandra 的目录,首先需要修改一些相关的文件路径:1. log4j.properties 文 件 输 出 路 径 修 改2. storage-conf.xml CommitLogDirectory 和 DataFileDirectory 路 径 修 改接 着 进 行 分 布 式 节 点 的 配 置 , 还 是 修 改 torage-conf.xml :1. <ClusterName>Test Cluster</ClusterName> 这个要求所有节点的名字都相同,如果不相同,则报类似 AName != BName 的错误2. <ColumnFamily Name="Standard1" CompareWith="BytesType"/> 配置 ColumnFamily 的一些属性,其中 name 是所要使用的 ColumnFamily 名称,可以多个,客户端做 CRUD 操作时需要指定。注意所有的节点配置都需要一样(我就曾因配置不一 致 出 过 ClassCastException 的 异 常 )3. <ReplicationFactor>2</ReplicationFactor> 配置数据需要复制的数量,复制的策略分 RackUnawareStrategy 和 RackAwareStrategy 两种 方 式 ( 策 略 没 细 看 不 再 描 述 )4. <Seeds> <Seed>10.10.13.220</Seed> <Seed>10.10.13.181</Seed> <Seed>10.10.13.232</Seed> </Seeds> 这个是所有分布式服务器节点的 IP 地址,如上面配置了 3 个 IP 即 3 个 Cassandra 节点5. <ListenAddress>10.10.13.220</ListenAddress> <ThriftAddress>10.10.13.220</ThriftAddress> 本节点监听客户端数据和与其他服务器节点通信的 IP 地址,只能为本机 IP,且不能为127.0.0.1 或 localhost , 否 则 与 其 他 服 务 器 不 能 建 立 正 确 交 互 此处的 IP 地址也可以不填,即值为空,则所有的节点配置都一样,更方便部署。
  3. 3. 搞定 storage-conf.xml !下面的工作就是将所有的 Cassandra 服务器节点依次启动,通过日志就可以看到相关的节点连接上了,日志为:Log4j 代码 1. INFO 13:04:52,098 Node /10.10.13.232 is now part of the cluster到这里,Cassandra 分布式节点服务器的搭建就完成了。使用官网提供的客户端代码进行测试 ,发 现数据已经提交到服务 器并且在多个节点间进行复制了在这里抱怨一下:之前由于没有足够的服务器,使用 windowsXP+solaris 双节点进行测试, 。 后来加 入 linux 后,solaris+linux 的方式却能正常走通,配置也都发现怎么也建立不起来 。是 一 样 的 。有 空 研 究 下 为 何 在 我 的 windows 上 不 支 持 。 。 。 。参 考 地 址 :http://cassandra.apache.org/如何安装和配置 Cassandra文章分类 :数据库Cassandra 属于最近比较流行的一款 NoSQL 数据库,http://nosql-database.org/中给 NoSQL 的定义如下:下一代的数据库产品应该具备这几点:非关系型的,分布式的,开源的,可以线性扩展的。这类数据库最初的目的在于提供现代网站可扩展的数据库解决方案。 这个运动开始于 2009 年初,目前正在迅速的发展。这种类型的数据库具有:自由的 schema,数据多处备份,简单的编程 API,数据的最终一致性保证等等。所以我们将这种类型的数据库称为 NoSQL(不仅仅是 SQL,全称为“not only sql”)。下面我们一起来看看如果分别在 Windows 和 Linux 环境下安装和部署Cassandra。
  4. 4. 在 Windows 上单机运行 Cassandra大多数人使用的 OS 都是 Windows,所以如果只是想简单地测试一下Cassandra,我们可以直接在安装好 JDK1.6 的 Windows 系统上安装 Cassandra,并进行简单的测试。1 下载 Cassandra去 http://cassandra.apache.org/下载即可。目前最新的 beta 版本是 0.6.0b3,但是我们安装使用的最新的 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 目录下的 storage-conf.xml 文件:<CommitLogDirectory>D:apache-cassandra-0.5.1commitlog</CommitLogDirectory><DataFileDirectories> <DataFileDirectory>D:apache-cassandra-0.5.1data</DataFileDirectory></DataFileDirectories><CalloutLocation>D:apache-cassandra-0.5.1callouts</CalloutLocation><StagingFileDirectory>D:apache-cassandra-0.5.1staging</StagingFileDirectory>
  5. 5. 3 设置系统的环境变量:CASSANDRA_HOME=D:apache-cassandra-0.5.13 启动 Cassandra运行 bin 目录下的 cassandra.bat。如果看到:INFO - Starting up servergossip,那么恭喜你,Cassandra 已经在你的本机启动起来了。4 使用命令行进行简单的测试运行 bin 目录下的 cassandra-cli.bat。输入:connect localhost 9160,连接成功后可以看到下面的提示。cassandra> connect localhost 9160line 1:18 missing SLASH at 9160Connected to localhost/9160然后,我们可以参考 README.txt 文件中提供的范例进行测试:cassandra> set Keyspace1.Standard1[jsmith][first] = JohnValue inserted.cassandra> set Keyspace1.Standard1[jsmith][last] = SmithValue inserted.cassandra> set Keyspace1.Standard1[jsmith][age] = 42Value inserted.cassandra> get Keyspace1.Standard1[jsmith] (column=age, value=42; timestamp=1249930062801) (column=first, value=John; timestamp=1249930053103) (column=last, value=Smith; timestamp=1249930058345)Returned 3 rows.cassandra>你也可以根据这篇文章《谈谈 Cassandra 的客户端》中的内容测试一下如何使用Java 编写简单的程序和 Cassandra 交互。
  6. 6. 在 Linux 上运行 Cassandra 集群如果需要真正在生产环境中使用 Cassandra,我们需要搭建一个 Cassandra 集群,这样才能真正发挥出它作为 NoSQL 数据所应该具备的特性。在 Linux 部署 Cassandra 的步骤基本与 Windows 上部署的类似,我们需要在每一台机器上安装 JDK1.6,然后下载 Cassandra,并修改 log4j.properties 和storage-conf.xml 的配置文件和设置环境变量。不同的是,我们需要在storage-conf.xml 文件中配置集群的信息:1 配置集群1 配置集群节点信息<Seeds> <Seed>hadoop2</Seed> <Seed>hadoop3</Seed> <Seed>hadoop4</Seed> <Seed>hadoop5</Seed> <Seed>hadoop6</Seed> <Seed>hadoop7</Seed> <Seed>hadoop8</Seed> <Seed>hadoop9</Seed> <Seed>hadoop10</Seed> </Seeds>2 配置集群节点之间交互的监听地址直接留空即可:<ListenAddress></ListenAddress>
  7. 7. 3 配置 Thrift Server 监听的地址直接留空即可:<ThriftAddress></ThriftAddress>4 配置集群的名称每一个集群的名称都应该是不用的<ClusterName>gpcuster.cnblogs.com</ClusterName>5 开启节点自动加入集群的功能<AutoBootstrap>true</AutoBootstrap>6 配置数据的备份数<ReplicationFactor>3</ReplicationFactor>7 调节 Memory 和 Disk 的性能需要根据实际的情况来配置,可以参考 Wiki。2 运行 Cassandra在每一台节点上,运行 bin/cassandra。如果看到:INFO - Starting upserver gossip,说明启动成功。
  8. 8. 3 查看集群运行情况当所有的节点都运行起来以后,我们可以通过 JMX 查看运行状况:总结在 Windows 环境和 Linux 环境下部署 Cassandra 基本都是类似的。只不过在Linux 环境下 bin 目录中的脚本都能在 Linux 环境下运行,而 Windows 环境下只有 2 个脚本可以运行。谈谈 Cassandra 的客户端最近试用了一段时间 Cassandra,将 Oracle 中的数据导入进来,遇到了问题然后解决问题,收获挺大。在这个过程中,除了设计一个合理的数据模型,再就是使用 Cassandra API 进行交互了。Cassandra 在设计的时候,就是支持 Thrift 的,这意味着我们可以使用多种语言开发。对于 Cassandra 的开发本身而言,这是使用 Thrift 的好处:支持多语言。坏处也是显而易见的:ThriftAPI 功能过于简单,不具备在生产环境使用的条件。在 Cassandra Wiki 页面上,也有基于 Thrift API 开发的更加高级的 API,各个语言都有,具体信息可以参考:http://wiki.apache.org/cassandra/ClientExamples。这次只谈谈下面两类 Java 的客户端:1 Thrift Java API2 hector
  9. 9. Thrift Java API这个是 Cassandra 自带的最简单的一类 API,这个文件在 apache-cassandra-0.5.1.jar 中包含了。可以直接使用。我们也可以自己安装一个 Thrift,然后通过 cassandra.thrift 文件自动生成。如果你要使用 Cassandra,那么我们必须要了解 Thrift API,毕竟所有的其他更加高级的 API 都是基于这个来包装的。提供的功能插入数据插入数据需要指定 keyspace,ColumnFamily, Column,Key,Value,timestamp 和数据同步级别。(如何需要了 Cassandra 的解数据模型,可以参考《大话 Cassandra 数据模型》)/** * Insert a Column consisting of (column_path.column, value, timestamp) at the givencolumn_path.column_family and optional * column_path.super_column. Note that column_path.column is here required, since aSuperColumn cannot directly contain binary * values -- it can only contain sub-Columns. * * @param keyspace * @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, TException;/** * Insert Columns or SuperColumns across different Column Families for the same rowkey. batch_mutation is a * map<string, list<ColumnOrSuperColumn>> -- a map which pairs column family nameswith the relevant ColumnOrSuperColumn * objects to insert. * * @param keyspace * @param key * @param cfmap
  10. 10. * @param consistency_level */public void batch_insert(String keyspace, String key,Map<String,List<ColumnOrSuperColumn>> cfmap, int consistency_level) throwsInvalidRequestException, UnavailableException, TimedOutException, TException;读取数据获取一个查询条件精确的值。/** * Get the Column or SuperColumn at the given column_path. If no value is present,NotFoundException 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 InvalidRequestException, NotFoundException,UnavailableException, TimedOutException, TException;/** * Perform a get for column_path in parallel on the given list<string> keys. Thereturn value maps keys to the * ColumnOrSuperColumn found. If no value corresponding to a key is present, the keywill still be in the map, but both * the column and super_column references of the ColumnOrSuperColumn object it maps towill be null. * * @param keyspace * @param keys * @param column_path * @param consistency_level */public Map<String,ColumnOrSuperColumn> multiget(String keyspace, List<String> keys,ColumnPath column_path, int consistency_level) throws InvalidRequestException,UnavailableException, TimedOutException, TException;获取某一个 keyspace,Key,ColumnFamily,SuperColumn(如果有的话需要指定)下面的相关数据:只查询 Column 的 name 符合条件的相关数据(SlicePredicate)。
  11. 11. /** * Get the group of columns contained by column_parent (either a ColumnFamily name ora ColumnFamily/SuperColumn name * pair) specified by the given SlicePredicate. If no matching values are found, anempty list is returned. * * @param keyspace * @param key * @param column_parent * @param predicate * @param consistency_level */public List<ColumnOrSuperColumn> get_slice(String keyspace, String key, ColumnParentcolumn_parent, SlicePredicate predicate, int consistency_level) throwsInvalidRequestException, UnavailableException, TimedOutException, TException;/** * Performs a get_slice for column_parent and predicate for the given keys inparallel. * * @param keyspace * @param keys * @param column_parent * @param predicate * @param consistency_level */public Map<String,List<ColumnOrSuperColumn>> multiget_slice(String keyspace,List<String> keys, ColumnParent column_parent, SlicePredicate predicate, intconsistency_level) throws InvalidRequestException, UnavailableException,TimedOutException, TException;查询 Key 的取值范围(使用这个功能需要使用 order-preserving partitioner)。/** * @deprecated; use get_range_slice instead * * @param keyspace * @param column_family * @param start * @param finish * @param count * @param consistency_level */
  12. 12. public List<String> get_key_range(String keyspace, String column_family, String start,String finish, int count, int consistency_level) throws InvalidRequestException,UnavailableException, 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<KeySlice> get_range_slice(String keyspace, ColumnParent column_parent,SlicePredicate predicate, String start_key, String finish_key, int row_count, intconsistency_level) throws InvalidRequestException, UnavailableException,TimedOutException, TException;查询系统的信息。/** * get property whose value is of type string. * * @param property */public String get_string_property(String property) throws TException;/** * get property whose value is list of strings. * * @param property */public List<String> get_string_list_property(String property) throws TException;/** * describe specified keyspace * * @param keyspace */public Map<String,Map<String,String>> describe_keyspace(String keyspace) throwsNotFoundException, TException;
  13. 13. 通过这些操作,我们可以了解到系统的信息。其中一个比较有意思的查询信息是:token map,通过这个我们可以知道哪些 Cassandra Service 是可以提供服务的。删除数据/** * Remove data from the row specified by key at the granularity specified bycolumn_path, and the given timestamp. Note * that all the values in column_path besides column_path.column_family are trulyoptional: you can remove the entire * row by just specifying the ColumnFamily, or you can remove a SuperColumn or asingle Column by specifying those levels too. * * @param keyspace * @param key * @param column_path * @param timestamp * @param consistency_level */public void remove(String keyspace, String key, ColumnPath column_path, longtimestamp, int consistency_level) throws InvalidRequestException,UnavailableException, TimedOutException, TException;这里需要注意的是,由于一致性的问题。这里的删除操作不会立即删除所有机器上的该数据,但是最终会一致。程序范例import java.util.List;import java.io.UnsupportedEncodingException;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 void main(String[] args)
  14. 14. 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_user_id = "逖靖寒的世界"; // insert data long timestamp = System.currentTimeMillis(); client.insert("Keyspace1", key_user_id, new ColumnPath("Standard1", null, "网址".getBytes("UTF-8")), "http://gpcuster.cnblogs.com".getBytes("UTF-8"), timestamp, ConsistencyLevel.ONE); client.insert("Keyspace1", key_user_id, new ColumnPath("Standard1", null, "作者".getBytes("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 SlicePredicate(null, new SliceRange(newbyte[0], new byte[0], false, 10)); ColumnParent parent = new ColumnParent("Standard1", null); List<ColumnOrSuperColumn> 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") + " -> " + newString(column.value, "UTF-8")); } tr.close();
  15. 15. }}优点与缺点优点:简单高效缺点:功能简单,无法提供连接池,错误处理等功能,不适合直接在生产环境使用。HectorHector 是基于 Thrift Java API 包装的一个 Java 客户端,提供一个更加高级的一个抽象。程序范例package me.prettyprint.cassandra.service;import static me.prettyprint.cassandra.utils.StringUtils.bytes;import static me.prettyprint.cassandra.utils.StringUtils.string;import org.apache.cassandra.service.Column;import org.apache.cassandra.service.ColumnPath;public class ExampleClient { public static void main(String[] args) throws IllegalStateException,PoolExhaustedException, Exception { CassandraClientPool pool = CassandraClientPoolFactory.INSTANCE.get(); CassandraClient client = pool.borrowClient("localhost", 9160); // A load balanced version would look like this: // CassandraClient client = pool.borrowClient(new String[] {"cas1:9160","cas2:9160", "cas3:9160"}); try { Keyspace keyspace = client.getKeyspace("Keyspace1"); ColumnPath columnPath = new ColumnPath("Standard1", null, bytes("网址")); // insert keyspace.insert("逖靖寒的世界", columnPath, bytes("http://gpcuster.cnblogs.com")); // read Column col = keyspace.getColumn("逖靖寒的世界", columnPath);
  16. 16. System.out.println("Read from cassandra: " + string(col.getValue())); } finally { // return client to pool. do it in a finally block to make sure its executed pool.releaseClient(client); } }}优点1 提供连接池。2 提 供 错 误 处 理 : 当 操 作 失 败 的 时 候 , Hector 会 根 据 系 统 信 息 ( token map ) 自 动 连 接 另 一 个Cassandra Service。3 编程接口容易使用。4 支持 JMX。缺点1 不支持多线程的环境。2 keyspace 封装过多(数据校验和数据重新封装),如果进行大量的数据操作,这里的消耗需要考虑。3 错误处理不够人性化:如果所有的 Cassandra Service 都非常繁忙,那么经过多次操作失败后,最终的结果失败。总结Hector 已经是一个基本足够使用的 Java 客户端了,但是还是缺乏一些相关的功能,比如:1 线程安全。2 支持自动的多线程查询和插入,提高操作效率。3 人性化的错误处理机制。4 避免过多的封装。
  17. 17. Linux 下如何设置环境变量,今天总结了一下,发出来和大家分享一下,希望对大家的学习有所帮助,不多说了,看具体怎么操作了...1、总结背景在 linux 系统下,下载并安装了应用程序,很有可能在键入它的名称时出现“command notfound”的提示内容。每次都到安装目标文件夹内,找到可执行文件来进行操作就太繁琐了。这涉及到环境变量 PATH 的设置问题,而 PATH 的设置也是在 linux 下定制环境变量的一个组成部分。案例基于 RedHat AS4 讲解环境变量定制的问题。2、变量简介Linux 是一个多用户的操作系统。每个用户登录系统后,都会有一个专用的运行环境。通常每个用户默认的环境都是相同的,这个默认环境实际上就是一组环境变量的定义。用户可以对自己的运行环境进行定制,其方法就是修改相应的系统环境变量。3、定制环境变量环境变量是和 Shell 紧密相关的,用户登录系统后就启动了一个 Shell。对于 Linux 来说一般是 bash,但也可以重新设定或切换到其它的 Shell(使用 chsh 命令)。根据发行版本的情况,bash 有两个基本的系统级配置文件:/etc/bashrc 和/etc/profile。这
  18. 18. 些配置文件包含两组不同的变量:shell 变量和环境变量。前者只是在特定的 shell 中固定(如 bash),后者在不同 shell 中固定。很明显,shell 变量是局部的,而环境变量是全局的。环境变量是通过 Shell 命令来设置的,设置好的环境变量又可以被所有当前用户所运行的程序所使用。对于 bash 这个 Shell 程序来说,可以通过变量名来访问相应的环境变量,通过 export 来设置环境变量。注:Linux 的环境变量名称一般使用大写字母4、环境变量设置实例1.使用命令 echo 显示环境变量本例使用 echo 显示常见的变量 HOME$ echo $HOME/home/kevin2.设置一个新的环境变量$ export MYNAME=”my name is kevin”$ echo $ MYNAME
  19. 19. my name is Kevin3.修改已存在的环境变量接上个示例$ MYNAME=”change name to jack”$ echo $MYNAMEchange name to jack4.使用 env 命令显示所有的环境变量$ envHOSTNAME=localhost.localdomainSHELL=/bin/bashTERM=xtermHISTSIZE=1000
  20. 20. SSH_CLIENT=192.168.136.151 1740 22QTDIR=/usr/lib/qt-3.1SSH_TTY=/dev/pts/0……5.使用 set 命令显示所有本地定义的 Shell 变量$ setBASH=/bin/bashBASH_ENV=/root/.bashrc……6.使用 unset 命令来清除环境变量$ export TEMP_KEVIN=”kevin” #增加一个环境变量 TEMP_KEVIN$ env | grep TEMP_KEVIN #查看环境变量 TEMP_KEVIN 是否生效(存在即生效)
  21. 21. TEMP_KEVIN=kevin #证明环境变量 TEMP_KEVIN 已经存在$ unset TEMP_KEVIN #删除环境变量 TEMP_KEVIN$ env | grep TEMP_KEVIN #查看环境变量 TEMP_KEVIN 是否被删除,没有输出显示,证明 TEMP_KEVIN 被清除了。7.使用 readonly 命令设置只读变量注:如果使用了 readonly 命令的话,变量就不可以被修改或清除了。$ export TEMP_KEVIN ="kevin" #增加一个环境变量 TEMP_KEVIN$ readonly TEMP_KEVIN #将环境变量 TEMP_KEVIN 设为只读$ env | grep TEMP_KEVIN #查看环境变量 TEMP_KEVIN 是否生效TEMP_KEVIN=kevin #证明环境变量 TEMP_KEVIN 已经存在$ unset TEMP_KEVIN #会提示此变量只读不能被删除-bash: unset: TEMP_KEVIN: cannot unset: readonly variable
  22. 22. $ TEMP_KEVIN ="tom" #修改变量值为 tom 会提示此变量只读不能被修改-bash: TEMP_KEVIN: readonly variable8.通过修改环境变量定义文件来修改环境变量。需要注意的是,一般情况下,仅修改普通用户环境变量配置文件,避免修改根用户的环境定义文件,因为那样可能会造成潜在的危险。$ cd ~ #到用户根目录下$ ls -a #查看所有文件,包含隐藏的文件$ vi .bash_profile #修改用户环境变量文件例如:编辑你的 PATH 声明,其格式为:PATH=$PATH:<PATH 1>:<PATH 2>:<PATH 3>:------:<PATH N>你可以自己加上指定的路径,中间用冒号隔开。
  23. 23. 环境变量更改后,在用户下次登陆时生效。如果想立刻生效,则可执行下面的语句:$source .bash_profile需要注意的是,最好不要把当前路径”./”放到 PATH 里,这样可能会受到意想不到的攻击。完成后,可以通过$ echo $PATH 查看当前的搜索路径。这样定制后,就可以避免频繁的启动位于 shell 搜索的路径之外的程序了。5、学习总结1.Linux 的变量种类按变量的生存周期来划分,Linux 变量可分为两类:1. 永久的:需要修改配置文件,变量永久生效。2. 临时的:使用 export 命令行声明即可,变量在关闭 shell 时失效。2.设置变量的三种方法1. 在/etc/profile 文件中添加变量【对所有用户生效(永久的)】
  24. 24. 用 VI 在文件/etc/profile 文件中增加变量,该变量将会对 Linux 下所有用户有效,并且是“永久的”。例如:编辑/etc/profile 文件,添加 CLASSPATH 变量# vi /etc/profileexport CLASSPATH=./Java_HOME/lib;$JAVA_HOME/jre/lib注:修改文件后要想马上生效还要运行# source /etc/profile 不然只能在下次重进此用户时生效。2. 在用户目录下的.bash_profile 文件中增加变量【对单一用户生效(永久的)】用 VI 在用户目录下的.bash_profile 文件中增加变量,改变量仅会对当前用户有效,并且是“永久的”。例如:编辑 guok 用户目录(/home/guok)下的.bash_profile$ vi /home/guok/.bash.profile添加如下内容:
  25. 25. export CLASSPATH=./JAVA_HOME/lib;$JAVA_HOME/jre/lib注:修改文件后要想马上生效还要运行$ source /home/guok/.bash_profile 不然只能在下次重进此用户时生效。3. 直接运行 export 命令定义变量【只对当前 shell(BASH)有效(临时的)】在 shell 的命令行下直接使用[export 变量名=变量值]定义变量,该变量只在当前的shell(BASH)或其子 shell(BASH)下是有效的,shell 关闭了,变量也就失效了,再打开新 shell 时就没有这个变量,需要使用的话还需要重新定义。Cassandra文章分类 :数据库Cassandra下载http://www.apache.org/dyn/closer.cgi?path=/cassandra/0.5.1/apache-cassandra-0.5.1-bin.tar.gzapache-cassandra-0.5.1 自 带 的 hector-0.5.0-7.jar 有 严 重 的 性 能 问 题 , 需 要 修 改 成hector-0.5.1-9.jar
  26. 26. 资源http://cassandra.apache.org/http://wiki.apache.org/cassandra/FrontPage部署http://kauu.net/2010/02/27/cassandra%E5%88%9D%E4%BD%93%E9%AA%8C/192.168.2.79/home/bmb/apache-cassandra-0.5.1DataModal 设计对同一行的所有列,可以定义根据列名的排序规则(即保存规则)。当保存某个用户相对应的朋友的时候,可以用朋友的加入时间作为一个一个的列名,列按照时间倒序拍。这样很容易获得用户最新的朋友。测试,Keyspace1 的 Standard1 的列按照 BytesType 进行排序,不管按照什么 set顺序,get_slice 都会获得,a,b,c 的顺序<ColumnFamily CompareWith="BytesType" Name="Standard1" />set Keyspace1.Standard1[jsmith][c] = cset Keyspace1.Standard1[jsmith][a] = aset Keyspace1.Standard1[jsmith][b] = b
  27. 27. Super columnsSuper columns are a great way to store one-to-many indexes to other records: makethe sub column names TimeUUIDs (or whatever youd like to use to sort the index),and have the values be the foreign key.不如某个用户的好友,Sub column name 是好友加入时间,Sub column value 是好友的 ID,可以作为外键关联好友的信息表。复合 Key 可以等效 Super Columns,列名为时间Alternatively, we could preface the status keys with the user key, which has less temporal locality.If we used user_id:status_id as the status key, we could do range queries on the user fragmentto get tweets-by-user, avoiding the need for a user_timeline super column.In column-orientation, the column names are the data列名 TimeUUID,列值 JSON 格式,可以解决一些问题http://blog.evanweaver.com/articles/2009/07/06/up-and-running-with-cassandra/Twitter 怎样使用 Cassandra,Twitter 的 Data Model,Blog 的 Data Modelhttp://arin.me/blog/wtf-is-a-supercolumn-cassandra-data-modelDigg 提供的一个完整例子http://wiki.apache.org/cassandra/DataModelhttp://wiki.apache.org/cassandra/CassandraLimitationshttp://www.hellodba.net/2010/02/cassandra.html(中文翻译,有出入)介绍 Twitter 的 Data Modal,有借鉴意义修改 Schema 定义, 2 次重启https://issues.apache.org/jira/browse/CASSANDRA-44
  28. 28. 动态创建 Column Falimy,在不重启服务器下http://github.com/NZKoz/cassandra_object启动单个节点的 Cluster安装 JDK 6 tar -zxvf cassandra-$VERSION.tgz cd cassandra-$VERSION sudo mkdir -p /var/log/cassandra sudo chown -R `whoami` /var/log/cassandra sudo mkdir -p /var/lib/cassandra sudo chown -R `whoami` /var/lib/cassandra修改/bin/cassandra.in.sh 里面的启动端口(-Dcom.sun.management.jmxremote.port=8080) bin/cassandra -f查看日志 tail -f /var/log/cassandra/system.log客户端连接cd /home/bmb/apache-cassandra-0.5.1bin/cassandra-cli --host 192.168.2.79 --port 9160 cassandra> set Keyspace1.Standard1[jsmith][first] = John Value inserted. cassandra> set Keyspace1.Standard1[jsmith][last] = Smith Value inserted. cassandra> set Keyspace1.Standard1[jsmith][age] = 42 Value inserted. cassandra> get Keyspace1.Standard1[jsmith] (column=age, value=42; timestamp=1249930062801) (column=first, value=John; timestamp=1249930053103) (column=last, value=Smith; timestamp=1249930058345)
  29. 29. Returned 3 rows. cassandra>Java 客户端原始 Thrifthttp://apache.freelamp.com/incubator/thrift/0.2.0-incubating/thrift-0.2.0-incubating.tar.gz封装http://github.com/charliem/OCM手动编译 Java Thriftcd D:7gPersonalResourcesArchitectureCassandrathrift-0.2.0libjavaanthectorhttp://prettyprint.me/2010/02/23/hector-a-java-cassandra-client/http://github.com/rantav/hector/downloadsOCMhttp://github.com/charliem/OCM/downloadsGit下载 Githttp://kernel.org/pub/software/scm/git/git-1.7.0.3.tar.gz安装cd /home/bmb/apache-cassandra-0.5.1/git-1.7.0.3./configuremakemake install
  30. 30. Git 客户端http://msysgit.googlecode.com/files/msysGit-fullinstall-1.7.0.2-preview20100309.exeD:7gPersonalResourcesArchitectureCassandramsysgitmsysgit git-cmd.batCheck out OCMgit clone http://github.com/charliem/OCM.githttp://tortoisegit.googlecode.com/files/TortoiseGit-1.3.6.0-32bit.msi集群配置http://pan-java.javaeye.com/blog/604672192.168.5.11/u/iic/bmb/apache-cassandra-0.5.1修改 conf 下面的文件/var/log/cassandra 成/u/iic/bmb/apache-cassandra-0.5.1/log/var/lib/cassandra 成/u/iic/bmb/apache-cassandra-0.5.1/log修改 bin/cassandra 的 Java_homeexport JAVA_HOME=/u/iic/bmb/jdk6192.168.5.12 (目录配置同 5.11,都以 2.79 为 Seed)注意:部署集群的时候,不能把 5.11 整个目录搬到 5.12 上,不然他们 Token 一样,会导致Ring 路 5.11 和 5.12 重复。解决方法:删除 data 和 commit 目录。还有所有的 IP 必须配置成绝对 IP,如果配 Localhost,会使 Ring 不完整192.168.2.79/home/bmb/apache-cassandra-0.5.1 bin/cassandra -f
  31. 31. OCM 的使用定义数据结构:D:7gPersonalResourcesArchitectureCassandraClientOCMCompilerOCMSpecSample.txt通过 com.kissintellignetsystems.ocm.compiler.Compiler 类,提供以下的命令行参数,生成 Java 对象:"OCMSpecSample.txt", "keyspace1", "Java", "mynamespace", "output/"测试例子:D:7gPersonalResourcesArchitectureCassandraClientOutputLanguagesJavaTestHarnessCreatTest.javaget keyspace1.Users[charlie]bin/cassandra-cli --host 192.168.2.79 --port 9160bin/cassandra-cli --host 192.168.5.11 --port 9160bin/cassandra-cli --host 192.168.5.12 --port 9160查看集群的节点信息bin/nodeprobe -host localhost -port 8090 ringHadoop & Cassandrausing Hadoop to Cassandra through Binary Memtablehttp://github.com/lenn0x/Cassandra-Hadoop-
  32. 32. BMT/blob/master/src/java/org/digg/CassandraBulkLoader.javahttp://blog.csdn.net/wdwbw/archive/2010/03/10/5366739.aspxhttp://www.roadtofailure.com/2009/10/29/hbase-vs-cassandra-nosql-battle/Cassandra 是一个开源的分布式数据库,结合了 Dynamo 的 Key/Value 与 Bigtable 的面向列的特点。Cassandra 的特点如下:1.灵活的 schema:不需要象数据库一样预先设计 schema,增加或者删除字段非常方便(on thefly)。2.支持 range 查询:可以对 Key 进行范围查询。3.高可用,可扩展:单点故障不影响集群服务,可线性扩展。我们可以将 Cassandra 的数据模型想象成一个四维或者五维的 Hash。ColumnColumn 是 Cassandra 中最小的数据单元。它是一个 3 元的数据类型,包含:name,value 和timestamp。将一个 Column 用 JSON 的形式表现出来如下:{ // 这是一个 column 2: name: "逖靖寒的世界", 3: value: "gpcuster@gmali.com", 4: timestamp: 123456789 5: }为了简单起见,我们可以忽略 timestamp。就把 column 想象成一个 name/value 即可。注意,这里提到的 name 和 value 都是 byte[]类型的,长度不限。SuperColumn我们可以将 SuperColumn 想象成 Column 的数组,它包含一个 name,以及一系列相应的 Column。将一个 SuperColumn 用 JSON 的形式表现如下:
  33. 33. 1: { // 这是一个 SuperColumn 2: name: "逖靖寒的世界", 3: // 包含一系列的 Columns 4: value: { 5: street: {name: "street", value: "1234 x street", timestamp: 123456789}, 6: city: {name: "city", value: "san francisco", timestamp: 123456789}, 7: zip: {name: "zip", value: "94107", timestamp: 123456789}, 8: } 9: }Columns 和 SuperColumns 都是 name 与 value 的组合。最大的不同在于 Column 的 value 是一个“string”,而 SuperColumn 的 value 是 Columns 的 Map。还有一点需要注意的是:SuperColumn’本身是不包含 timestamp 的。ColumnFamilyColumnFamily 是一个包含了许多 Row 的结构,你可以将它想象成 RDBMS 中的 Table。每一个 Row 都包含有 client 提供的 Key 以及和该 Key 关联的一系列 Column。我们可以看看结构:1: UserProfile = { // 这是一个 ColumnFamily 2: phatduckk: { // 这是对应 ColumnFamily 的 key 3: // 这是 Key 下对应的 Column 4: username: "gpcuster", 5: email: "gpcuster@gmail.com", 6: phone: "6666" 7: }, // 第一个 row 结束 8: ieure: { // 这是 ColumnFamily 的另一个 key 9: //这是另一个 Key 对应的 column 10: username: "pengguo", 11: email: "pengguo@live.com", 12: phone: "888" 13: age: "66" 14: }, 15: }ColumnFamily 的类型可以为 Standard,也可以是 Super 类型。我们刚刚看到的那个例子是一个 Standard 类型的 ColumnFamily。Standard 类型的 ColumnFamily 包含了一系列的 Columns(不是 SuperColumn)。
  34. 34. Super 类型的 ColumnFamily 包含了一系列的 SuperColumn,但是并不能像 SuperColumn 那样包含一系列 Standard ColumnFamily。这是一个简单的例子:1: AddressBook = { // 这是一个 Super 类型的 ColumnFamily 2: phatduckk: { // key 3: friend1: {street: "8th street", zip: "90210", city: "Beverley Hills",state: "CA"}, 4: John: {street: "Howard street", zip: "94404", city: "FC", state: "CA"}, 5: Kim: {street: "X street", zip: "87876", city: "Balls", state: "VA"}, 6: Tod: {street: "Jerry street", zip: "54556", city: "Cartoon", state:"CO"}, 7: Bob: {street: "Q Blvd", zip: "24252", city: "Nowhere", state: "MN"}, 8: ... 9: }, // row 结束 10: ieure: { // key 11: joey: {street: "A ave", zip: "55485", city: "Hell", state: "NV"}, 12: William: {street: "Armpit Dr", zip: "93301", city: "Bakersfield", state:"CA"}, 13: }, 14: }KeyspaceKeyspace 是我们的数据最外层,你所有的 ColumnFamily 都属于某一个 Keyspace。一般来说,我们的一个程序应用只会有一个 Keyspace。简单测试我们将 Cassandra 运行起来以后,启动命令行,执行如下操作:cassandra> set Keyspace1.Standard1[jsmith][first] = JohnValue inserted.cassandra> set Keyspace1.Standard1[jsmith][last] = SmithValue inserted.cassandra> set Keyspace1.Standard1[jsmith][age] = 42Value inserted.这个时候,Cassandra 中就已经有 3 条数据了。其中插入数据的各个字段含义如下:
  35. 35. 接下来,我们执行查询操作:cassandra> get Keyspace1.Standard1[jsmith] (column=age, value=42; timestamp=1249930062801) (column=first, value=John; timestamp=1249930053103) (column=last, value=Smith; timestamp=1249930058345)Returned 3 rows.这样,我们就可以将之前插入的数据查询出来了。排序有一点需要明确,我们使用 Cassandra 的时候,数据在写入的时候就已经排好顺序了。在某一个 Key 内的所有 Column 都是按照它的 Name 来排序的。我们可以在 storage-conf.xml 文件中指定排序的类型。目前 Cassandra 提供的排序类型有:BytesType, UTF8Type,LexicalUUIDType, TimeUUIDType,AsciiType,和 LongType。现在假设你的原始数据如下:{name: 123, value: "hello there"},{name: 832416, value: "kjjkbcjkcbbd"},{name: 3, value: "101010101010"},{name: 976, value: "kjjkbcjkcbbd"}当我们 storage-conf.xml 文件中指定排序的类型为 LongType 时:<!-- ColumnFamily 在 storage-conf.xml 中定义--><ColumnFamily CompareWith="LongType" Name="CF_NAME_HERE"/>排序后的数据就是这样的:
  36. 36. {name: 3, value: "101010101010"},{name: 123, value: "hello there"},{name: 976, value: "kjjkbcjkcbbd"},{name: 832416, value: "kjjkbcjkcbbd"}如果我们指定排序的类型为 UTF8Type<!-- ColumnFamily 在 storage-conf.xml 中定义--><ColumnFamily CompareWith="UTF8Type" Name="CF_NAME_HERE"/>排序后的数据就是这样的:{name: 123, value: "hello there"},{name: 3, value: "101010101010"},{name: 832416, value: "kjjkbcjkcbbd"},{name: 976, value: "kjjkbcjkcbbd"}大家可以看到,指定的排序类型不一样,排序的结果也是完全不同的。对于 SuperColumn,我们有一个额外的排序维度,所以我们可以指定 CompareSubcolumnsWith 来进行另一个维度的排序类型。假设我们的原始数据如下:{ // first SuperColumn from a Row name: "workAddress", // and the columns within it value: { street: {name: "street", value: "1234 x street"}, city: {name: "city", value: "san francisco"}, zip: {name: "zip", value: "94107"} }},{ // another SuperColumn from same Row name: "homeAddress", // and the columns within it value: { street: {name: "street", value: "1234 x street"}, city: {name: "city", value: "san francisco"}, zip: {name: "zip", value: "94107"}
  37. 37. }}然后我们定义 CompareSubcolumnsWith 和 CompareWith 的排序类型都是 UTF8Type,那么排序后的结果为:{ // this ones first b/c when treated as UTF8 strings { // another SuperColumn from same Row // This Row comes first b/c "homeAddress" is before "workAddress" name: "homeAddress", // the columns within this SC are also sorted by their names too value: { // see, these are sorted by Column name too city: {name: "city", value: "san francisco"}, street: {name: "street", value: "1234 x street"}, zip: {name: "zip", value: "94107"} } }, name: "workAddress", value: { // the columns within this SC are also sorted by their names too city: {name: "city", value: "san francisco"}, street: {name: "street", value: "1234 x street"}, zip: {name: "zip", value: "94107"} }}再额外提一句,Cassandra 的排序功能是允许我们自己实现的,只要你继承org.apache.cassandra.db.marshal.IType 就可以了。参考文档WTF is a SuperColumn? An Intro to the Cassandra Data ModelDataModel

×