`
ahuaxuan
  • 浏览: 639527 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

深入浅出cassandra 2 第一个可以运行的例子

阅读更多

 

/**
   * author: ahuaxuan(张荣华)
   * date 2010-2-25
   */

深入浅出cassandra 2 第一个可以运行的例子

在上一篇文章中,我们成功的建立了一个可以cassandra的实例,同时也让它成功的运行起来,下面的工作就是让我们来简单的操作一下这个
号称分布式的号称第二代的数据库系统。

 

本文主要关注两个部分,
1. 怎么写一个最简单cassandra的sample
2. 怎么去分析这个最简单的sample背后隐含的含义



步骤一:
首先我们创建一个工程,然后将cassandra/lib目录下的包,导入到我们的工程中。

步骤二:
创建一个类,内容如下:
/**
 * @author: ahuaxuan(张荣华)
 * @date: 2010-2-8 10:28:02
 * @version: $$id$$
 */
public class SampleOne {
    static Cassandra.Client cassandraClient;


    private static void init() throws TTransportException {
        String server = "localhost";
        int port = 9160;

        /* 首先指定cassandra server的地址 */
        TTransport socket = new TSocket(server, port);
        System.out.println(" connected to " + server + ":" + port + ".");


        /* 指定通信协议为二进制流协议 */
        TBinaryProtocol binaryProtocol = new TBinaryProtocol(socket, false, false);
        cassandraClient = new Cassandra.Client(binaryProtocol);


        /* 建立通信连接 */
        socket.open();
    }


    public static void main(String[] args) throws TException, TimedOutException, InvalidRequestException, UnavailableException, NotFoundException {
        /* 初始化连接 */
        init();


        /* 选择需要操作的Keyspaces, 可以理解成数据库的表 */
        String keyspace= "Keyspace1";
        String row = "row007";


        /* 创建一个column path */
        ColumnPath col = new ColumnPath("Standard1", null, "ahuaxuan".getBytes());


        /* 执行插入操作,指定keysapce, row, col, 和数据内容, 后面两个参数一个是timestamp, 另外一个是consistency_level
          * timestamp是用来做数据一致性保证的, 而consistency_level是用来控制数据分布的策略,前者的理论依据是bigtable, 后者的理论依据是dynamo
          */
        cassandraClient.insert(keyspace, row, col, "val1".getBytes(), 1, 1);

        /* 取出刚刚塞进去的值,取值的流程和插入的流程类似,也需要指定keyspace, row, col, 最后一个参数是consistency_level */
        Column column = cassandraClient.get(keyspace, row, col, 1).column;

        System.out.println("read row " + row);
        System.out.println("column name" + new String(column.name));
        System.out.println("column value" + ":" + new String(column.value));
        System.out.println("column timestamp" + ":" + (column.timestamp));
    }
}
 

 

好了,代码写到这里,例子里流程非常简单,而且ahuaxuan在例子中也加入了很多注释,估计童鞋们也大概了解了这个cassandra是怎么做insert和get的了

现在可以执行这段代码了,不出意外的话,你们会得到如下结果:

read row row007
column nameahuaxuan
column value: first cassandra sample of ahuaxuan
column timestamp:1

上面说到例子的流程很简单,代码也很少,但是ahuaxuan写这个例子并不只是闲得发慌,也不是无聊得没事可做,真正的目的在于理解这个例子背后的一些模型。

从刚才的这段代码里,估计给大家留下最多烦恼的就是keyspace, row, column, timestamp和consistency_level, 
前面四个概念(keyspace, row, column, timestamp)和数据的存储相关,熟悉的同学估计都知道,这个是来源于bigtable的概念。
而consistency_level则是控制数据分布策略的。由于我们现在的例子只是最简单的而且没有在集群环境下的一个例子,所以consistency_level这个东西我们放在后面,我们先来讲讲
keyspace, row, column, timestamp这四个东西是个什么东西。

1. 首先我们来说说keyspace是个什么玩意
打开storage-conf.xml,找到<Keyspaces>这个xml节点,我们可以看到一段对keyspace的说明, 如下:

ColumnFamily在cassandra中概念最接近关系型数据库中的表。而keyspace则是一堆ColumnFamily的集合。如果说ColumnFamily是表,那么我们可以将keyspace称之库

我们来看一段简单的配置。

 

<Keyspaces>
    <Keyspace Name="Keyspace1">
      <ColumnFamily CompareWith="BytesType" Name="Standard1"/>
      <ColumnFamily CompareWith="UTF8Type" Name="Standard2"/>
      <ColumnFamily CompareWith="TimeUUIDType" Name="StandardByUUID1"/>
      <ColumnFamily ColumnType="Super"
                    CompareWith="UTF8Type"
                    CompareSubcolumnsWith="UTF8Type"
                    Name="Super1"
                    Comment="A column family with supercolumns, whose column and subcolumn names are UTF8 strings"/>
    </Keyspace>
    <Keyspace Name="ahuaxuan">
      <ColumnFamily CompareWith="BytesType" Name="test1"/>
      <ColumnFamily CompareWith="UTF8Type" Name="test2"/>
      <ColumnFamily ColumnType="Super"
                    CompareWith="UTF8Type"
                    CompareSubcolumnsWith="UTF8Type"
                    Name="Super1"
                    Comment="A column family with supercolumns, whose column and subcolumn names are UTF8 strings"/>
    </Keyspace>
  </Keyspaces>
 


这段配置表示我们的cassandra中有多个keyspace, 而每个keyspace下又有多个ColumnFamily.

在回头看一下我们的代码是如何使用ColumnFamily的呢?
 /* 创建一个column path */
        ColumnPath col = new ColumnPath("Standard1", null, "ahuaxuan".getBytes());
 
这行代码指定了我们要数据存放到哪个ColumnFamily中去, 这里的Standard1就是Keyspace1中的第一个ColumnFamily.

但是我们还有一个问题:
cassandraClient.insert(keyspace, row, col, "val1".getBytes(), 1, 1);
 
这行代码中第三个参数才是ColumnPath, 第一个参数是keyspace, 两者之间还夹着一个row, 那么row是一个什么样的角色呢?

to be continued.





 

12
0
分享到:
评论
8 楼 ahuaxuan 2010-06-12  
lqw8668 写道
楼主用的哪个版本啊?我用0.6.2好像有问题

0.5, cassandra版本升级的时候, api改动较大
7 楼 lqw8668 2010-06-12  
楼主用的哪个版本啊?我用0.6.2好像有问题
6 楼 ahuaxuan 2010-05-09  
cmzx3444 写道
Keyspaces相当于数据库吧,ColumnFamily才像个表

是的, 它的配置文件中是这样描述的. cf是一个多层的hash结构,并不是二维的,这个和bigtable不太一样,所以开始我把cf也看作表了.其实它如果硬要和db比较的话还不太好比
5 楼 cmzx3444 2010-05-08  
Keyspaces相当于数据库吧,ColumnFamily才像个表
4 楼 waterdh 2010-03-17  
waterdh 写道
那个hector客户端太烂了,从连接池borrow一个连接和release一个连接都要4s多,难道是我没用好?

作者已经修复这一bug,不过还没发布新版本jar。
貌似是CassandraClientPoolImpl中这行turl = address.getHostName(); 引起的问题。
3 楼 waterdh 2010-03-16  
那个hector客户端太烂了,从连接池borrow一个连接和release一个连接都要4s多,难道是我没用好?
2 楼 zhangcheng 2010-03-05  
yangfuchao418 写道
呵呵 ,楼主联系方式是多少,我也正在测试cassandra和hbase

yangfuchao418 写道
呵呵 ,楼主联系方式是多少,我也正在测试cassandra和hbase


我最近也在做cassandra,你测试得如何啊?

HBase倒是没看太多~cassandra做了几个例子
1 楼 yangfuchao418 2010-02-26  
呵呵 ,楼主联系方式是多少,我也正在测试cassandra和hbase

相关推荐

    Mastering.Apache.Cassandra.2nd.Edition.1784392618

    Title: Mastering Apache Cassandra, 2nd Edition Author: Nishant Neeraj Length: 322 pages Edition: 2 Language: English Publisher: Packt Publishing Publication Date: 2015-02-27 ISBN-10: 1784392618 ISBN-...

    cassandra-operator,apache-cassandra的kubernetes算子.zip

    Cassandra-Operator是针对Apache Cassandra在Kubernetes集群中部署和管理的一个开源项目。它使得在Kubernetes环境中运行和扩展Cassandra数据库变得更加简单和自动化。在这个压缩包“cassandra-operator,apache-...

    ycsb cassandra 压力测试工具

    总结,YCSB Cassandra 压力测试工具是一个强大的组合,它可以帮助我们评估 Cassandra 数据库在复杂工作负载下的性能表现,从而为系统设计和优化提供关键数据。通过深入理解 YCSB 的工作原理和 Cassandra 的架构特性...

    深入研究Cassandra后重读Dynamo

    ### 深入研究Cassandra后重读Dynamo——架构对比与反思 #### 一、引言 在深入了解Cassandra数据库之后,再次回顾Amazon Dynamo的论文,本文旨在探讨两者之间的架构差异及其潜在的问题。经过一系列的实践经验和理论...

    Cassandra实战.pdf

    在深入探讨《Cassandra实战.pdf》这一资源时,我们聚焦于Apache Cassandra数据库系统的全面解析与实践应用,这是一份详尽的技术文档,旨在为数据库管理员、开发者以及对分布式数据库技术感兴趣的专业人士提供深入...

    cassandra cli 命令 大全

    Cassandra CLI是Apache Cassandra数据库系统的一个命令行工具,它提供了与Cassandra集群交互的能力,包括连接到远程节点、创建或更新模式(schema)、设置和检索记录及列,以及查询节点和集群元数据。这个工具主要...

    spring boot与cassandra集成,使用JPA方式。

    在本文中,我们将深入探讨如何将Spring Boot框架与Cassandra数据库集成,并利用Java Persistence API (JPA) 进行数据操作。Spring Boot以其简洁的配置和开箱即用的特性,已经成为Java开发中的首选框架之一。而...

    Cassandra The Definitive Guide(2nd) azw3

    Cassandra The Definitive Guide(2nd) 英文azw3 第2版 本资源转载自网络,如有侵权,请联系上传者或csdn删除 本资源转载自网络,如有侵权,请联系上传者或csdn删除

    DevCenter cassandra客户端

    2. **CQL编辑器**:DevCenter内置了一个Cassandra查询语言(CQL)的编辑器,提供了代码补全、语法高亮和错误检查功能,帮助用户编写和执行CQL命令。这使得对数据库的操作变得更加高效和准确。 3. **数据浏览**:...

    Cassandra JDBC Driver 0.8.2

    2. **遵循 JDBC 规范**:该驱动程序按照 JDBC(Java Database Connectivity)规范设计,提供了一个标准化的接口,使得开发人员能够在不深入了解 Cassandra 本身的底层机制的情况下,使用熟悉的 JDBC 代码来操作 ...

    Cassandra实战

    2. 分布式:Cassandra是一个分布式数据库,数据分布在多个节点上,提高了数据的可用性和可靠性。 3. 无中心:Cassandra没有中心节点,每个节点都是平等的,任何一个节点的失败都不会影响系统的整体运行。这提高了...

    java NoSql Cassandra hector

    2. 创建Cluster和Session:初始化Cassandra连接需要创建一个Cluster对象,表示一组Cassandra节点。然后,基于Cluster创建Session,用于执行实际的数据库操作。 ```java Cluster cluster = HFactory.getCluster(...

    cassandra2.1.2 JDBC最少依赖jar

    2. **JDBC桥接层**:为了使Cassandra兼容JDBC,DataStax提供了一个桥接模块,将Cassandra驱动的核心功能包装成JDBC接口,使得传统的JDBC应用程序可以透明地使用Cassandra。 3. **Gson库**:可能用于JSON序列化和反...

    Cassandra分布式架构与源代码分析

    Cassandra可以调整节点布局来避免某一个数据中心起火,备用的数据中心将至少有每条记录的完全复制。 1.6 范围查询 Cassandra支持范围查询,可以设置键的范围来查询。 1.7 列表数据结构 Cassandra支持列表数据...

    Cassandra权威指南.pdf

    根据给定文件信息,虽然没有提供《Cassandra权威指南》电子书的直接内容,但是可以从标题和描述中推断出一些知识点。由于文本仅提供了电子书的标题、描述和部分内容链接,并且表明了电子书是关于Cassandra的,因此...

    Learning_Apache_Cassandra

    2. 创建第一个数据表的步骤,包括表格结构的设计、表和列选项的设置以及数据类型的使用。例如,文档提到了Cassandra支持的数据类型,如字符串、整数、浮点数、日期时间、UUID、布尔值和二进制大对象(BLOB)。 3. ...

    Cassandra_概要指南

    Cassandra作为一个高可靠性的大规模分布式存储系统,它的诞生背景源于互联网Web2.0应用的飞速发展以及云计算技术的普及。随着用户数据量的爆炸性增长和对数据处理速度的需求日益提升,传统的关系型数据库在面对超大...

    cassandra入门项目源代码

    【标题】:“Cassandra入门项目源代码”是一个针对初学者的教程项目,旨在帮助开发者了解如何在Eclipse环境中使用Spring Data框架与EasyRest风格来操作Cassandra数据库和Lucene搜索引擎。这个项目提供了一整套实践性...

    Laravel开发-cassandra

    对于Cassandra,可以创建一个继承自`N3m3s\LaravelCassandra\Eloquent\Model`的模型: ```php namespace App\Models; use N3m3s\LaravelCassandra\Eloquent\Model; class ExampleModel extends Model { ...

Global site tag (gtag.js) - Google Analytics